X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Flib%2Fdbixcsl_common_tests.pm;h=92583bb7c0e4b753381f857d5aaea34f7fca4707;hb=4cbddf8d2c6f28d894d0497a31e7c2503e0e7994;hp=b209fe8dc67b3896d871684c8ec502c5040152bf;hpb=23d1f36b238acbceaa1ecd71743ce4f5b8e8fd7e;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/t/lib/dbixcsl_common_tests.pm b/t/lib/dbixcsl_common_tests.pm index b209fe8..92583bb 100644 --- a/t/lib/dbixcsl_common_tests.pm +++ b/t/lib/dbixcsl_common_tests.pm @@ -38,6 +38,8 @@ sub new { # Optional extra tables and tests $self->{extra} ||= {}; + $self->{date_datatype} ||= 'DATE'; + # Not all DBS do SQL-standard CURRENT_TIMESTAMP $self->{default_function} ||= "CURRENT_TIMESTAMP"; $self->{default_function_def} ||= "TIMESTAMP DEFAULT $self->{default_function}"; @@ -59,11 +61,12 @@ sub _monikerize { sub _custom_column_info { my ( $table_name, $column_name, $column_info ) = @_; + $table_name = lc ( $table_name ); $column_name = lc ( $column_name ); - if ( $table_name eq 'loader_test11' - and $column_name eq 'loader_test10' + if ( $table_name eq 'loader_test35' + and $column_name eq 'an_int' ){ return { is_numeric => 1 } } @@ -82,7 +85,7 @@ sub _custom_column_info { sub run_tests { my $self = shift; - plan tests => 155 + ($self->{extra}->{count} || 0); + plan tests => 157 + ($self->{extra}->{count} || 0); $self->create(); @@ -173,6 +176,8 @@ sub setup_schema { $warn_count++ for grep /^Bad table or view/, @loader_warnings; + $warn_count++ for grep /stripping trailing _id/, @loader_warnings; + my $vendor = $self->{vendor}; $warn_count++ for grep /${vendor}_\S+ has no primary key/, @loader_warnings; @@ -188,7 +193,7 @@ sub setup_schema { $warn_count++; is(scalar(@loader_warnings), $warn_count, "Expected loader warning") or diag @loader_warnings; - is(grep(/loader_test9 has no primary key/, @loader_warnings), 1, + is(grep(/loader_test9 has no primary key/i, @loader_warnings), 1, "Missing PK warning"); } } @@ -205,8 +210,13 @@ sub test_schema { my $classes = {}; foreach my $source_name ($schema_class->sources) { my $table_name = $schema_class->source($source_name)->from; + $monikers->{$table_name} = $source_name; $classes->{$table_name} = $schema_class . q{::} . $source_name; + + # some DBs (Firebird) uppercase everything + $monikers->{lc $table_name} = $source_name; + $classes->{lc $table_name} = $schema_class . q{::} . $source_name; } my $moniker1 = $monikers->{loader_test1s}; @@ -219,12 +229,12 @@ sub test_schema { my $rsobj2 = $conn->resultset($moniker2); check_no_duplicate_unique_constraints($class2); - my $moniker23 = $monikers->{LOADER_TEST23}; - my $class23 = $classes->{LOADER_TEST23}; + my $moniker23 = $monikers->{LOADER_TEST23} || $monikers->{loader_test23}; + my $class23 = $classes->{LOADER_TEST23} || $classes->{loader_test23}; my $rsobj23 = $conn->resultset($moniker1); - my $moniker24 = $monikers->{LoAdEr_test24}; - my $class24 = $classes->{LoAdEr_test24}; + my $moniker24 = $monikers->{LoAdEr_test24} || $monikers->{loader_test24}; + my $class24 = $classes->{LoAdEr_test24} || $classes->{loader_test24}; my $rsobj24 = $conn->resultset($moniker2); my $moniker35 = $monikers->{loader_test35}; @@ -363,7 +373,7 @@ sub test_schema { ); SKIP: { - skip $self->{skip_rels}, 96 if $self->{skip_rels}; + skip $self->{skip_rels}, 99 if $self->{skip_rels}; my $moniker3 = $monikers->{loader_test3}; my $class3 = $classes->{loader_test3}; @@ -589,40 +599,33 @@ sub test_schema { is($obj27->loader_test29, undef, "Undef for missing one-to-one row"); # test outer join for nullable referring columns: - SKIP: { - skip "unreliable column info from db driver",11 unless - ($class32->column_info('rel2')->{is_nullable}); - - ok($class32->column_info('rel1')->{is_foreign_key}, 'Foreign key detected'); - ok($class32->column_info('rel2')->{is_foreign_key}, 'Foreign key detected'); - - my $obj32 = $rsobj32->find(1,{prefetch=>[qw/rel1 rel2/]}); - my $obj34 = $rsobj34->find( - 1,{prefetch=>[qw/loader_test33_id_rel1 loader_test33_id_rel2/]} - ); - my $skip_outerjoin; - isa_ok($obj32,$class32) or $skip_outerjoin = 1; - isa_ok($obj34,$class34) or $skip_outerjoin = 1; - - ok($class34->column_info('id')->{is_foreign_key}, 'Foreign key detected'); - ok($class34->column_info('rel1')->{is_foreign_key}, 'Foreign key detected'); - ok($class34->column_info('rel2')->{is_foreign_key}, 'Foreign key detected'); - - SKIP: { - skip "Pre-requisite test failed", 4 if $skip_outerjoin; - my $rs_rel31_one = $obj32->rel1; - my $rs_rel31_two = $obj32->rel2; - isa_ok($rs_rel31_one, $class31); - is($rs_rel31_two, undef); - - my $rs_rel33_one = $obj34->loader_test33_id_rel1; - my $rs_rel33_two = $obj34->loader_test33_id_rel2; - - isa_ok($rs_rel33_one,$class33); - is($rs_rel33_two, undef); - - } - } + is $class32->column_info('rel2')->{is_nullable}, 1, + 'is_nullable detection'; + + ok($class32->column_info('rel1')->{is_foreign_key}, 'Foreign key detected'); + ok($class32->column_info('rel2')->{is_foreign_key}, 'Foreign key detected'); + + my $obj32 = $rsobj32->find(1,{prefetch=>[qw/rel1 rel2/]}); + my $obj34 = $rsobj34->find( + 1,{prefetch=>[qw/loader_test33_id_rel1 loader_test33_id_rel2/]} + ); + isa_ok($obj32,$class32); + isa_ok($obj34,$class34); + + ok($class34->column_info('id')->{is_foreign_key}, 'Foreign key detected'); + ok($class34->column_info('rel1')->{is_foreign_key}, 'Foreign key detected'); + ok($class34->column_info('rel2')->{is_foreign_key}, 'Foreign key detected'); + + my $rs_rel31_one = $obj32->rel1; + my $rs_rel31_two = $obj32->rel2; + isa_ok($rs_rel31_one, $class31); + is($rs_rel31_two, undef); + + my $rs_rel33_one = $obj34->loader_test33_id_rel1; + my $rs_rel33_two = $obj34->loader_test33_id_rel2; + + isa_ok($rs_rel33_one,$class33); + is($rs_rel33_two, undef); # from Chisel's tests... my $moniker10 = $monikers->{loader_test10}; @@ -638,19 +641,6 @@ sub test_schema { ok($class10->column_info('loader_test11')->{is_foreign_key}, 'Foreign key detected'); ok($class11->column_info('loader_test10')->{is_foreign_key}, 'Foreign key detected'); - # Added by custom_column_info - ok($class11->column_info('loader_test10')->{is_numeric}, 'is_numeric detected'); - - is($class36->column_info('a_date')->{locale},'de_DE','locale is correct'); - is($class36->column_info('a_date')->{timezone},'Europe/Berlin','locale is correct'); - - ok($class36->column_info('b_char_as_data')->{inflate_datetime},'inflate_datetime detected'); - is($class36->column_info('b_char_as_data')->{locale},'de_DE','locale is correct'); - is($class36->column_info('b_char_as_data')->{timezone},'Europe/Berlin','locale is correct'); - - ok($class36->column_info('c_char_as_data')->{inflate_date},'inflate_date detected'); - is($class36->column_info('c_char_as_data')->{locale},'de_DE','locale is correct'); - is($class36->column_info('c_char_as_data')->{timezone},'Europe/Berlin','locale is correct'); my $obj10 = $rsobj10->create({ subject => 'xyzzy' }); @@ -681,7 +671,7 @@ sub test_schema { } SKIP: { - skip 'This vendor cannot do inline relationship definitions', 8 + skip 'This vendor cannot do inline relationship definitions', 9 if $self->{no_inline_rels}; my $moniker12 = $monikers->{loader_test12}; @@ -703,6 +693,9 @@ sub test_schema { isa_ok( $obj13->id, $class12 ); isa_ok( $obj13->loader_test12, $class12); isa_ok( $obj13->dat, $class12); + + my $obj12 = $rsobj12->find(1); + isa_ok( $obj12->loader_test13, $class13 ); } SKIP: { @@ -726,6 +719,25 @@ sub test_schema { } } + # test custom_column_info and datetime_timezone/datetime_locale + { + my $class35 = $classes->{loader_test35}; + my $class36 = $classes->{loader_test36}; + + ok($class35->column_info('an_int')->{is_numeric}, 'custom_column_info'); + + is($class36->column_info('a_date')->{locale},'de_DE','datetime_locale'); + is($class36->column_info('a_date')->{timezone},'Europe/Berlin','datetime_timezone'); + + ok($class36->column_info('b_char_as_data')->{inflate_datetime},'custom_column_info'); + is($class36->column_info('b_char_as_data')->{locale},'de_DE','datetime_locale'); + is($class36->column_info('b_char_as_data')->{timezone},'Europe/Berlin','datetime_timezone'); + + ok($class36->column_info('c_char_as_data')->{inflate_date},'custom_column_info'); + is($class36->column_info('c_char_as_data')->{locale},'de_DE','datetime_locale'); + is($class36->column_info('c_char_as_data')->{timezone},'Europe/Berlin','datetime_timezone'); + } + # rescan and norewrite test SKIP: { my @statements_rescan = ( @@ -769,6 +781,7 @@ sub test_schema { } $dbh->disconnect; + $conn->storage->disconnect; # needed for Firebird sleep 1; @@ -799,6 +812,8 @@ sub test_schema { } $self->{extra}->{run}->($conn, $monikers, $classes) if $self->{extra}->{run}; + + $conn->storage->disconnect; } sub check_no_duplicate_unique_constraints { @@ -893,7 +908,7 @@ sub create { qq{ CREATE TABLE loader_test36 ( id INTEGER NOT NULL PRIMARY KEY, - a_date DATE, + a_date $self->{date_datatype}, b_char_as_data VARCHAR(100), c_char_as_data VARCHAR(100) ) $self->{innodb}