X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F96multi_create.t;h=82429083102c792c7bfdf7bbfd425e9fc3e62e97;hb=aac494465422ef611b92ccafffcdd426d52d8b25;hp=810b6eb68de3a9f150f5869d41c7c7f40346bb3d;hpb=2bc3c81ece67606c69cfb18eaeebb05db706d776;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/t/96multi_create.t b/t/96multi_create.t index 810b6eb..8242908 100644 --- a/t/96multi_create.t +++ b/t/96multi_create.t @@ -51,6 +51,23 @@ my $newartist2 = $schema->resultset('Artist')->find_or_create({ name => 'Fred 3' is($newartist2->name, 'Fred 3', 'Created new artist with cds via find_or_create'); +my $artist2 = $schema->resultset('Artist')->create({ + name => 'Fred 3', + cds => [ + { + title => 'Music to code by', + year => 2007, + }, + ], + cds_unordered => [ + { + title => 'Music to code by', + year => 2007, + }, + ] + }); + +is($artist2->in_storage, 1, 'artist with duplicate rels inserted okay'); CREATE_RELATED1 :{ @@ -161,3 +178,134 @@ SPECIAL_CASE2: { is($a->name, 'Pink Floyd', 'Artist insertion ok'); is($a->cds && $a->cds->first->title, 'The Wall', 'CD insertion ok'); } + +## Create foreign key col obj including PK +## See test 20 in 66relationships.t +my $new_cd_hashref = { + cdid => 27, + title => 'Boogie Woogie', + year => '2007', + artist => { artistid => 17, name => 'king luke' } + }; + +my $cd = $schema->resultset("CD")->find(1); + +is($cd->artist->id, 1, 'rel okay'); + +my $new_cd = $schema->resultset("CD")->create($new_cd_hashref); +is($new_cd->artist->id, 17, 'new id retained okay'); + + +# Test find or create related functionality +my $new_artist = $schema->resultset("Artist")->create({ artistid => 18, name => 'larry' }); + +eval { + $schema->resultset("CD")->create({ + cdid => 28, + title => 'Boogie Wiggle', + year => '2007', + artist => { artistid => 18, name => 'larry' } + }); +}; +is($@, '', 'new cd created without clash on related artist'); + +# Make sure exceptions from errors in created rels propogate +eval { + my $t = $schema->resultset("Track")->new({ cd => { artist => undef } }); + #$t->cd($t->new_related('cd', { artist => undef } ) ); + #$t->{_rel_in_storage} = 0; + $t->insert; +}; +like($@, qr/cd.artist may not be NULL/, "Exception propogated properly"); + +# Test multi create over many_to_many +$schema->resultset('CD')->create ({ + artist => $new_artist, + title => 'Warble Marble', + year => '2009', + cd_to_producer => [ + { producer => { name => 'Cowboy Neal' } }, + ], +}); + +my $m2m_cd = $schema->resultset('CD')->search ({ title => 'Warble Marble'}); +is ($m2m_cd->count, 1, 'One CD row created via M2M create'); +is ($m2m_cd->first->producers->count, 1, 'CD row created with one producer'); +is ($m2m_cd->first->producers->first->name, 'Cowboy Neal', 'Correct producer row created'); + +# and some insane multicreate +# (should work, despite the fact that no one will probably use it this way) + +# first count how many rows do we have + +my $counts; +$counts->{$_} = $schema->resultset($_)->count for qw/Artist CD Genre Producer/; + +# do the crazy create +$schema->resultset('CD')->create ({ + artist => $new_artist, + title => 'Greatest hits 1', + year => '2012', + genre => { + name => '"Greatest" collections', + }, + cd_to_producer => [ + { + producer => { + name => 'Dirty Harry', + producer_to_cd => [ + { + cd => { + artist => { + name => 'Dirty Harry himself', + }, + title => 'Greatest hits 2', + year => 2012, + genre => { + name => '"Greatest" collections', + }, + }, + }, + { + cd => { + artist => { + name => 'Dirty Harry himself', + }, + title => 'Greatest hits 3', + year => 2012, + genre => { + name => '"Greatest" collections', + }, + }, + }, + { + cd => { + artist => $new_artist, + title => 'Greatest hits 4', + year => 2012, + }, + }, + ], + }, + }, + ], +}); + +is ($schema->resultset ('Artist')->count, $counts->{Artist} + 1, 'One new artists created'); # even though the 'name' is not uniquely constrained find_or_create will arguably DWIM +is ($schema->resultset ('Genre')->count, $counts->{Genre} + 1, 'One additional genre created'); +is ($schema->resultset ('Producer')->count, $counts->{Producer} + 1, 'One new producer'); +is ($schema->resultset ('CD')->count, $counts->{CD} + 4, '4 new CDs'); + +my $harry_cds = $schema->resultset ('Artist')->single ({name => 'Dirty Harry himself'})->cds; +is ($harry_cds->count, 2, 'Two CDs created by Harry'); +ok ($harry_cds->single ({title => 'Greatest hits 2'}), 'First CD name correct'); +ok ($harry_cds->single ({title => 'Greatest hits 3'}), 'Second CD name correct'); + +my $harry_productions = $schema->resultset ('Producer')->single ({name => 'Dirty Harry'}) + ->search_related ('producer_to_cd', {})->search_related ('cd', {}); +is ($harry_productions->count, 4, 'All 4 CDs are produced by Harry'); +is ($harry_productions->search ({ year => 2012 })->count, 4, 'All 4 CDs have the correct year'); + +my $hits_genre = $schema->resultset ('Genre')->single ({name => '"Greatest" collections'}); +ok ($hits_genre, 'New genre row found'); +is ($hits_genre->cds->count, 3, 'Three of the new CDs fall into the new genre');