X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=t%2Fdb_colinfo.t;h=ef2466fb002aa067a85aebf2fbed03dcd6008d77;hb=d3bd3060bf3f11775d9f40ee983f71949404f794;hp=ed54fd7de3f94c3f8d5c4810c7a093f11e5132c0;hpb=b550cf6041017b7ba7486661a1a22e592430e962;p=maypole.git diff --git a/t/db_colinfo.t b/t/db_colinfo.t index ed54fd7..ef2466f 100755 --- a/t/db_colinfo.t +++ b/t/db_colinfo.t @@ -2,86 +2,118 @@ use Test::More; use lib 'ex'; # Where BeerDB should live BEGIN { - plan tests => 26; - + plan tests => 44; } $db = 'test'; -$dbuser = 'test'; +$dbuser = 'test'; $dbpasswd = ''; $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), abv varchar(10), - image blob, + image blob, notes text, - tasted date NOT NULL, + tasted date NOT NULL, created timestamp default CURRENT_TIMESTAMP, - modified datetime default NULL, - style mediumint(8) default 1, + modified datetime default NULL, + style mediumint(8) NOT NULL default 1, brewery integer default NULL );"; # correct column types and the ones we test %correct_types = ( - id => 'int(11)', # mysql 4.1 stores this for 'integer' - brewery => 'int(11)', - style => 'mediumint(8)', - name => 'char(30)', - url => 'varchar(120)', - tasted => 'date', - created => 'timestamp', - modified => 'datetime', - score => 'smallint(2)', - price => 'decimal(3,2)', - abv => 'varchar(10)', - notes => 'text', - image => 'blob', + id => 'int', # mysql 4.1 stores this for 'integer' + brewery => 'int', + style => 'int', + name => 'char', + url => 'varchar', + tasted => 'date', + created => '(time|time)', + modified => '(date|time)', + score => 'smallint', + price => 'decimal', + abv => 'varchar', + 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); + ($class, $method, %correct) = @_; + for $col (sort keys %correct) { + $val = $class->$method($col); - # Hacks for various val types - $val = lc $val if $method eq 'column_type'; + # Hacks for various val types + $val = lc $val if $method eq 'column_type'; - is($val, $correct{$col},"$method $col is $val"); - } + my $correct = $correct{$col}; + like($val, qr/$correct/,"$method $col is $val"); + } } - + # mysql test # Make test class package BeerDB::BeerTestmysql; use base Maypole::Model::CDBI; - package main; $DB_Class = 'BeerDB::BeerTestmysql'; -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 privelages and try again."; -$skip_howmany = 13; + +my $drh = DBI->install_driver("mysql"); +my %databases = map { $_ => 1 } $drh->func('localhost', 3306, '_ListDBs'); + +unless ($databases{test}) { + my $rc = $drh->func("createdb", 'test', 'admin'); +} + +%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"; +} + +$skip_howmany = 22; SKIP: { - skip $skip_msg, $skip_howmany if $err; - + 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); 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); }; # SQLite test @@ -92,33 +124,32 @@ package main; $DB_Class = 'BeerDB::BeerTestsqlite'; -#unlink "t/test.db"; +$err = undef; if ( !-e "t/test.db" ) { eval {make_sqlite_db($sql)}; $err = $@; if ($err) { print "Skipping sql tests because couldnt make sqlite test db - because of error $err"; exit; }; + because of error: $err";}; +} +unless ($err) { + my $driver = sqlite_driver(); + eval { $DB_Class->connection("dbi:$driver:dbname='t/test.db'");}; + $err = $@; } -my $driver = sqlite_driver(); -eval { $DB_Class->connection("dbi:$driver:dbname='t/test.db'");}; -$err = $@; -if ($err) { die "CDBI connection error: $err"; } $skip_msg = "Could not connect to SQLite database 't/test.db'"; -$skip_howmany = 13; +$skip_howmany = 22; SKIP: { skip $skip_msg, $skip_howmany if $err; $DB_Class->table($table); 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); }; - - # Helper methods, TODO -- put these somewhere where tests can use them. # returns "best" available sqlite driver or dies