]> git.decadent.org.uk Git - maypole.git/blobdiff - t/db_colinfo.t
column_info tests, AsForm select fixings and docs.
[maypole.git] / t / db_colinfo.t
index ed54fd7de3f94c3f8d5c4810c7a093f11e5132c0..ef2466fb002aa067a85aebf2fbed03dcd6008d77 100755 (executable)
 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