X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F60core.t;h=2f30ad74b64b86ffd8a8f79752618c15a2d9f068;hb=4baa3b95cf1a0c69079babf37371f346edd08855;hp=da5531fa0e0ec4321a15f0ff593eb0041ed1d15b;hpb=cb566613d90f6a1ff3127641b72cc2f8fc9249d8;p=dbsrgits%2FDBIx-Class.git diff --git a/t/60core.t b/t/60core.t index da5531f..2f30ad7 100644 --- a/t/60core.t +++ b/t/60core.t @@ -1,12 +1,13 @@ +BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) } + use strict; use warnings; use Test::More; use Test::Exception; use Test::Warn; -use lib qw(t/lib); -use DBICTest; -use DBIC::SqlMakerTest; + +use DBICTest ':DiffSQL'; my $schema = DBICTest->init_schema(); @@ -106,7 +107,7 @@ is($new_again->name, 'Man With A Spoon', 'Retrieved correctly'); is($new_again->ID, 'DBICTest::Artist|artist|artistid=4', 'unique object id generated correctly'); -# test that store_column is called once for create() for non sequence columns +# test that store_column is called once for create() for non sequence columns { ok(my $artist = $schema->resultset('Artist')->create({name => 'store_column test'})); is($artist->name, 'X store_column test'); # used to be 'X X store...' @@ -124,13 +125,9 @@ warnings_exist { $schema->resultset('Artist')->search_rs(id => 4) } qr/\Qsearch( %condition ) is deprecated/, 'Deprecation warning on ->search( %condition )'; -# this has been warning for 4 years, killing -throws_ok { - $schema->resultset('Artist')->find(artistid => 4); -} qr|expects either a column/value hashref, or a list of values corresponding to the columns of the specified unique constraint|; - is($schema->resultset("Artist")->count, 4, 'count ok'); + # test find_or_new { my $existing_obj = $schema->resultset('Artist')->find_or_new({ @@ -173,13 +170,13 @@ is_deeply( \@cd, [qw/cdid artist title year genreid single_track/], 'column orde $cd = $schema->resultset("CD")->search({ title => 'Spoonful of bees' }, { columns => ['title'] })->next; is($cd->title, 'Spoonful of bees', 'subset of columns returned correctly'); -$cd = $schema->resultset("CD")->search(undef, { include_columns => [ 'artist.name' ], join => [ 'artist' ] })->find(1); +$cd = $schema->resultset("CD")->search(undef, { '+columns' => [ { name => 'artist.name' } ], join => [ 'artist' ] })->find(1); is($cd->title, 'Spoonful of bees', 'Correct CD returned with include'); is($cd->get_column('name'), 'Caterwauler McCrae', 'Additional column returned'); # check if new syntax +columns also works for this -$cd = $schema->resultset("CD")->search(undef, { '+columns' => [ 'artist.name' ], join => [ 'artist' ] })->find(1); +$cd = $schema->resultset("CD")->search(undef, { '+columns' => [ { name => 'artist.name' } ], join => [ 'artist' ] })->find(1); is($cd->title, 'Spoonful of bees', 'Correct CD returned with include'); is($cd->get_column('name'), 'Caterwauler McCrae', 'Additional column returned'); @@ -200,41 +197,6 @@ $new = $schema->resultset("Track")->new( { $new->update_or_insert; ok($new->in_storage, 'update_or_insert insert ok'); -# test in update mode -$new->title('Insert or Update - updated'); -$new->update_or_insert; -is( $schema->resultset("Track")->find(100)->title, 'Insert or Update - updated', 'update_or_insert update ok'); - -SKIP: { - skip "Tests require " . DBIx::Class::Optional::Dependencies->req_missing_for ('test_dt_sqlite'), 13 - unless DBIx::Class::Optional::Dependencies->req_ok_for ('test_dt_sqlite'); - - # test get_inflated_columns with objects - my $event = $schema->resultset('Event')->search->first; - my %edata = $event->get_inflated_columns; - is($edata{'id'}, $event->id, 'got id'); - isa_ok($edata{'starts_at'}, 'DateTime', 'start_at is DateTime object'); - isa_ok($edata{'created_on'}, 'DateTime', 'create_on DateTime object'); - is($edata{'starts_at'}, $event->starts_at, 'got start date'); - is($edata{'created_on'}, $event->created_on, 'got created date'); - - - # get_inflated_columns w/relation and accessor alias - isa_ok($new->updated_date, 'DateTime', 'have inflated object via accessor'); - my %tdata = $new->get_inflated_columns; - is($tdata{'trackid'}, 100, 'got id'); - isa_ok($tdata{'cd'}, 'DBICTest::CD', 'cd is CD object'); - is($tdata{'cd'}->id, 1, 'cd object is id 1'); - is( - $tdata{'position'}, - $schema->resultset ('Track')->search ({cd => 1})->count, - 'Ordered assigned proper position', - ); - is($tdata{'title'}, 'Insert or Update - updated'); - is($tdata{'last_updated_on'}, '1973-07-19T12:01:02'); - isa_ok($tdata{'last_updated_on'}, 'DateTime', 'inflated accessored column'); -} - throws_ok (sub { $schema->class("Track")->load_components('DoesNotExist'); }, qr!Can't locate DBIx/Class/DoesNotExist.pm!, 'exception on nonexisting component'); @@ -243,7 +205,7 @@ is($schema->class("Artist")->field_name_for->{name}, 'artist name', 'mk_classdat my $search = [ { 'tags.tag' => 'Cheesy' }, { 'tags.tag' => 'Blue' } ]; -my( $or_rs ) = $schema->resultset("CD")->search_rs($search, { join => 'tags', +my $or_rs = $schema->resultset("CD")->search_rs($search, { join => 'tags', order_by => 'cdid' }); is($or_rs->all, 5, 'Joined search with OR returned correct number of rows'); is($or_rs->count, 5, 'Search count with OR ok'); @@ -253,11 +215,13 @@ is ($collapsed_or_rs->all, 4, 'Collapsed joined search with OR returned correct is ($collapsed_or_rs->count, 4, 'Collapsed search count with OR ok'); # make sure sure distinct on a grouped rs is warned about -my $cd_rs = $schema->resultset ('CD') - ->search ({}, { distinct => 1, group_by => 'title' }); -warnings_exist (sub { - $cd_rs->next; -}, qr/Useless use of distinct/, 'UUoD warning'); +{ + my $cd_rs = $schema->resultset ('CD') + ->search ({}, { distinct => 1, group_by => 'title' }); + warnings_exist (sub { + $cd_rs->next; + }, qr/Useless use of distinct/, 'UUoD warning'); +} { my $tcount = $schema->resultset('Track')->search( @@ -284,13 +248,13 @@ warnings_exist (sub { group_by => [ qw/position title/ ] } ); - is($tcount->count, 13, 'multiple column COUNT DISTINCT using column syntax ok'); + is($tcount->count, 13, 'multiple column COUNT DISTINCT using column syntax ok'); } my $tag_rs = $schema->resultset('Tag')->search( [ { 'me.tag' => 'Cheesy' }, { 'me.tag' => 'Blue' } ]); -my $rel_rs = $tag_rs->search_related('cd'); +my $rel_rs = $tag_rs->search_related('cd', {}, { order_by => 'cd.cdid'} ); is($rel_rs->count, 5, 'Related search ok'); @@ -298,8 +262,18 @@ is($or_rs->next->cdid, $rel_rs->next->cdid, 'Related object ok'); $or_rs->reset; $rel_rs->reset; +# at this point there should be no active statements +# (finish() was called everywhere, either explicitly via +# reset() or on DESTROY) +for (keys %{$schema->storage->dbh->{CachedKids}}) { + fail("Unreachable cached statement still active: $_") + if $schema->storage->dbh->{CachedKids}{$_}->FETCH('Active'); +} + my $tag = $schema->resultset('Tag')->search( - [ { 'me.tag' => 'Blue' } ], { cols=>[qw/tagid/] } )->next; + [ { 'me.tag' => 'Blue' } ], + { columns => 'tagid' } +)->next; ok($tag->has_column_loaded('tagid'), 'Has tagid loaded'); ok(!$tag->has_column_loaded('tag'), 'Has not tag loaded'); @@ -335,7 +309,7 @@ ok($schema->storage(), 'Storage available'); my @artsn = $schema->resultset('SourceNameArtists')->search({}, { order_by => 'name DESC' }); is(@artsn, 4, "Four artists returned"); - + # make sure subclasses that don't set source_name are ok ok($schema->source('ArtistSubclass'), 'ArtistSubclass exists'); } @@ -369,24 +343,29 @@ lives_ok (sub { my $newlink = $newbook->link}, "stringify to false value doesn't $schema->source("Artist")->column_info_from_storage(1); $schema->source("Artist")->{_columns_info_loaded} = 0; + my @undef_default = DBIx::Class::_ENV_::STRESSTEST_COLUMN_INFO_UNAWARE_STORAGE + ? () + : ( default_value => undef ) + ; + is_deeply ( $schema->source('Artist')->columns_info, { artistid => { data_type => "INTEGER", - default_value => undef, + @undef_default, is_nullable => 0, size => undef }, charfield => { data_type => "char", - default_value => undef, + @undef_default, is_nullable => 1, size => 10 }, name => { data_type => "varchar", - default_value => undef, + @undef_default, is_nullable => 1, is_numeric => 0, size => 100 @@ -408,7 +387,7 @@ lives_ok (sub { my $newlink = $newbook->link}, "stringify to false value doesn't { artistid => { data_type => "INTEGER", - default_value => undef, + @undef_default, is_nullable => 0, size => undef }, @@ -519,13 +498,45 @@ lives_ok (sub { my $newlink = $newbook->link}, "stringify to false value doesn't } -# make sure we got rid of the compat shims -SKIP: { - skip "Remove in 0.082", 3 if $DBIx::Class::VERSION < 0.082; +# make sure that obsolete handle-based source tracking continues to work for the time being +{ + my $handle = $schema->source('Artist')->handle; - for (qw/compare_relationship_keys pk_depends_on resolve_condition/) { - ok (! DBIx::Class::ResultSource->can ($_), "$_ no longer provided by DBIx::Class::ResultSource"); - } + my $rowdata = { $schema->resultset('Artist')->next->get_columns }; + + my $rs = DBIx::Class::ResultSet->new($handle); + my $rs_result = $rs->next; + isa_ok( $rs_result, 'DBICTest::Artist' ); + is_deeply ( + { $rs_result->get_columns }, + $rowdata, + 'Correct columns retrieved (rset/source link healthy)' + ); + + my $row = DBICTest::Artist->new({ -source_handle => $handle }); + is_deeply( + { $row->get_columns }, + {}, + 'No columns yet' + ); + + # store_column to fool the _orig_ident tracker + $row->store_column('artistid', $rowdata->{artistid}); + $row->in_storage(1); + + $row->discard_changes; + is_deeply( + { $row->get_columns }, + $rowdata, + 'Storage refetch successful' + ); +} + +# test to make sure that calling ->new() on a resultset object gives +# us a row object +{ + my $new_artist = $schema->resultset('Artist')->new({}); + isa_ok( $new_artist, 'DBIx::Class::Row', '$rs->new gives a row object' ); } #------------------------------ @@ -575,4 +586,6 @@ SKIP: { throws_ok { $schema->resultset} qr/resultset\(\) expects a source name/, 'resultset with no argument throws exception'; +throws_ok { $schema->source('Artist')->result_class->new( 'bugger' ) } qr/must be a hashref/; + done_testing;