DbFramework/t/15catalog.t

157 lines
4.7 KiB
Perl
Raw Permalink Normal View History

2021-02-08 00:21:11 +08:00
# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl test.pl'
use strict;
use Test;
use t::Config;
BEGIN { plan tests => scalar(@t::Config::drivers) * 5 }
require 't/util.pl';
use DbFramework::Catalog;
use DbFramework::Util;
use DbFramework::DataModel;
use DbFramework::Table;
my($t1,$t2);
for my $driver ( @t::Config::drivers ) {
if ( $driver eq 'mSQL' ) {
$t1 = qq{CREATE TABLE foo (foo integer not null,
bar char(10) not null,
baz char(10),
quux integer,
foobar text(10)
)};
$t2 = qq{CREATE TABLE bar (foo integer not null,
# foreign key (foo)
foo_foo integer,
foo_bar char(10),
bar integer
)};
} elsif ( $driver eq 'mysql' ) {
$t1 = qq{CREATE TABLE foo (foo integer not null auto_increment,
bar varchar(10) not null,
baz varchar(10) not null,
quux integer not null,
foobar text,
KEY foo(bar,baz),
KEY bar(baz,quux),
PRIMARY KEY (foo,bar)
)};
$t2 = qq{CREATE TABLE bar (foo integer not null auto_increment,
# foreign key (foo)
foo_foo integer not null,
foo_bar varchar(10) not null,
bar integer,
KEY f_foo(foo_foo,foo_bar),
PRIMARY KEY (foo)
)};
} elsif ( $driver eq 'Pg' ) {
$t1 = qq{CREATE TABLE foo (foo integer not null,
bar varchar(10) not null,
baz varchar(10) not null,
quux integer not null,
foobar text,
UNIQUE(bar,baz),
UNIQUE(baz,quux),
PRIMARY KEY (foo,bar)
)};
$t2 = qq{CREATE TABLE bar (foo integer not null,
-- foreign key (foo)
foo_foo integer not null,
foo_bar varchar(10) not null,
bar integer,
UNIQUE(foo_foo,foo_bar),
PRIMARY KEY (foo)
)};
} elsif ( $driver eq 'Sybase' ) {
$t1 = qq{CREATE TABLE foo (foo numeric(10,0) identity not null,
bar varchar(10) not null,
baz varchar(10) not null,
quux integer not null,
foobar text,
UNIQUE (bar,baz),
UNIQUE (baz,quux),
PRIMARY KEY (foo,bar)
)};
$t2 = qq{CREATE TABLE bar (foo numeric(10,0) identity not null,
-- foreign key (foo)
foo_foo integer not null,
foo_bar varchar(10) not null,
bar integer,
UNIQUE (foo_foo,foo_bar),
PRIMARY KEY (foo)
)};
} elsif ( $driver eq 'CSV' ) {
$t1 = qq{CREATE TABLE foo (foo integer,
bar varchar(10),
baz varchar(10),
quux integer,
foobar varchar(255)
)};
$t2 = qq{CREATE TABLE bar (foo integer,
foo_foo integer,
foo_bar varchar(10),
bar integer
)};
} else { # ODBC syntax for auto increment is IDENTITY(seed,increment)
$t1 = qq{CREATE TABLE foo (foo integer not null identity(0,1),
bar varchar(10) not null,
baz varchar(10) not null,
quux integer not null,
foobar text,
KEY foo(bar,baz),
KEY bar(baz,quux),
PRIMARY KEY (foo,bar)
)};
$t2 = qq{CREATE TABLE bar (foo integer not null identity(0,1),
# foreign key (foo)
foo_foo integer not null,
foo_bar varchar(10) not null,
bar integer,
KEY f_foo(foo_foo,foo_bar),
PRIMARY KEY (foo)
)};
}
foo($driver,'foo',$t1,'bar',$t2);
}
sub foo($$$$$) {
my($driver,$t1,$t1_sql,$t2,$t2_sql) = @_;
my($catalog_db,$c_dsn,$c_u,$c_p) = connect_args($driver,'catalog');
my($test_db,$dsn,$u,$p) = connect_args($driver,'test');
my $c = new DbFramework::Catalog($c_dsn,$c_u,$c_p);
ok(1);
my $dbh = DbFramework::Util::get_dbh($dsn,$u,$p);
$dbh->{PrintError} = 0; # don't warn about dropping non-existent tables
drop_create($test_db,$t1,undef,$t1_sql,$dbh);
drop_create($test_db,$t2,undef,$t2_sql,$dbh);
my $dm = new DbFramework::DataModel($test_db,$dsn,$u,$p);
$dm->init_db_metadata($c_dsn,$c_u,$c_p);
# test primary keys
my $foo_table = $dm->collects_table_h_byname('foo');
ok($foo_table->is_identified_by->as_sql,'PRIMARY KEY (foo,bar)');
# test keys
my @keys = @{$foo_table->is_accessed_using_l};
my($bar,$foo);
if ( $driver eq 'mSQL' ) {
($bar,$foo) = (1,0);
} else {
($bar,$foo) = (0,1);
}
ok($keys[$bar]->as_sql,'KEY bar (baz,quux)');
ok($keys[$foo]->as_sql,'KEY foo (bar,baz)');
# test foreign keys
my $bar_table = $dm->collects_table_h_byname('bar');
my $fk = $bar_table->has_foreign_keys_h_byname('f_foo');
ok($fk->as_sql,'KEY f_foo (foo_foo,foo_bar)');
$dbh->disconnect;
}