X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=t%2Fdb_colinfo.t;h=3b20f8dcd463376f32fc158047e0a184b5bb58d5;hb=eff1964310020ec4399e77ebed0ce47113056c69;hp=cb1b4361e1f91c0b6629a6a517b2c7390097cba8;hpb=abb63001d28afe34e807dbd4449feaded558c528;p=maypole.git diff --git a/t/db_colinfo.t b/t/db_colinfo.t index cb1b436..3b20f8d 100755 --- a/t/db_colinfo.t +++ b/t/db_colinfo.t @@ -1,8 +1,17 @@ #!/usr/bin/perl -w use Test::More; -use lib 'ex'; # Where BeerDB should live +use Data::Dumper; +use DBI; +use lib 'examples'; # Where BeerDB should live BEGIN { - plan tests => 26; + my $drh = eval { + DBI->install_driver("mysql"); + my @databases = DBI->data_sources("mysql"); + die "couldn't connect to mysql" unless (@databases); + }; + warn "error : $@ \n" if ($@); + my $testcount = ($@) ? 45 : 64 ; + plan tests => $testcount; } $db = 'test'; @@ -12,7 +21,7 @@ $table = "beer_test"; $sql = " create table $table ( id integer auto_increment primary key, - name char(30), + name char(30) NOT NULL default 'noname', url varchar(120), score smallint(2), price decimal(3,2), @@ -22,7 +31,7 @@ create table $table ( tasted date NOT NULL, created timestamp default CURRENT_TIMESTAMP, modified datetime default NULL, - style mediumint(8) default 1, + style mediumint(8) NOT NULL default 1, brewery integer default NULL );"; @@ -32,22 +41,41 @@ create table $table ( brewery => 'int', style => 'int', name => 'char', - url => 'varchar', + url => 'varchar', tasted => 'date', created => '(time|time)', modified => '(date|time)', score => 'smallint', price => 'decimal', abv => 'varchar', - notes => '(text|blob)', + notes => '(text|blob)', image => 'blob', ); +# correct defaults +%correct_defaults = ( + created => 'CURRENT_TIMESTAMP', + modified => undef, + style => 1, + name => 'noname', +); + +# correct nullables +%correct_nullables = ( + brewery => 1, + modified => 1, + style => 0, + name => 0, + tasted => 0, +); + + # Runs tests on column_* method of $class using %correct data hash # usage: run_method_tests ($class, $method, %correct); sub run_method_tests { ($class, $method, %correct) = @_; for $col (sort keys %correct) { + $val = $class->$method($col); # Hacks for various val types @@ -56,6 +84,7 @@ sub run_method_tests { my $correct = $correct{$col}; like($val, qr/$correct/,"$method $col is $val"); } + } @@ -63,51 +92,80 @@ sub run_method_tests { # Make test class package BeerDB::BeerTestmysql; -use base Maypole::Model::CDBI; +use base qw(Maypole::Model::CDBI Class::DBI); package main; $DB_Class = 'BeerDB::BeerTestmysql'; -my $drh = DBI->install_driver("mysql"); -my %databases = map { $_ => 1 } $drh->func('localhost', 3306, '_ListDBs'); +my $drh = eval { DBI->install_driver("mysql"); }; +$err = $@; +if ($err) { + $skip_msg = "no driver for MySQL"; +} else { + my %databases = map { $_ => 1 } $drh->func('localhost', 3306, '_ListDBs'); -unless ($databases{test}) { - my $rc = $drh->func("createdb", 'test', 'admin'); -} + unless ($databases{test}) { + my $rc = $drh->func("createdb", 'test', 'admin'); + } -%databases = map { $_ => 1 } $drh->func('localhost', 3306, '_ListDBs'); + %databases = map { $_ => 1 } $drh->func('localhost', 3306, '_ListDBs'); -if ($databases{test}) { - eval {$DB_Class->connection("dbi:mysql:$db", "$dbuser", "$dbpasswd"); }; - $err = $@; - $skip_msg = "Could not connect to MySQL using database 'test', username 'test', and password ''. Check privileges and try again."; -} else { - $err = 'no test db'; - $skip_msg = "Could not connect to MySQL using database 'test' as it doesn't exist, sorry"; + if ($databases{test}) { + eval {$DB_Class->connection("dbi:mysql:$db", "$dbuser", "$dbpasswd"); }; + $err = $@; + $skip_msg = "Could not connect to MySQL using database 'test', username 'test', and password ''. Check privileges and try again."; + } else { + $err = 'no test db'; + $skip_msg = "Could not connect to MySQL using database 'test' as it doesn't exist, sorry"; + } } - -$skip_howmany = 13; +$skip_howmany = 22; SKIP: { skip $skip_msg, $skip_howmany if $err; $DB_Class->db_Main->do("drop table if exists $table;"); $DB_Class->db_Main->do($sql); - $DB_Class->table($table); + $DB_Class->table($table); + $DB_Class->columns(All => keys %correct_types); + $DB_Class->columns(Primary => 'id'); run_method_tests($DB_Class,'column_type', %correct_types); - #run_method_tests($DB_Class,'column_default', %correct_defaults); - #run_method_tests($DB_Class,'column_nullable', %correct_defaults); + run_method_tests($DB_Class,'column_default', %correct_defaults); + run_method_tests($DB_Class,'column_nullable', %correct_nullables); + + + foreach my $colname ( @{$DB_Class->required_columns()} ) { + ok($correct_nullables{$colname} == 0,"nullable column $colname is required (via required_columns)"); + } + + foreach my $colname (keys %correct_nullables) { + ok( $DB_Class->column_required($colname) == !$correct_nullables{$colname}, "nullable column $colname is required (via column_required)" ) + } + + ok($DB_Class->required_columns([qw/style name tasted score/]), 'set required column(s)'); + + foreach my $colname ( @{$DB_Class->required_columns()} ) { + ok($correct_nullables{$colname} == 0 || $colname eq 'score',"nullable or required column $colname is required (via required_columns)" ); + } + + foreach my $colname (keys %correct_nullables) { + if ($colname eq 'score') { + ok( $DB_Class->column_required($colname) == 0, "nullable column $colname is required (via column_required)"); + } else { + ok( $DB_Class->column_required($colname) == !$correct_nullables{$colname}, "nullable column $colname is required (via column_required)"); + } + } }; # SQLite test package BeerDB::BeerTestsqlite; -use base Maypole::Model::CDBI; +use base qw(Maypole::Model::CDBI Class::DBI); package main; +use Cwd; $DB_Class = 'BeerDB::BeerTestsqlite'; $err = undef; -#unlink "t/test.db"; if ( !-e "t/test.db" ) { eval {make_sqlite_db($sql)}; $err = $@; @@ -116,7 +174,9 @@ if ( !-e "t/test.db" ) { } unless ($err) { my $driver = sqlite_driver(); - eval { $DB_Class->connection("dbi:$driver:dbname='t/test.db'");}; + warn "using driver : $driver"; + my $cwd = cwd; + eval { $DB_Class->connection("dbi:$driver:dbname=$cwd/t/test.db");}; $err = $@; } @@ -126,15 +186,33 @@ $skip_howmany = 13; SKIP: { skip $skip_msg, $skip_howmany if $err; $DB_Class->table($table); + $DB_Class->columns(All => keys %correct_types); + $DB_Class->columns(Primary => 'id'); +#use Data::Dumper; run_method_tests($DB_Class,'column_type', %correct_types); + # No support default #run_method_tests($DB_Class,'column_default', %correct_defaults); - #run_method_tests($DB_Class,'column_nullable', %correct_defaults); + # I think sqlite driver allows everything to be nullable. + #run_method_tests($DB_Class,'column_nullable', %correct_nullables); + + ok($DB_Class->required_columns([qw/score style name tasted/]), 'set required column(s)'); + + + foreach my $colname ( @{$DB_Class->required_columns()} ) { + ok($correct_nullables{$colname} == 0 || $colname eq 'score',"nullable or required column $colname is required (via required_columns)" ); + } + + foreach my $colname (keys %correct_nullables) { + if ($colname eq 'score') { + ok( $DB_Class->column_required($colname) == 0, "nullable column $colname is required (via column_required)"); + } else { + ok( $DB_Class->column_required($colname) == !$correct_nullables{$colname}, "nullable column $colname is required (via column_required)"); + } + } }; - - # Helper methods, TODO -- put these somewhere where tests can use them. # returns "best" available sqlite driver or dies