X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Controller-DBIC-API.git;a=blobdiff_plain;f=t%2Frest%2Fupdate.t;h=9a6d43959afce1b53ef65a5be0cd43d157df9528;hp=ee5837b9c341e813746101035b6c8f531eddc1f4;hb=0b0bf9111127c9fdad1e456169ec4cdd15b160f9;hpb=d273984026646e5b57c052deef3fcb9121122060 diff --git a/t/rest/update.t b/t/rest/update.t index ee5837b..9a6d439 100644 --- a/t/rest/update.t +++ b/t/rest/update.t @@ -10,74 +10,147 @@ my $content_type = [ 'Content-Type', 'application/x-www-form-urlencoded' ]; use RestTest; use DBICTest; -use Test::More tests => 15; +use Test::More; use Test::WWW::Mechanize::Catalyst 'RestTest'; use HTTP::Request::Common; -use JSON::Any; +use JSON; + +my $json = JSON->new->utf8; my $mech = Test::WWW::Mechanize::Catalyst->new; -ok(my $schema = DBICTest->init_schema(), 'got schema'); +ok( my $schema = DBICTest->init_schema(), 'got schema' ); -my $track = $schema->resultset('Track')->first; +my $track = $schema->resultset('Track')->first; my %original_cols = $track->get_columns; -my $track_update_url = "$base/api/rest/track/" . $track->id; +my $track_url = "$base/api/rest/track/"; +my $track_update_url = $track_url . $track->id; +my $tracks_update_url = $track_url; # test invalid track id caught { - foreach my $wrong_id ('sdsdsdsd', 3434234) { - my $incorrect_url = "$base/api/rest/track/" . $wrong_id; - my $test_data = JSON::Any->Dump({ title => 'value' }); - my $req = POST( $incorrect_url, Content => $test_data ); - $req->content_type('text/x-json'); - $mech->request($req); - - cmp_ok( $mech->status, '==', 400, 'Attempt with invalid track id caught' ); - - my $response = JSON::Any->Load( $mech->content); - like( $response->{messages}->[0], qr/No object found for id/, 'correct message returned' ); - - $track->discard_changes; - is_deeply({ $track->get_columns }, \%original_cols, 'no update occurred'); - } + foreach my $wrong_id ( 'sdsdsdsd', 3434234 ) { + my $incorrect_url = "$base/api/rest/track/" . $wrong_id; + my $test_data = $json->encode( { title => 'value' } ); + my $req = POST( $incorrect_url, Content => $test_data ); + $req->content_type('text/x-json'); + $mech->request($req); + + cmp_ok( $mech->status, '==', 400, + 'Attempt with invalid track id caught' ); + + my $response = $json->decode( $mech->content ); + like( + $response->{messages}->[0], + qr/No object found for id/, + 'correct message returned' + ); + + $track->discard_changes; + is_deeply( + { $track->get_columns }, + \%original_cols, + 'no update occurred' + ); + } } # validation when no params sent { - my $test_data = JSON::Any->Dump({ wrong_param => 'value' }); - my $req = POST( $track_update_url, Content => $test_data ); - $req->content_type('text/x-json'); - $mech->request($req); + my $test_data = $json->encode( { wrong_param => 'value' } ); + my $req = POST( $track_update_url, Content => $test_data ); + $req->content_type('text/x-json'); + $mech->request($req); + + cmp_ok( $mech->status, '==', 400, 'Update with no keys causes error' ); + + my $response = $json->decode( $mech->content ); + is_deeply( $response->{messages}, ['No valid keys passed'], + 'correct message returned' ); + + $track->discard_changes; + is_deeply( + { $track->get_columns }, + \%original_cols, + 'no update occurred' + ); +} - cmp_ok( $mech->status, '==', 400, 'Update with no keys causes error' ); +{ + my $test_data = $json->encode( { title => undef } ); + my $req = POST( $track_update_url, Content => $test_data ); + $req->content_type('text/x-json'); + $mech->request($req); + cmp_ok( $mech->status, '==', 200, 'Update with key with no value okay' ); + + $track->discard_changes; + isnt( $track->title, $original_cols{title}, 'Title changed' ); + is( $track->title, undef, 'Title changed to undef' ); +} - my $response = JSON::Any->Load( $mech->content); - is_deeply( $response->{messages}, ['No valid keys passed'], 'correct message returned' ); +{ + my $test_data = $json->encode( + { title => 'monkey monkey', 'cd' => { year => 2009 } } ); + my $req = POST( $track_update_url, Content => $test_data ); + $req->content_type('text/x-json'); + $mech->request($req); - $track->discard_changes; - is_deeply({ $track->get_columns }, \%original_cols, 'no update occurred'); + cmp_ok( $mech->status, '==', 200, 'Update with key with value okay' ); + + $track->discard_changes; + is( $track->title, 'monkey monkey', 'Title changed to "monkey monkey"' ); + is( $track->cd->year, 2009, 'related row updated' ); } +# bulk_update existing objects { - my $test_data = JSON::Any->Dump({ title => undef }); - my $req = POST( $track_update_url, Content => $test_data ); - $req->content_type('text/x-json'); - $mech->request($req); - cmp_ok( $mech->status, '==', 200, 'Update with key with no value okay' ); - - $track->discard_changes; - isnt($track->title, $original_cols{title}, 'Title changed'); - is($track->title, undef, 'Title changed to undef'); + + # order to get a stable order of rows + my $tracks_rs = + $schema->resultset('Track') + ->search( undef, { order_by => 'trackid', rows => 3 } ); + my $test_data = $json->encode( + { list => [ + map +{ id => $_->id, title => 'Track ' . $_->id }, + $tracks_rs->all + ] + } + ); + my $req = PUT( $tracks_update_url, Content => $test_data ); + $req->content_type('text/x-json'); + $mech->request($req); + cmp_ok( $mech->status, '==', 200, 'Attempt to update three tracks ok' ); + + $tracks_rs->reset; + while ( my $track = $tracks_rs->next ) { + is( $track->title, 'Track ' . $track->id, 'Title changed' ); + } } +# bulk_update nonexisting objects { - my $test_data = JSON::Any->Dump({ title => 'monkey monkey' }); - my $req = POST( $track_update_url, Content => $test_data ); - $req->content_type('text/x-json'); - $mech->request($req); - cmp_ok( $mech->status, '==', 200, 'Update with key with value okay' ); - - $track->discard_changes; - is($track->title, 'monkey monkey', 'Title changed to "monkey monkey"'); + # order to get a stable order of rows + my $test_data = $json->encode( + { list => [ + map +{ id => $_, title => 'Track ' . $_ }, + ( 1000 .. 1002 ) + ] + } + ); + my $req = PUT( $tracks_update_url, Content => $test_data ); + $req->content_type('text/x-json'); + $mech->request($req); + cmp_ok( $mech->status, '==', 400, + 'Attempt to update three nonexisting tracks fails' ); + my $response = $json->decode( $mech->content ); + is( $response->{success}, JSON::false, + 'success property returns unquoted false' ); + like( + $response->{messages}->[0], + qr/No object found for id/, + 'correct message returned' + ); } + +done_testing();