# Optional extra tables and tests
$self->{extra} ||= {};
+ # Not all DBS do SQL-standard CURRENT_TIMESTAMP
+ $self->{default_function} ||= "CURRENT_TIMESTAMP";
+ $self->{default_function_def} ||= "TIMESTAMP DEFAULT $self->{default_function}";
+
return bless $self => $class;
}
sub run_tests {
my $self = shift;
- plan tests => 3 + 135 + ($self->{extra}->{count} || 0);
+ plan tests => 145 + ($self->{extra}->{count} || 0);
$self->create();
$self->drop_tables;
}
+# defined in sub create
+my (@statements, @statements_reltests, @statements_advanced,
+ @statements_advanced_sqlite, @statements_inline_rels,
+ @statements_implicit_rels);
+
sub setup_schema {
my $self = shift;
my @connect_info = @_;
inflect_singular => { fkid => 'fkid_singular' },
moniker_map => \&_monikerize,
debug => $debug,
+ use_namespaces => 0,
dump_directory => $DUMP_DIR,
);
__PACKAGE__->connection(\@connect_info);
};
- ok(!$@, "Loader initialization") or diag $@;
+ ok(!$@, "Loader initialization") or diag $@;
+
+ my $file_count;
+ find sub { return if -d; $file_count++ }, $DUMP_DIR;
+
+ my $expected_count = 35;
+
+ $expected_count += grep /CREATE (?:TABLE|VIEW)/i,
+ @{ $self->{extra}{create} || [] };
+
+ $expected_count -= grep /CREATE TABLE/, @statements_inline_rels
+ if $self->{skip_rels} || $self->{no_inline_rels};
+
+ $expected_count -= grep /CREATE TABLE/, @statements_implicit_rels
+ if $self->{skip_rels} || $self->{no_implicit_rels};
+
+ $expected_count -= grep /CREATE TABLE/, ($self->{vendor} =~ /sqlite/ ? @statements_advanced_sqlite : @statements_advanced), @statements_reltests
+ if $self->{skip_rels};
+
+ is $file_count, $expected_count, 'correct number of files generated';
+
+ exit if $file_count != $expected_count;
my $warn_count = 2;
$warn_count++ if grep /ResultSetManager/, @loader_warnings;
+ $warn_count++ for grep /^Bad table or view/, @loader_warnings;
+
+ my $vendor = $self->{vendor};
+ $warn_count++ for grep /${vendor}_\S+ has no primary key/,
+ @loader_warnings;
+
if($self->{skip_rels}) {
SKIP: {
is(scalar(@loader_warnings), $warn_count, "No loader warnings")
my $class24 = $classes->{LoAdEr_test24};
my $rsobj24 = $conn->resultset($moniker2);
+ my $moniker35 = $monikers->{loader_test35};
+ my $class35 = $classes->{loader_test35};
+ my $rsobj35 = $conn->resultset($moniker35);
+
isa_ok( $rsobj1, "DBIx::Class::ResultSet" );
isa_ok( $rsobj2, "DBIx::Class::ResultSet" );
isa_ok( $rsobj23, "DBIx::Class::ResultSet" );
isa_ok( $rsobj24, "DBIx::Class::ResultSet" );
+ isa_ok( $rsobj35, "DBIx::Class::ResultSet" );
my @columns_lt2 = $class2->columns;
is_deeply( \@columns_lt2, [ qw/id dat dat2/ ], "Column Ordering" );
my ($obj2) = $rsobj2->search({ dat => 'bbb' })->first;
is( $obj2->id, 2 );
+ is(
+ $class35->column_info('a_varchar')->{default_value}, 'foo',
+ 'constant character default',
+ );
+
+ is(
+ $class35->column_info('an_int')->{default_value}, 42,
+ 'constant integer default',
+ );
+
+ is(
+ $class35->column_info('a_double')->{default_value}, 10.555,
+ 'constant numeric default',
+ );
+
+ my $function_default = $class35->column_info('a_function')->{default_value};
+
+ isa_ok( $function_default, 'SCALAR', 'default_value for function default' );
+ is_deeply(
+ $function_default, \$self->{default_function},
+ 'default_value for function default is correct'
+ );
+
SKIP: {
skip $self->{skip_rels}, 96 if $self->{skip_rels};
my $before_digest = $digest->digest;
my $dbh = $self->dbconnect(1);
- $dbh->do($_) for @statements_rescan;
+
+ {
+ # Silence annoying but harmless postgres "NOTICE: CREATE TABLE..."
+ local $SIG{__WARN__} = sub {
+ my $msg = shift;
+ print STDERR $msg unless $msg =~ m{^NOTICE:\s+CREATE TABLE};
+ };
+
+ $dbh->do($_) for @statements_rescan;
+ }
+
$dbh->disconnect;
sleep 1;
$self->{_created} = 1;
my $make_auto_inc = $self->{auto_inc_cb} || sub {};
- my @statements = (
+ @statements = (
qq{
CREATE TABLE loader_test1s (
id $self->{auto_inc_pk},
DaT VARCHAR(32) NOT NULL UNIQUE
) $self->{innodb}
},
+
+ qq{
+ CREATE TABLE loader_test35 (
+ id INTEGER NOT NULL PRIMARY KEY,
+ a_varchar VARCHAR(100) DEFAULT 'foo',
+ an_int INTEGER DEFAULT 42,
+ a_double DOUBLE PRECISION DEFAULT 10.555,
+ a_function $self->{default_function_def}
+ ) $self->{innodb}
+ },
);
- my @statements_reltests = (
+ @statements_reltests = (
qq{
CREATE TABLE loader_test3 (
id INTEGER NOT NULL PRIMARY KEY,
q{ INSERT INTO loader_test34 (id,rel1) VALUES (1,2) },
);
- my @statements_advanced = (
+ @statements_advanced = (
qq{
CREATE TABLE loader_test10 (
id10 $self->{auto_inc_pk},
q{ REFERENCES loader_test11 (id11) }),
);
- my @statements_advanced_sqlite = (
+ @statements_advanced_sqlite = (
qq{
CREATE TABLE loader_test10 (
id10 $self->{auto_inc_pk},
q{ loader_test11 INTEGER REFERENCES loader_test11 (id11) }),
);
- my @statements_inline_rels = (
+ @statements_inline_rels = (
qq{
CREATE TABLE loader_test12 (
id INTEGER NOT NULL PRIMARY KEY,
);
- my @statements_implicit_rels = (
+ @statements_implicit_rels = (
qq{
CREATE TABLE loader_test14 (
id INTEGER NOT NULL PRIMARY KEY,
loader_test2
LOADER_TEST23
LoAdEr_test24
+ loader_test35
/;
my @tables_auto_inc = (
unless($self->{no_implicit_rels}) {
$dbh->do("DROP TABLE $_") for (@tables_implicit_rels);
}
- $dbh->do("DROP TABLE $_") for (@tables_rescan);
}
- $dbh->do("DROP TABLE $_") for (@tables);
+ $dbh->do("DROP TABLE $_") for (@tables, @tables_rescan);
$dbh->do($_) for map { $drop_auto_inc->(@$_) } @tables_auto_inc;
$dbh->disconnect;
}