X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fsearch%2Fpreserve_original_rs.t;h=abb654404b4cece48118d6bb24ca61849625d43b;hb=a9e985b78735ff61e4443139aa510915222cd550;hp=3e59109d9183dfb031b20b5e87a0504260a6bb48;hpb=4086a32559a91ba6f70833fa770054e7bae4000e;p=dbsrgits%2FDBIx-Class.git diff --git a/t/search/preserve_original_rs.t b/t/search/preserve_original_rs.t index 3e59109..abb6544 100644 --- a/t/search/preserve_original_rs.t +++ b/t/search/preserve_original_rs.t @@ -5,14 +5,11 @@ use Test::More; use Test::Exception; use lib qw(t/lib); -use DBIC::SqlMakerTest; -use DBIC::DebugObj; -use DBICTest; -use Data::Dumper; +use DBICTest ':DiffSQL'; -my $schema = DBICTest->init_schema(); +use Storable 'dclone'; -plan tests => 22; +my $schema = DBICTest->init_schema(); # A search() with prefetch seems to pollute an already joined resultset # in a way that offsets future joins (adapted from a test case by Debolaz) @@ -21,38 +18,38 @@ plan tests => 22; # test a real-life case - rs is obtained by an implicit m2m join $cd_rs = $schema->resultset ('Producer')->first->cds; - $attrs = Dumper $cd_rs->{attrs}; + $attrs = dclone( $cd_rs->{attrs} ); $cd_rs->search ({})->all; - is (Dumper ($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after a simple search'); + is_deeply (dclone($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after a simple search'); lives_ok (sub { $cd_rs->search ({'artist.artistid' => 1}, { prefetch => 'artist' })->all; - is (Dumper ($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after search with prefetch'); + is_deeply (dclone($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after search with prefetch'); }, 'first prefetching search ok'); lives_ok (sub { $cd_rs->search ({'artist.artistid' => 1}, { prefetch => 'artist' })->all; - is (Dumper ($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after another search with prefetch') + is_deeply (dclone($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after another search with prefetch') }, 'second prefetching search ok'); # test a regular rs with an empty seen_join injected - it should still work! $cd_rs = $schema->resultset ('CD'); $cd_rs->{attrs}{seen_join} = {}; - $attrs = Dumper $cd_rs->{attrs}; + $attrs = dclone( $cd_rs->{attrs} ); $cd_rs->search ({})->all; - is (Dumper ($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after a simple search'); + is_deeply (dclone($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after a simple search'); lives_ok (sub { $cd_rs->search ({'artist.artistid' => 1}, { prefetch => 'artist' })->all; - is (Dumper ($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after search with prefetch'); + is_deeply (dclone($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after search with prefetch'); }, 'first prefetching search ok'); lives_ok (sub { $cd_rs->search ({'artist.artistid' => 1}, { prefetch => 'artist' })->all; - is (Dumper ($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after another search with prefetch') + is_deeply (dclone($cd_rs->{attrs}), $attrs, 'Resultset attributes preserved after another search with prefetch') }, 'second prefetching search ok'); } @@ -80,10 +77,31 @@ $q{artw_back}{query} = $q{artw_back}{rs}->as_query; for my $s (qw/a2a artw cd artw_back/) { my $rs = $q{$s}{rs}; - lives_ok ( sub { $rs->first }, "first on $s does not throw an exception" ); + lives_ok ( sub { $rs->first }, "first() on $s does not throw an exception" ); - lives_ok ( sub { $rs->count }, "count on $s does not throw an exception" ); + lives_ok ( sub { $rs->count }, "count() on $s does not throw an exception" ); is_same_sql_bind ($rs->as_query, $q{$s}{query}, "$s resultset unmodified (as_query matches)" ); } +# ensure nothing pollutes the attrs of an existing rs +{ + my $fresh = $schema->resultset('CD'); + + isa_ok ($fresh->find(1), 'DBICTest::CD' ); + isa_ok ($fresh->single({ cdid => 1}), 'DBICTest::CD' ); + isa_ok ($fresh->search({ cdid => 1})->next, 'DBICTest::CD' ); + is ($fresh->count({ cdid => 1}), 1 ); + is ($fresh->count_rs({ cdid => 1})->next, 1 ); + + ok (! exists $fresh->{cursor}, 'Still no cursor on fresh rs'); + ok (! exists $fresh->{_attrs}{_last_sqlmaker_alias_map}, 'aliasmap did not leak through' ); + + my $n = $fresh->next; + + # check that we are not testing for deprecated slotnames + ok ($fresh->{cursor}, 'Cursor at expected slot after fire'); + ok (exists $fresh->{_attrs}{_last_sqlmaker_alias_map}, 'aliasmap at expected slot after fire' ); +} + +done_testing;