3 use lib 'ex'; # Where BeerDB should live
15 id integer auto_increment primary key,
24 created timestamp default CURRENT_TIMESTAMP,
25 modified datetime default NULL,
26 style mediumint(8) default 1,
27 brewery integer default NULL
30 # correct column types and the ones we test
32 id => 'int(11)', # mysql 4.1 stores this for 'integer'
34 style => 'mediumint(8)',
36 url => 'varchar(120)',
38 created => 'timestamp',
39 modified => 'datetime',
40 score => 'smallint(2)',
41 price => 'decimal(3,2)',
47 # Runs tests on column_* method of $class using %correct data hash
48 # usage: run_method_tests ($class, $method, %correct);
49 sub run_method_tests {
50 ($class, $method, %correct) = @_;
51 for $col (sort keys %correct) {
52 $val = $class->$method($col);
54 # Hacks for various val types
55 $val = lc $val if $method eq 'column_type';
57 is($val, $correct{$col},"$method $col is $val");
65 package BeerDB::BeerTestmysql;
66 use base Maypole::Model::CDBI;
70 $DB_Class = 'BeerDB::BeerTestmysql';
71 eval {$DB_Class->connection("dbi:mysql:$db", "$dbuser", "$dbpasswd"); };
73 $skip_msg = "Could not connect to MySQL using database 'test', username 'test', and password ''. Check privelages and try again.";
77 skip $skip_msg, $skip_howmany if $err;
79 $DB_Class->db_Main->do("drop table if exists $table;");
80 $DB_Class->db_Main->do($sql);
81 $DB_Class->table($table);
82 run_method_tests($DB_Class,'column_type', %correct_types);
83 #run_method_tests($DB_Class,'column_default', %correct_defaults);
84 #run_method_tests($DB_Class,'column_nullable', %correct_defaults);
89 package BeerDB::BeerTestsqlite;
90 use base Maypole::Model::CDBI;
93 $DB_Class = 'BeerDB::BeerTestsqlite';
96 if ( !-e "t/test.db" ) {
97 eval {make_sqlite_db($sql)};
99 if ($err) { print "Skipping sql tests because couldnt make sqlite test db
100 because of error $err"; exit; };
103 my $driver = sqlite_driver();
104 eval { $DB_Class->connection("dbi:$driver:dbname='t/test.db'");};
106 if ($err) { die "CDBI connection error: $err"; }
107 $skip_msg = "Could not connect to SQLite database 't/test.db'";
111 skip $skip_msg, $skip_howmany if $err;
112 $DB_Class->table($table);
113 run_method_tests($DB_Class,'column_type', %correct_types);
114 #run_method_tests($DB_Class,'column_default', %correct_defaults);
115 #run_method_tests($DB_Class,'column_nullable', %correct_defaults);
122 # Helper methods, TODO -- put these somewhere where tests can use them.
124 # returns "best" available sqlite driver or dies
126 my $driver = 'SQLite';
127 eval { require DBD::SQLite } or do {
128 print "Error loading DBD::SQLite, trying DBD::SQLite2\n";
129 eval {require DBD::SQLite2} ? $driver = 'SQLite2'
130 : die "DBD::SQLite2 is not installed";
136 # make_sqlite_db -- makes an sqlite database from params
137 # usage -- make_sqlite_db($sql [, $dbname ]);
139 my ($sql, $dbname) = @_;
140 die "Must provide SQL string" unless length $sql;
141 $dbname ||= 't/test.db';
142 print "Making SQLite DB $dbname\n";
143 my $driver = sqlite_driver;
145 my $dbh = DBI->connect("dbi:$driver:dbname=$dbname");
147 for my $statement ( split /;/, $sql ) {
148 $statement =~ s/\#.*$//mg; # strip # comments
149 $statement =~ s/auto_increment//g;
150 next unless $statement =~ /\S/;
151 eval { $dbh->do($statement) };
152 die "$@: $statement" if $@;
155 print "Successfully made SQLite DB $dbname\n";