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=d0a916eb89a4d1fb4383b07ab2b5dc032f3109bb;hp=49f0051bb38d6aa209fdac83a21fe79ca3b3e221;hb=257cb2149dd762b4f5af045a7340197296e3e50a;hpb=533075c7cc1bfd0ed993d273314ad46f0d85401b diff --git a/t/rest/update.t b/t/rest/update.t index 49f0051..d0a916e 100644 --- a/t/rest/update.t +++ b/t/rest/update.t @@ -1,5 +1,3 @@ -use 5.6.0; - use strict; use warnings; @@ -10,75 +8,180 @@ my $content_type = [ 'Content-Type', 'application/x-www-form-urlencoded' ]; use RestTest; use DBICTest; -use Test::More tests => 16; +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'); - } + diag 'DBIx::Class warns about a non-numeric id which is ok because we test for that too'; + 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' + ); +} + +{ + 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' ); +} - cmp_ok( $mech->status, '==', 400, 'Update with no keys causes error' ); +{ + 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); - my $response = JSON::Any->Load( $mech->content); - is_deeply( $response->{messages}, ['No valid keys passed'], 'correct message returned' ); + cmp_ok( $mech->status, '==', 200, 'Update with key with value okay' ); - $track->discard_changes; - is_deeply({ $track->get_columns }, \%original_cols, 'no update occurred'); + $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 with database error { - 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 @tracks = $tracks_rs->all; + my @tracks_new_data = map +{ id => $_->id, title => 'Track ' . $_->id }, + @tracks; + # set position column to NULL to force error + $tracks_new_data[0]->{position} = undef; + my $test_data = $json->encode({ list => \@tracks_new_data }); + 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 tracks fails' ); + my $response = $json->decode( $mech->content ); + is( $response->{success}, JSON::false, + 'success property returns unquoted false' ); + like( + $response->{messages}->[0], + qr/a database error has occured/, + 'correct message returned' + ); + + $tracks_rs->reset; + while ( my $track = $tracks_rs->next ) { + isnt( $track->title, 'Track ' . $track->id, 'Title unchanged' ); + } } +# bulk_update existing objects { - my $test_data = JSON::Any->Dump({ title => 'monkey monkey', 'cd' => { year => 2009 } }); - 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' ); + # 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 +{ - $track->discard_changes; - is($track->title, 'monkey monkey', 'Title changed to "monkey monkey"'); - is($track->cd->year, 2009, 'related row updated'); + # 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();