The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
use strict;

use Test::More tests => 22;

BEGIN {
    use lib qw( ../../CatalystX-CRUD/trunk/lib );
    use_ok('CatalystX::CRUD::Model::RDBO');
    use_ok('CatalystX::CRUD::Object::RDBO');
    use_ok('Rose::DBx::TestDB');
    use_ok('Rose::DB::Object');
}

use lib qw( t/lib );
use Catalyst::Test 'MyApp';
use Data::Dump qw( dump );
use HTTP::Request::Common;

diag( "testing against Catalyst-Runtime version "
        . $Catalyst::Runtime::VERSION );

ok( my $res = request('/foo/test'), "get /foo/test" );

#dump $res->headers;

is( $res->headers->{status}, 200, "get 200" );

ok( $res = request('/foo/1/read'), "get /foo/1/read" );

is( $res->headers->{status}, 200, "get 200" );

ok( $res = request('/foo/1/bars/2/add'), "GET /foo/1/bars/2/add" );

is( $res->headers->{status}, 405, "cannot GET add related" );

# add a new foobar
ok( $res = request( POST( '/foo/1/bars/2/add', [] ) ),
    "POST /foo/1/bars/2/add" );

is( $res->headers->{status}, 204, "POST add related OK" );

# remove an old foobar
ok( $res = request( POST( '/foo/1/bars/1/remove', [] ) ),
    "POST /foo/1/bars/1/remove" );

is( $res->headers->{status}, 204, "POST remove related OK" );

ok( $res = request('/foo/search?id=1&cxc-order=id'),
    "search id=1 with order" );

is_deeply(
    eval $res->content,
    {   limit           => 50,
        offset          => 0,
        plain_query     => { id => [1] },
        plain_query_str => "(id='1')",
        query           => [ "id", 1 ],
        sort_by         => "t1.id ASC",
        sort_order      => [ { id => "ASC" } ],
    },
    "search query with order dir assumed"
);

#dump $res;

ok( $res = request('/foo/search?id=1&cxc-sort=id&cxc-dir=desc'),
    "search id=1 with sort/dir" );

#dump $res;

is_deeply(
    eval $res->content,
    {   limit           => 50,
        offset          => 0,
        plain_query     => { id => [1] },
        plain_query_str => "(id='1')",
        query           => [ "id", 1 ],
        sort_by         => "t1.id DESC",
        sort_order      => [ { id => "DESC" } ],
    },
    "search query with explicit order/dir"
);

ok( $res = request('/foo/search?id=1'), "search id=1 with no sort" );
is_deeply(
    eval $res->content,
    {   limit           => 50,
        offset          => 0,
        plain_query     => { id => [1] },
        plain_query_str => "(id='1')",
        query           => [ "id", 1 ],
        sort_by         => "t1.id DESC",
        sort_order      => [ { id => "DESC" } ],
    },
    "search query with default PK order"
);

# test multiple sort
ok( $res = request('/foo/search?id=1&cxc-order=id+desc+name+asc'),
    "search id=1 with 2-column sort" );

#dump $res->content;

is_deeply(
    eval $res->content,
    {   limit           => 50,
        offset          => 0,
        plain_query     => { id => [1] },
        plain_query_str => "(id='1')",
        query           => [ "id", 1 ],
        sort_by         => "t1.id DESC, t1.name ASC",
        sort_order      => [ { id => "DESC" }, { name => "ASC" } ],
    },
    "multi-sort content"
);