]> git.decadent.org.uk Git - maypole.git/blobdiff - t/db_colinfo.t
Merge branch 'upstream'
[maypole.git] / t / db_colinfo.t
index cb1b4361e1f91c0b6629a6a517b2c7390097cba8..3b20f8dcd463376f32fc158047e0a184b5bb58d5 100755 (executable)
@@ -1,8 +1,17 @@
 #!/usr/bin/perl -w
 use Test::More;
-use lib 'ex'; # Where BeerDB should live
+use Data::Dumper;
+use DBI;
+use lib 'examples'; # Where BeerDB should live
 BEGIN {
-   plan tests => 26;
+       my $drh = eval {
+         DBI->install_driver("mysql");
+         my @databases = DBI->data_sources("mysql");
+         die "couldn't connect to mysql" unless (@databases);
+       };
+       warn "error : $@ \n" if ($@);
+        my $testcount = ($@) ? 45 : 64 ;
+        plan tests => $testcount;
 }
 
 $db            = 'test';
@@ -12,7 +21,7 @@ $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),
@@ -22,7 +31,7 @@ create table $table (
     tasted date NOT NULL,
     created timestamp default CURRENT_TIMESTAMP,
     modified datetime  default NULL,
-    style mediumint(8) default 1,
+    style mediumint(8) NOT NULL default 1,
     brewery integer default NULL
 );";
 
@@ -32,22 +41,41 @@ create table $table (
                  brewery       =>      'int',
                  style         =>      'int',
                  name          =>      'char',
-                 url           =>      'varchar',
+                 url           =>  'varchar',
                  tasted        =>      'date',
                  created       =>      '(time|time)',
                  modified      =>      '(date|time)',
                  score         =>      'smallint',
                  price         =>      'decimal',
                  abv           =>      'varchar',
-                 notes         =>      '(text|blob)',
+                 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);
 
     # Hacks for various val types
@@ -56,6 +84,7 @@ sub run_method_tests {
     my $correct = $correct{$col};
     like($val, qr/$correct/,"$method $col is $val");
   }
+
 }
 
 
@@ -63,51 +92,80 @@ sub run_method_tests {
 
 # Make test class 
 package BeerDB::BeerTestmysql;
-use base Maypole::Model::CDBI;
+use base qw(Maypole::Model::CDBI Class::DBI);
 package main;
 
 $DB_Class = 'BeerDB::BeerTestmysql';
 
-my $drh = DBI->install_driver("mysql");
-my %databases = map { $_ => 1 } $drh->func('localhost', 3306, '_ListDBs');
+my $drh = eval { DBI->install_driver("mysql"); };
+$err = $@;
+if ($err) {
+  $skip_msg = "no driver for MySQL";
+} else {
+  my %databases = map { $_ => 1 } $drh->func('localhost', 3306, '_ListDBs');
 
-unless ($databases{test}) {
-  my $rc = $drh->func("createdb", 'test', 'admin');
-}
+  unless ($databases{test}) {
+    my $rc = $drh->func("createdb", 'test', 'admin');
+  }
 
-%databases = map { $_ => 1 } $drh->func('localhost', 3306, '_ListDBs');
+  %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";
+  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 = 13;
+$skip_howmany = 22;
 
 SKIP: {
        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); 
+       $DB_Class->table($table);
+       $DB_Class->columns(All => keys %correct_types);
+       $DB_Class->columns(Primary => 'id');
        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);
+
+
+       foreach my $colname ( @{$DB_Class->required_columns()} ) {
+           ok($correct_nullables{$colname} == 0,"nullable column $colname is required (via required_columns)");
+       }
+
+       foreach my $colname (keys %correct_nullables) {
+         ok( $DB_Class->column_required($colname) == !$correct_nullables{$colname}, "nullable column $colname is required (via column_required)" )
+       }
+
+       ok($DB_Class->required_columns([qw/style name tasted score/]), 'set required column(s)');
+       
+       foreach my $colname ( @{$DB_Class->required_columns()} ) {
+           ok($correct_nullables{$colname} == 0 || $colname eq 'score',"nullable or required column $colname is required (via required_columns)" );
+       }
+       
+       foreach my $colname (keys %correct_nullables) {
+           if ($colname eq 'score') {
+               ok( $DB_Class->column_required($colname) == 0, "nullable column $colname is required (via column_required)");
+           } else {
+               ok( $DB_Class->column_required($colname) == !$correct_nullables{$colname}, "nullable column $colname is required (via column_required)");
+           }
+       }       
 };
 
 # SQLite  test
 
 package BeerDB::BeerTestsqlite;
-use base Maypole::Model::CDBI;
+use base qw(Maypole::Model::CDBI Class::DBI);
 package main;
+use Cwd;
 
 $DB_Class = 'BeerDB::BeerTestsqlite';
 
 $err = undef;
-#unlink "t/test.db";
 if ( !-e "t/test.db" ) {
        eval {make_sqlite_db($sql)};
        $err = $@;
@@ -116,7 +174,9 @@ if ( !-e "t/test.db" ) {
 }
 unless ($err) {
        my $driver = sqlite_driver();
-       eval { $DB_Class->connection("dbi:$driver:dbname='t/test.db'");};
+       warn "using driver : $driver";
+       my $cwd = cwd;
+       eval { $DB_Class->connection("dbi:$driver:dbname=$cwd/t/test.db");};
        $err = $@;
 }
 
@@ -126,15 +186,33 @@ $skip_howmany = 13;
 SKIP: {
        skip $skip_msg, $skip_howmany  if $err; 
        $DB_Class->table($table); 
+       $DB_Class->columns(All => keys %correct_types);
+       $DB_Class->columns(Primary => 'id');
+#use Data::Dumper; 
        run_method_tests($DB_Class,'column_type', %correct_types);
+       # No support default
        #run_method_tests($DB_Class,'column_default', %correct_defaults);
-       #run_method_tests($DB_Class,'column_nullable', %correct_defaults);
+       # I think sqlite driver allows everything to be nullable.
+       #run_method_tests($DB_Class,'column_nullable', %correct_nullables);
+
+       ok($DB_Class->required_columns([qw/score style name tasted/]), 'set required column(s)');
+       
+
+       foreach my $colname ( @{$DB_Class->required_columns()} ) {
+           ok($correct_nullables{$colname} == 0 || $colname eq 'score',"nullable or required column $colname is required (via required_columns)" );
+       }
+       
+       foreach my $colname (keys %correct_nullables) {
+           if ($colname eq 'score') {
+               ok( $DB_Class->column_required($colname) == 0, "nullable column $colname is required (via column_required)");
+           } else {
+               ok( $DB_Class->column_required($colname) == !$correct_nullables{$colname}, "nullable column $colname is required (via column_required)");
+           }
+       }
 
 };
 
 
-
-
 # Helper methods, TODO -- put these somewhere where tests can use them.
 
 # returns "best" available sqlite driver or dies