X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Frelationship%2Fcustom.t;h=f79b605d95d95debdfc6e971f88685f3bd2bed3e;hb=c200d94979bde5ac74070d3e898927433b0e667c;hp=a623b4b8f50c9394e337ed306c4799d0c74fd0fa;hpb=8c7c83982c9ec8ebf8674c1100f9103f2af06402;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/t/relationship/custom.t b/t/relationship/custom.t index a623b4b..f79b605 100644 --- a/t/relationship/custom.t +++ b/t/relationship/custom.t @@ -3,6 +3,7 @@ use warnings; use Test::More; use Test::Exception; +use Test::Warn; use lib qw(t/lib); use DBICTest ':DiffSQL'; @@ -159,7 +160,7 @@ lives_ok { # try to create_related a 80s cd throws_ok { $artist->create_related('cds_80s', { title => 'related creation 1' }); -} qr/\QCustom relationship 'cds_80s' not definitive - returns conditions instead of values for column(s): 'year'/, +} qr/\QUnable to complete value inferrence - custom relationship 'cds_80s' on source 'Artist' returns conditions instead of values for column(s): 'year'/, 'Create failed - complex cond'; # now supply an explicit arg overwriting the ambiguous cond @@ -182,7 +183,7 @@ is( # try a specific everything via a non-simplified rel throws_ok { $artist->create_related('cds_90s', { title => 'related_creation 4', year => '2038' }); -} qr/\QRelationship 'cds_90s' does not resolve to a join-free condition fragment/, +} qr/\QRelationship 'cds_90s' on source 'Artist' does not resolve to a join-free condition fragment/, 'Create failed - non-simplified rel'; # Do a self-join last-entry search @@ -273,21 +274,71 @@ is_deeply ( 'Prefetched singles in proper order' ); -# test set_from_related with a belongs_to custom condition -my $cd = $schema->resultset("CD")->find(4); -$artist = $cd->search_related('artist'); -my $track = $schema->resultset("Track")->create( { - trackid => 1, - cd => 3, - position => 99, - title => 'Some Track' -} ); -$track->set_from_related( cd_cref_cond => $cd ); -is ($track->get_column('cd'), 4, 'set from related via coderef cond'); -is_deeply ( - { $track->cd->get_columns }, - { $cd->get_columns }, - 'set from related via coderef cond inflates properly', +# test set_from_related/find_related with a belongs_to custom condition +my $preexisting_cd = $schema->resultset('CD')->find(1); + +my $cd_single_track = $schema->resultset('CD')->create({ + artist => $artist, + title => 'one one one', + year => 2001, + tracks => [{ title => 'uno uno uno' }] +}); + +my $single_track = $cd_single_track->tracks->next; + +is( + $single_track->cd_cref_cond->title, + $cd_single_track->title, + 'Got back the expected single-track cd title', ); +is_deeply + { $schema->resultset('Track')->find({ cd_cref_cond => { cdid => $cd_single_track->id } })->get_columns }, + { $single_track->get_columns }, + 'Proper find with related via coderef cond', +; + +warnings_exist { + is_same_sql_bind( + $single_track->deliberately_broken_all_cd_tracks->as_query, + '( + SELECT me.trackid, me.cd, me.position, me.title, me.last_updated_on, me.last_updated_at + FROM track track__row + JOIN track me + ON me.cd = ? + WHERE track__row.trackid = ? + )', + [ + [{ dbic_colname => "me.cd", sqlt_datatype => "integer" } + => "track__row.cd" ], + [{ dbic_colname => "track__row.trackid", sqlt_datatype => "integer" } + => 19 ], + ], + 'Expected nonsensical JOIN cond', + ), +} qr/\Qrelationship 'deliberately_broken_all_cd_tracks' on source 'Track' specifies equality of column 'cd' and the *VALUE* 'cd' (you did not use the { -ident => ... } operator)/, + 'Warning on 99.9999% malformed custom cond' +; + +$single_track->set_from_related( cd_cref_cond => undef ); +ok $single_track->is_column_changed('cd'); +is $single_track->get_column('cd'), undef, 'UNset from related via coderef cond'; +is $single_track->cd, undef, 'UNset related object via coderef cond'; + +$single_track->discard_changes; + +$single_track->set_from_related( cd_cref_cond => $preexisting_cd ); +ok $single_track->is_column_changed('cd'); +is $single_track->get_column('cd'), 1, 'set from related via coderef cond'; +is_deeply + { $single_track->cd->get_columns }, + { $preexisting_cd->get_columns }, + 'set from related via coderef cond inflates properly', +; + +throws_ok { + local $schema->source('Track')->relationship_info('cd_cref_cond')->{cond} = sub { 1,2,3 }; + $schema->resultset('Track')->find({ cd_cref_cond => {} }); +} qr/\QA custom condition coderef can return at most 2 conditions, but relationship 'cd_cref_cond' on source 'Track' returned extra values: 3/; + done_testing;