allow creating multiple related columns when updating or creating new records
[catagits/Catalyst-Controller-DBIC-API.git] / t / rpc / create.t
index d3b249d..a12e766 100644 (file)
@@ -1,5 +1,3 @@
-use 5.6.0;
-
 use strict;
 use warnings;
 
@@ -80,6 +78,59 @@ my $producer_create_url   = "$base/api/rpc/producer/create";
     );
 }
 
+# test create of single related row
+{
+    my $test_data = $json->encode(
+        { name => 'Futuristic Artist', cds => { 'title' => 'snarky cd name', year => '3030' } }
+    );
+    my $req = PUT($artist_create_url);
+    $req->content_type('text/x-json');
+    $req->content_length(
+        do { use bytes; length($test_data) }
+    );
+    $req->content($test_data);
+    $mech->request($req);
+    cmp_ok( $mech->status, '==', 200, 'request with single related row okay' );
+    my $count = $schema->resultset('Artist')
+        ->search({ name => 'Futuristic Artist' })
+        ->count;
+    ok( $count, 'record with related object created' );
+    $count = $schema->resultset('Artist')
+        ->search_related('cds', { title => 'snarky cd name' })
+        ->count;
+    ok( $count, "record's related object created" );
+}
+
+# test create of multiple related rows
+{
+    my $test_data = $json->encode(
+        { name => 'Futuristic Artist 2',
+          cds => [
+            { 'title' => 'snarky cd name 2', year => '3030' },
+            { 'title' => 'snarky cd name 3', year => '3030' },
+          ]
+        }
+    );
+
+    my $req = PUT($artist_create_url);
+    $req->content_type('text/x-json');
+    $req->content_length(
+        do { use bytes; length($test_data) }
+    );
+    $req->content($test_data);
+    $mech->request($req);
+    cmp_ok( $mech->status, '==', 200, 'request with multiple related rows okay' );
+    my $count = $schema->resultset('Artist')
+        ->search({ name => 'Futuristic Artist 2' })
+        ->count;
+    ok( $count, 'record with related object created' );
+    $count = $schema->resultset('Artist')
+        ->search_related('cds', { title => ['snarky cd name 2','snarky cd name 3'] })
+        ->count;
+    ok( $count == 2, "record's related objects created" ) or explain diag $count;
+
+}
+
 # test stash config handling
 {
     my $req = POST(
@@ -104,17 +155,29 @@ my $producer_create_url   = "$base/api/rpc/producer/create";
 
 # test create returns an error as expected when passing invalid value
 {
-    my $long_string = '-' x 1024;
+    my $data = {
+        producerid => 100,
+        name       => 'Producer',
+    };
 
-    my $req = POST(
-        $producer_create_url,
-        {   producerid => $long_string,
-            name       => $long_string,
-        },
-        'Accept' => 'text/json'
+    my $req = POST($producer_create_url, $data, 'Accept' => 'text/json');
+    $mech->request( $req, $content_type );
+    cmp_ok( $mech->status, '==', 200, 'create with pk value ok' );
+    my $response = $json->decode( $mech->content );
+    is_deeply(
+        $response,
+        { success => 'true', list => $data },
+        'json for producer with pk value ok'
     );
+    # try to insert same data again, as this seems to be the only way to
+    # force an insert to fail for SQLite.
+    # It accepts too long columns as well as wrong datatypes without errors.
+    # The bind with datatype of newer DBIC versions numifies non-integer
+    # values passed as pk value too.
     $mech->request( $req, $content_type );
     cmp_ok( $mech->status, '==', 400, 'invalid param value produces error' );
 }
 
+# test creating record with multiple related-rows
+
 done_testing();