5 use lib 'examples'; # Where BeerDB should live
8 DBI->install_driver("mysql");
9 my @databases = DBI->data_sources("mysql");
10 die "couldn't connect to mysql" unless (@databases);
12 warn "error : $@ \n" if ($@);
13 my $testcount = ($@) ? 45 : 64 ;
14 plan tests => $testcount;
23 id integer auto_increment primary key,
24 name char(30) NOT NULL default 'noname',
32 created timestamp default CURRENT_TIMESTAMP,
33 modified datetime default NULL,
34 style mediumint(8) NOT NULL default 1,
35 brewery integer default NULL
38 # correct column types and the ones we test
40 id => 'int', # mysql 4.1 stores this for 'integer'
46 created => '(time|time)',
47 modified => '(date|time)',
51 notes => '(text|blob)',
57 created => 'CURRENT_TIMESTAMP',
64 %correct_nullables = (
73 # Runs tests on column_* method of $class using %correct data hash
74 # usage: run_method_tests ($class, $method, %correct);
75 sub run_method_tests {
76 ($class, $method, %correct) = @_;
77 for $col (sort keys %correct) {
79 $val = $class->$method($col);
81 # Hacks for various val types
82 $val = lc $val if $method eq 'column_type';
84 my $correct = $correct{$col};
85 like($val, qr/$correct/,"$method $col is $val");
94 package BeerDB::BeerTestmysql;
95 use base qw(Maypole::Model::CDBI Class::DBI);
98 $DB_Class = 'BeerDB::BeerTestmysql';
100 my $drh = eval { DBI->install_driver("mysql"); };
103 $skip_msg = "no driver for MySQL";
105 my %databases = map { $_ => 1 } $drh->func('localhost', 3306, '_ListDBs');
107 unless ($databases{test}) {
108 my $rc = $drh->func("createdb", 'test', 'admin');
111 %databases = map { $_ => 1 } $drh->func('localhost', 3306, '_ListDBs');
113 if ($databases{test}) {
114 eval {$DB_Class->connection("dbi:mysql:$db", "$dbuser", "$dbpasswd"); };
116 $skip_msg = "Could not connect to MySQL using database 'test', username 'test', and password ''. Check privileges and try again.";
119 $skip_msg = "Could not connect to MySQL using database 'test' as it doesn't exist, sorry";
125 skip $skip_msg, $skip_howmany if $err;
126 $DB_Class->db_Main->do("drop table if exists $table;");
127 $DB_Class->db_Main->do($sql);
128 $DB_Class->table($table);
129 $DB_Class->columns(All => keys %correct_types);
130 $DB_Class->columns(Primary => 'id');
131 run_method_tests($DB_Class,'column_type', %correct_types);
132 run_method_tests($DB_Class,'column_default', %correct_defaults);
133 run_method_tests($DB_Class,'column_nullable', %correct_nullables);
136 foreach my $colname ( @{$DB_Class->required_columns()} ) {
137 ok($correct_nullables{$colname} == 0,"nullable column $colname is required (via required_columns)");
140 foreach my $colname (keys %correct_nullables) {
141 ok( $DB_Class->column_required($colname) == !$correct_nullables{$colname}, "nullable column $colname is required (via column_required)" )
144 ok($DB_Class->required_columns([qw/style name tasted score/]), 'set required column(s)');
146 foreach my $colname ( @{$DB_Class->required_columns()} ) {
147 ok($correct_nullables{$colname} == 0 || $colname eq 'score',"nullable or required column $colname is required (via required_columns)" );
150 foreach my $colname (keys %correct_nullables) {
151 if ($colname eq 'score') {
152 ok( $DB_Class->column_required($colname) == 0, "nullable column $colname is required (via column_required)");
154 ok( $DB_Class->column_required($colname) == !$correct_nullables{$colname}, "nullable column $colname is required (via column_required)");
161 package BeerDB::BeerTestsqlite;
162 use base qw(Maypole::Model::CDBI Class::DBI);
166 $DB_Class = 'BeerDB::BeerTestsqlite';
169 if ( !-e "t/test.db" ) {
170 eval {make_sqlite_db($sql)};
172 if ($err) { print "Skipping sql tests because couldnt make sqlite test db
173 because of error: $err";};
176 my $driver = sqlite_driver();
177 warn "using driver : $driver";
179 eval { $DB_Class->connection("dbi:$driver:dbname=$cwd/t/test.db");};
183 $skip_msg = "Could not connect to SQLite database 't/test.db'";
187 skip $skip_msg, $skip_howmany if $err;
188 $DB_Class->table($table);
189 $DB_Class->columns(All => keys %correct_types);
190 $DB_Class->columns(Primary => 'id');
192 run_method_tests($DB_Class,'column_type', %correct_types);
194 #run_method_tests($DB_Class,'column_default', %correct_defaults);
195 # I think sqlite driver allows everything to be nullable.
196 #run_method_tests($DB_Class,'column_nullable', %correct_nullables);
198 ok($DB_Class->required_columns([qw/score style name tasted/]), 'set required column(s)');
201 foreach my $colname ( @{$DB_Class->required_columns()} ) {
202 ok($correct_nullables{$colname} == 0 || $colname eq 'score',"nullable or required column $colname is required (via required_columns)" );
205 foreach my $colname (keys %correct_nullables) {
206 if ($colname eq 'score') {
207 ok( $DB_Class->column_required($colname) == 0, "nullable column $colname is required (via column_required)");
209 ok( $DB_Class->column_required($colname) == !$correct_nullables{$colname}, "nullable column $colname is required (via column_required)");
216 # Helper methods, TODO -- put these somewhere where tests can use them.
218 # returns "best" available sqlite driver or dies
220 my $driver = 'SQLite';
221 eval { require DBD::SQLite } or do {
222 print "Error loading DBD::SQLite, trying DBD::SQLite2\n";
223 eval {require DBD::SQLite2} ? $driver = 'SQLite2'
224 : die "DBD::SQLite2 is not installed";
230 # make_sqlite_db -- makes an sqlite database from params
231 # usage -- make_sqlite_db($sql [, $dbname ]);
233 my ($sql, $dbname) = @_;
234 die "Must provide SQL string" unless length $sql;
235 $dbname ||= 't/test.db';
236 print "Making SQLite DB $dbname\n";
237 my $driver = sqlite_driver;
239 my $dbh = DBI->connect("dbi:$driver:dbname=$dbname");
241 for my $statement ( split /;/, $sql ) {
242 $statement =~ s/\#.*$//mg; # strip # comments
243 $statement =~ s/auto_increment//g;
244 next unless $statement =~ /\S/;
245 eval { $dbh->do($statement) };
246 die "$@: $statement" if $@;
249 print "Successfully made SQLite DB $dbname\n";