4 use lib 'ex'; # Where BeerDB should live
15 id integer auto_increment primary key,
16 name char(30) NOT NULL default 'noname',
24 created timestamp default CURRENT_TIMESTAMP,
25 modified datetime default NULL,
26 style mediumint(8) NOT NULL default 1,
27 brewery integer default NULL
30 # correct column types and the ones we test
32 id => 'int', # mysql 4.1 stores this for 'integer'
38 created => '(time|time)',
39 modified => '(date|time)',
43 notes => '(text|blob)',
49 created => 'CURRENT_TIMESTAMP',
56 %correct_nullables = (
65 # Runs tests on column_* method of $class using %correct data hash
66 # usage: run_method_tests ($class, $method, %correct);
67 sub run_method_tests {
68 ($class, $method, %correct) = @_;
69 for $col (sort keys %correct) {
70 # warn "class : $class\n";
71 # warn "ISA : ", join(', ',@BeerDB::BeerTestmysql::ISA);
72 $val = $class->$method($col);
74 # Hacks for various val types
75 $val = lc $val if $method eq 'column_type';
77 my $correct = $correct{$col};
78 like($val, qr/$correct/,"$method $col is $val");
87 package BeerDB::BeerTestmysql;
88 use base qw(Maypole::Model::CDBI Class::DBI);
91 $DB_Class = 'BeerDB::BeerTestmysql';
93 my $drh = eval { DBI->install_driver("mysql"); };
96 $skip_msg = "no driver for MySQL";
98 my %databases = map { $_ => 1 } $drh->func('localhost', 3306, '_ListDBs');
100 unless ($databases{test}) {
101 my $rc = $drh->func("createdb", 'test', 'admin');
104 %databases = map { $_ => 1 } $drh->func('localhost', 3306, '_ListDBs');
106 if ($databases{test}) {
107 eval {$DB_Class->connection("dbi:mysql:$db", "$dbuser", "$dbpasswd"); };
109 $skip_msg = "Could not connect to MySQL using database 'test', username 'test', and password ''. Check privileges and try again.";
112 $skip_msg = "Could not connect to MySQL using database 'test' as it doesn't exist, sorry";
118 skip $skip_msg, $skip_howmany if $err;
119 $DB_Class->db_Main->do("drop table if exists $table;");
120 $DB_Class->db_Main->do($sql);
121 $DB_Class->table($table);
122 $DB_Class->columns(All => keys %correct_types);
123 $DB_Class->columns(Primary => 'id');
124 run_method_tests($DB_Class,'column_type', %correct_types);
125 run_method_tests($DB_Class,'column_default', %correct_defaults);
126 run_method_tests($DB_Class,'column_nullable', %correct_nullables);
131 package BeerDB::BeerTestsqlite;
132 use base qw(Maypole::Model::CDBI Class::DBI);
136 $DB_Class = 'BeerDB::BeerTestsqlite';
139 if ( !-e "t/test.db" ) {
140 eval {make_sqlite_db($sql)};
142 if ($err) { print "Skipping sql tests because couldnt make sqlite test db
143 because of error: $err";};
146 my $driver = sqlite_driver();
147 warn "using driver : $driver";
149 eval { $DB_Class->connection("dbi:$driver:dbname=$cwd/t/test.db");};
153 $skip_msg = "Could not connect to SQLite database 't/test.db'";
157 skip $skip_msg, $skip_howmany if $err;
158 $DB_Class->table($table);
159 $DB_Class->columns(All => keys %correct_types);
160 $DB_Class->columns(Primary => 'id');
162 run_method_tests($DB_Class,'column_type', %correct_types);
164 #run_method_tests($DB_Class,'column_default', %correct_defaults);
165 # I think sqlite driver allows everything to be nullable.
166 #run_method_tests($DB_Class,'column_nullable', %correct_nullables);
171 # Helper methods, TODO -- put these somewhere where tests can use them.
173 # returns "best" available sqlite driver or dies
175 my $driver = 'SQLite';
176 eval { require DBD::SQLite } or do {
177 print "Error loading DBD::SQLite, trying DBD::SQLite2\n";
178 eval {require DBD::SQLite2} ? $driver = 'SQLite2'
179 : die "DBD::SQLite2 is not installed";
185 # make_sqlite_db -- makes an sqlite database from params
186 # usage -- make_sqlite_db($sql [, $dbname ]);
188 my ($sql, $dbname) = @_;
189 die "Must provide SQL string" unless length $sql;
190 $dbname ||= 't/test.db';
191 print "Making SQLite DB $dbname\n";
192 my $driver = sqlite_driver;
194 my $dbh = DBI->connect("dbi:$driver:dbname=$dbname");
196 for my $statement ( split /;/, $sql ) {
197 $statement =~ s/\#.*$//mg; # strip # comments
198 $statement =~ s/auto_increment//g;
199 next unless $statement =~ /\S/;
200 eval { $dbh->do($statement) };
201 die "$@: $statement" if $@;
204 print "Successfully made SQLite DB $dbname\n";