3 use lib 'ex'; # Where BeerDB should live
14 id integer auto_increment primary key,
23 created timestamp default CURRENT_TIMESTAMP,
24 modified datetime default NULL,
25 style mediumint(8) default 1,
26 brewery integer default NULL
29 # correct column types and the ones we test
31 id => 'int', # mysql 4.1 stores this for 'integer'
37 created => '(time|time)',
38 modified => '(date|time)',
42 notes => '(text|blob)',
46 # Runs tests on column_* method of $class using %correct data hash
47 # usage: run_method_tests ($class, $method, %correct);
48 sub run_method_tests {
49 ($class, $method, %correct) = @_;
50 for $col (sort keys %correct) {
51 $val = $class->$method($col);
53 # Hacks for various val types
54 $val = lc $val if $method eq 'column_type';
56 my $correct = $correct{$col};
57 like($val, qr/$correct/,"$method $col is $val");
65 package BeerDB::BeerTestmysql;
66 use base Maypole::Model::CDBI;
69 $DB_Class = 'BeerDB::BeerTestmysql';
71 my $drh = DBI->install_driver("mysql");
72 my %databases = map { $_ => 1 } $drh->func('localhost', 3306, '_ListDBs');
74 unless ($databases{test}) {
75 my $rc = $drh->func("createdb", 'test', 'admin');
78 %databases = map { $_ => 1 } $drh->func('localhost', 3306, '_ListDBs');
80 if ($databases{test}) {
81 eval {$DB_Class->connection("dbi:mysql:$db", "$dbuser", "$dbpasswd"); };
83 $skip_msg = "Could not connect to MySQL using database 'test', username 'test', and password ''. Check privileges and try again.";
86 $skip_msg = "Could not connect to MySQL using database 'test' as it doesn't exist, sorry";
92 skip $skip_msg, $skip_howmany if $err;
93 $DB_Class->db_Main->do("drop table if exists $table;");
94 $DB_Class->db_Main->do($sql);
95 $DB_Class->table($table);
96 run_method_tests($DB_Class,'column_type', %correct_types);
97 #run_method_tests($DB_Class,'column_default', %correct_defaults);
98 #run_method_tests($DB_Class,'column_nullable', %correct_defaults);
103 package BeerDB::BeerTestsqlite;
104 use base Maypole::Model::CDBI;
107 $DB_Class = 'BeerDB::BeerTestsqlite';
111 if ( !-e "t/test.db" ) {
112 eval {make_sqlite_db($sql)};
114 if ($err) { print "Skipping sql tests because couldnt make sqlite test db
115 because of error: $err";};
118 my $driver = sqlite_driver();
119 eval { $DB_Class->connection("dbi:$driver:dbname='t/test.db'");};
123 $skip_msg = "Could not connect to SQLite database 't/test.db'";
127 skip $skip_msg, $skip_howmany if $err;
128 $DB_Class->table($table);
129 run_method_tests($DB_Class,'column_type', %correct_types);
130 #run_method_tests($DB_Class,'column_default', %correct_defaults);
131 #run_method_tests($DB_Class,'column_nullable', %correct_defaults);
138 # Helper methods, TODO -- put these somewhere where tests can use them.
140 # returns "best" available sqlite driver or dies
142 my $driver = 'SQLite';
143 eval { require DBD::SQLite } or do {
144 print "Error loading DBD::SQLite, trying DBD::SQLite2\n";
145 eval {require DBD::SQLite2} ? $driver = 'SQLite2'
146 : die "DBD::SQLite2 is not installed";
152 # make_sqlite_db -- makes an sqlite database from params
153 # usage -- make_sqlite_db($sql [, $dbname ]);
155 my ($sql, $dbname) = @_;
156 die "Must provide SQL string" unless length $sql;
157 $dbname ||= 't/test.db';
158 print "Making SQLite DB $dbname\n";
159 my $driver = sqlite_driver;
161 my $dbh = DBI->connect("dbi:$driver:dbname=$dbname");
163 for my $statement ( split /;/, $sql ) {
164 $statement =~ s/\#.*$//mg; # strip # comments
165 $statement =~ s/auto_increment//g;
166 next unless $statement =~ /\S/;
167 eval { $dbh->do($statement) };
168 die "$@: $statement" if $@;
171 print "Successfully made SQLite DB $dbname\n";