Initial commit.
This commit is contained in:
		
							
								
								
									
										38
									
								
								t/10base.t
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										38
									
								
								t/10base.t
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| # Before `make install' is performed this script should be runnable with | ||||
| # `make test'. After `make install' it should work as `perl test.pl' | ||||
|  | ||||
| use strict; | ||||
| use Test; | ||||
| use DBI 1.06; | ||||
| use DbFramework::Util; | ||||
| use DbFramework::Catalog; | ||||
| use t::Config; | ||||
| require "t/util.pl"; | ||||
|  | ||||
| BEGIN {  | ||||
|   plan tests => 1; | ||||
| } | ||||
|  | ||||
| package Foo; | ||||
| use strict; | ||||
| use base qw(DbFramework::Util); | ||||
|  | ||||
| my %fields = ( | ||||
| 	      NAME       => undef, | ||||
| 	      CONTAINS_H => undef, | ||||
| 	     ); | ||||
|  | ||||
| sub new { | ||||
|   my $proto = shift; | ||||
|   my $class = ref($proto) || $proto; | ||||
|   my $self  = bless { _PERMITTED => \%fields, %fields, }, $class; | ||||
|   $self->name(shift); | ||||
|   $self->contains_h(shift); | ||||
|   return $self; | ||||
| } | ||||
|  | ||||
| package main; | ||||
| my $foo = new Foo('foo',['foo','oof','bar','rab','baz','zab']); | ||||
| my @names = $foo->contains_h_byname('foo','bar'); | ||||
| ok("@names",'oof rab'); | ||||
|  | ||||
							
								
								
									
										156
									
								
								t/15catalog.t
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										156
									
								
								t/15catalog.t
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,156 @@ | ||||
| # Before `make install' is performed this script should be runnable with | ||||
| # `make test'. After `make install' it should work as `perl test.pl' | ||||
| use strict; | ||||
| use Test; | ||||
| use t::Config; | ||||
|  | ||||
| BEGIN { plan tests => scalar(@t::Config::drivers) * 5 } | ||||
|  | ||||
| require 't/util.pl'; | ||||
| use DbFramework::Catalog; | ||||
| use DbFramework::Util; | ||||
| use DbFramework::DataModel; | ||||
| use DbFramework::Table; | ||||
|  | ||||
| my($t1,$t2); | ||||
|  | ||||
| for my $driver ( @t::Config::drivers ) { | ||||
|   if ( $driver eq 'mSQL' ) { | ||||
|     $t1 = qq{CREATE TABLE foo (foo integer not null, | ||||
| 			       bar char(10) not null, | ||||
| 			       baz char(10), | ||||
| 			       quux integer, | ||||
| 			       foobar text(10) | ||||
| 			      )}; | ||||
|     $t2 = qq{CREATE TABLE bar (foo integer not null, | ||||
| 			       # foreign key (foo) | ||||
| 			       foo_foo integer, | ||||
| 			       foo_bar char(10), | ||||
| 			       bar integer | ||||
| 			      )}; | ||||
|   } elsif ( $driver eq 'mysql' ) { | ||||
|     $t1 = qq{CREATE TABLE foo (foo integer not null auto_increment, | ||||
| 			       bar varchar(10) not null, | ||||
| 			       baz varchar(10) not null, | ||||
| 			       quux integer not null, | ||||
| 			       foobar text, | ||||
| 			       KEY foo(bar,baz), | ||||
| 			       KEY bar(baz,quux), | ||||
| 			       PRIMARY KEY (foo,bar) | ||||
| 			      )}; | ||||
|     $t2 = qq{CREATE TABLE bar (foo integer not null auto_increment, | ||||
| 			       # foreign key (foo) | ||||
| 			       foo_foo integer not null, | ||||
| 			       foo_bar varchar(10) not null, | ||||
| 			       bar integer, | ||||
| 			       KEY f_foo(foo_foo,foo_bar), | ||||
| 			       PRIMARY KEY (foo) | ||||
| 			      )}; | ||||
|   }  elsif ( $driver eq 'Pg' ) { | ||||
|     $t1 = qq{CREATE TABLE foo (foo integer not null, | ||||
| 			       bar varchar(10) not null, | ||||
| 			       baz varchar(10) not null, | ||||
| 			       quux integer not null, | ||||
| 			       foobar text, | ||||
| 			       UNIQUE(bar,baz), | ||||
| 			       UNIQUE(baz,quux), | ||||
| 			       PRIMARY KEY (foo,bar) | ||||
| 			      )}; | ||||
|     $t2 = qq{CREATE TABLE bar (foo integer not null, | ||||
| 			       -- foreign key (foo) | ||||
| 			       foo_foo integer not null, | ||||
| 			       foo_bar varchar(10) not null, | ||||
| 			       bar integer, | ||||
| 			       UNIQUE(foo_foo,foo_bar), | ||||
| 			       PRIMARY KEY (foo) | ||||
| 			      )}; | ||||
|   } elsif ( $driver eq 'Sybase' ) { | ||||
|     $t1 = qq{CREATE TABLE foo (foo numeric(10,0) identity not null, | ||||
| 			       bar varchar(10) not null, | ||||
| 			       baz varchar(10) not null, | ||||
| 			       quux integer not null, | ||||
| 			       foobar text, | ||||
| 			       UNIQUE (bar,baz), | ||||
| 			       UNIQUE (baz,quux), | ||||
| 			       PRIMARY KEY (foo,bar) | ||||
| 			      )}; | ||||
|     $t2 = qq{CREATE TABLE bar (foo numeric(10,0) identity not null, | ||||
| 			       -- foreign key (foo) | ||||
| 			       foo_foo integer not null, | ||||
| 			       foo_bar varchar(10) not null, | ||||
| 			       bar integer, | ||||
| 			       UNIQUE (foo_foo,foo_bar), | ||||
| 			       PRIMARY KEY (foo) | ||||
| 			      )}; | ||||
|   } elsif ( $driver eq 'CSV' ) { | ||||
|     $t1 = qq{CREATE TABLE foo (foo integer, | ||||
| 			       bar varchar(10), | ||||
| 			       baz varchar(10), | ||||
| 			       quux integer, | ||||
| 			       foobar varchar(255) | ||||
| 			      )}; | ||||
|     $t2 = qq{CREATE TABLE bar (foo integer, | ||||
| 			       foo_foo integer, | ||||
| 			       foo_bar varchar(10), | ||||
| 			       bar integer | ||||
| 			      )}; | ||||
|   } else { # ODBC syntax for auto increment is IDENTITY(seed,increment) | ||||
|     $t1 = qq{CREATE TABLE foo (foo integer not null identity(0,1), | ||||
| 			       bar varchar(10) not null, | ||||
| 			       baz varchar(10) not null, | ||||
| 			       quux integer not null, | ||||
| 			       foobar text, | ||||
| 			       KEY foo(bar,baz), | ||||
| 			       KEY bar(baz,quux), | ||||
| 			       PRIMARY KEY (foo,bar) | ||||
| 			      )}; | ||||
|     $t2 = qq{CREATE TABLE bar (foo integer not null identity(0,1), | ||||
| 			       # foreign key (foo) | ||||
| 			       foo_foo integer not null, | ||||
| 			       foo_bar varchar(10) not null, | ||||
| 			       bar integer, | ||||
| 			       KEY f_foo(foo_foo,foo_bar), | ||||
| 			       PRIMARY KEY (foo) | ||||
| 			      )}; | ||||
|   } | ||||
|   foo($driver,'foo',$t1,'bar',$t2); | ||||
| } | ||||
|  | ||||
| sub foo($$$$$) { | ||||
|   my($driver,$t1,$t1_sql,$t2,$t2_sql) = @_; | ||||
|  | ||||
|   my($catalog_db,$c_dsn,$c_u,$c_p) = connect_args($driver,'catalog'); | ||||
|   my($test_db,$dsn,$u,$p) = connect_args($driver,'test'); | ||||
|  | ||||
|   my $c = new DbFramework::Catalog($c_dsn,$c_u,$c_p); | ||||
|   ok(1); | ||||
|  | ||||
|   my $dbh = DbFramework::Util::get_dbh($dsn,$u,$p); | ||||
|   $dbh->{PrintError} = 0; # don't warn about dropping non-existent tables | ||||
|   drop_create($test_db,$t1,undef,$t1_sql,$dbh); | ||||
|   drop_create($test_db,$t2,undef,$t2_sql,$dbh); | ||||
|   my $dm = new DbFramework::DataModel($test_db,$dsn,$u,$p); | ||||
|   $dm->init_db_metadata($c_dsn,$c_u,$c_p); | ||||
|  | ||||
|   # test primary keys | ||||
|   my $foo_table = $dm->collects_table_h_byname('foo'); | ||||
|   ok($foo_table->is_identified_by->as_sql,'PRIMARY KEY (foo,bar)'); | ||||
|  | ||||
|   # test keys | ||||
|   my @keys = @{$foo_table->is_accessed_using_l}; | ||||
|   my($bar,$foo); | ||||
|   if ( $driver eq 'mSQL' ) { | ||||
|     ($bar,$foo) = (1,0); | ||||
|   } else { | ||||
|     ($bar,$foo) = (0,1); | ||||
|   } | ||||
|   ok($keys[$bar]->as_sql,'KEY bar (baz,quux)'); | ||||
|   ok($keys[$foo]->as_sql,'KEY foo (bar,baz)'); | ||||
|  | ||||
|   # test foreign keys | ||||
|   my $bar_table = $dm->collects_table_h_byname('bar'); | ||||
|   my $fk = $bar_table->has_foreign_keys_h_byname('f_foo'); | ||||
|   ok($fk->as_sql,'KEY f_foo (foo_foo,foo_bar)'); | ||||
|  | ||||
|   $dbh->disconnect; | ||||
| } | ||||
							
								
								
									
										70
									
								
								t/17datatype.t
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										70
									
								
								t/17datatype.t
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| # Before `make install' is performed this script should be runnable with | ||||
| # `make test'. After `make install' it should work as `perl test.pl' | ||||
| use strict; | ||||
| use Test; | ||||
| use t::Config; | ||||
|  | ||||
| BEGIN {  | ||||
|   my $tests; | ||||
|   my %tests = ( 'mSQL' => 1, 'mysql' => 3, 'Pg' => 0 ); | ||||
|   for ( @t::Config::drivers ) { $tests += $tests{$_}; } | ||||
|   plan tests => $tests; | ||||
| } | ||||
|  | ||||
| require 't/util.pl'; | ||||
| use DbFramework::DataType::ANSII; | ||||
| use DbFramework::DataType::Mysql; | ||||
| use DbFramework::Util; | ||||
| use DbFramework::DataModel; | ||||
|  | ||||
| for ( @t::Config::drivers ) { foo($_) } | ||||
|  | ||||
| sub foo($) { | ||||
|   my $driver = shift; | ||||
|  | ||||
|   my($catalog_db,$c_dsn,$c_u,$c_p) = connect_args($driver,'catalog'); | ||||
|   my($test_db,$dsn,$u,$p) = connect_args($driver,'test'); | ||||
|   my $dm = new DbFramework::DataModel($test_db,$dsn,$u,$p); | ||||
|   $dm->init_db_metadata($c_dsn,$c_u,$c_p); | ||||
|   my $dbh = $dm->dbh; $dbh->{PrintError} = 0; | ||||
|   my $t = $dm->collects_table_h_byname('foo'); | ||||
|  | ||||
|   my $dt; | ||||
|  | ||||
|   if ( $driver eq 'mSQL' ) { | ||||
|     # mapping of mSQL => ANSII types | ||||
|     ok($t->as_sql,'CREATE TABLE foo ( | ||||
| 	foo INT(4) NOT NULL, | ||||
| 	bar CHAR(10) NOT NULL, | ||||
| 	baz CHAR(10), | ||||
| 	quux INT(4), | ||||
| 	foobar TEXT(10), | ||||
| 	PRIMARY KEY (foo,bar), | ||||
| 	KEY foo (bar,baz), | ||||
| 	KEY bar (baz,quux) | ||||
| )'); | ||||
|   } elsif ( $driver eq 'mysql' ) {     | ||||
|     # mapping of Mysql => ANSII types | ||||
|     ok($t->as_sql,'CREATE TABLE foo ( | ||||
| 	foo INTEGER UNSIGNED(11) NOT NULL AUTO_INCREMENT, | ||||
| 	bar VARCHAR(10) NOT NULL, | ||||
| 	baz VARCHAR(10) NOT NULL, | ||||
| 	quux INTEGER UNSIGNED(11) NOT NULL, | ||||
| 	foobar TEXT(65535), | ||||
| 	PRIMARY KEY (foo,bar), | ||||
| 	KEY bar (baz,quux), | ||||
| 	KEY foo (bar,baz) | ||||
| )'); | ||||
|  | ||||
|     # valid Mysql type | ||||
|     my $mdt = new DbFramework::DataType::Mysql($dm,253,12,50); | ||||
|     ok($mdt->name,'VARCHAR'); | ||||
|      | ||||
|     # invalid Mysql type | ||||
|     $mdt = eval { new DbFramework::DataType::Mysql($dm,69,12,undef) }; | ||||
|     ok($@,'Invalid Mysql data type: 69 | ||||
| '); | ||||
|   } | ||||
|  | ||||
|   $dbh->disconnect; | ||||
| } | ||||
							
								
								
									
										171
									
								
								t/20table.t
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										171
									
								
								t/20table.t
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,171 @@ | ||||
| # Before `make install' is performed this script should be runnable with | ||||
| # `make test'. After `make install' it should work as `perl test.pl' | ||||
| use strict; | ||||
| use Test; | ||||
| use t::Config; | ||||
|  | ||||
| BEGIN {  | ||||
|   my $tests; | ||||
|   for ( @t::Config::drivers ) {  | ||||
|     $tests += ($_ ne 'mysql') ? 27 : 28; | ||||
|   } | ||||
|   plan tests => $tests; | ||||
| } | ||||
|  | ||||
| require 't/util.pl'; | ||||
| use DbFramework::Attribute; | ||||
| use DbFramework::Table; | ||||
| use DbFramework::Util; | ||||
| use DbFramework::DataModel; | ||||
| use DbFramework::Catalog; | ||||
|  | ||||
| for ( @t::Config::drivers ) { foo($_) } | ||||
|  | ||||
| sub foo($) { | ||||
|   my $driver = shift; | ||||
|  | ||||
|   my($catalog_db,$c_dsn,$c_u,$c_p) = connect_args($driver,'catalog'); | ||||
|   my($test_db,$dsn,$u,$p)          = connect_args($driver,'test'); | ||||
|   my $dm  = new DbFramework::DataModel($test_db,$dsn,$u,$p); | ||||
|   my $dbh = $dm->dbh; $dbh->{PrintError} = 0; | ||||
|  | ||||
|   my $c = new DbFramework::Catalog($c_dsn,$c_u,$c_p); | ||||
|   $dm->init_db_metadata($c_dsn,$c_u,$c_p); | ||||
|   my $foo_table = $dm->collects_table_h_byname('foo'); | ||||
|  | ||||
|   # as_string() | ||||
|   my $ok_string; | ||||
|   if ( $driver eq 'mSQL' ) { # doesn't support auto_increment | ||||
|     $ok_string = <<EOF; | ||||
| Table: foo | ||||
| foo(INT (4) NOT NULL) | ||||
| bar(CHAR (10) NOT NULL) | ||||
| baz(CHAR (10)) | ||||
| quux(INT (4)) | ||||
| foobar(TEXT (10)) | ||||
| EOF | ||||
| } elsif ( $driver eq 'mysql' ) { | ||||
|     $ok_string = <<EOF; | ||||
| Table: foo | ||||
| foo(INTEGER UNSIGNED (11) NOT NULL AUTO_INCREMENT) | ||||
| bar(VARCHAR (10) NOT NULL) | ||||
| baz(VARCHAR (10) NOT NULL) | ||||
| quux(INTEGER UNSIGNED (11) NOT NULL) | ||||
| foobar(TEXT (65535)) | ||||
| EOF | ||||
| } elsif ( $driver eq 'Pg' ) { | ||||
|     $ok_string = <<EOF; | ||||
| Table: foo | ||||
| foo(INT4) | ||||
| bar(VARCHAR) | ||||
| baz(VARCHAR) | ||||
| quux(INT4) | ||||
| foobar(TEXT) | ||||
| EOF | ||||
| } else { | ||||
|     $ok_string = <<EOF; | ||||
| Table: foo | ||||
| foo(INTEGER UNSIGNED (11) NOT NULL IDENTITY(0,1)) | ||||
| bar(VARCHAR (10) NOT NULL) | ||||
| baz(VARCHAR (10) NOT NULL) | ||||
| quux(INTEGER UNSIGNED (11) NOT NULL) | ||||
| foobar(TEXT (65535)) | ||||
| EOF | ||||
| } | ||||
|   ok($foo_table->as_string,$ok_string); | ||||
|  | ||||
|   # as_html_form() | ||||
|   $ok_string = <<EOF; | ||||
| <tr><td><INPUT NAME="foo" VALUE="" SIZE=10 TYPE="text"></td></tr> | ||||
| <tr><td><INPUT NAME="bar" VALUE='' SIZE=30 TYPE="text" MAXLENGTH=10></td></tr> | ||||
| <tr><td><INPUT NAME="baz" VALUE='' SIZE=30 TYPE="text" MAXLENGTH=10></td></tr> | ||||
| <tr><td><INPUT NAME="quux" VALUE="" SIZE=10 TYPE="text"></td></tr> | ||||
| <tr><td><TEXTAREA COLS=60 NAME="foobar" ROWS=4></TEXTAREA></td></tr> | ||||
| EOF | ||||
|   ok($foo_table->as_html_form,$ok_string); | ||||
|  | ||||
|   # delete() | ||||
|   $foo_table->delete; | ||||
|   ok(1); | ||||
|  | ||||
|   # insert() | ||||
|   my(@rows,$pk); | ||||
|   my $i = 0; | ||||
|   for ('foo','bar','baz','quux') { | ||||
|     push(@rows,{ foo => 0, bar => $_, baz => 'foo', quux => $i }); | ||||
|     $i++; | ||||
|   } | ||||
|   for ( @rows ) { $pk = $foo_table->insert($_) } | ||||
|    | ||||
|   if ( $driver =~ /(mSQL|Pg)/ ) { # no auto_increment | ||||
|     ok(1); | ||||
|   } else { | ||||
|     ok($pk,$#rows + 1); | ||||
|   } | ||||
|  | ||||
|   # select() | ||||
|   my @lol = $foo_table->select(['foo']); | ||||
|   ok(@lol,4); | ||||
|  | ||||
|   if ( $driver eq 'mysql' ) { | ||||
|     # apply a function to a column in a 'SELECT...' | ||||
|     my @loh = $foo_table->select_loh([q[lpad(foo,2,'0')]]); | ||||
|     ok($loh[0]->{q[lpad(foo,2,'0')]},'01'); | ||||
|   } | ||||
|  | ||||
|   # mSQL doesn't return # rows modified | ||||
|   my $rows = ( $driver eq 'mSQL' ) ? -1 : 2; | ||||
|   ok($foo_table->delete(q{bar LIKE 'b%'}),$rows); | ||||
|  | ||||
|   # update() | ||||
|   my $new_bar = 'bar'; | ||||
|   $rows = ( $driver eq 'mSQL' ) ? -1 : 1; | ||||
|   ok($foo_table->update({bar => $new_bar },q{bar = 'foo'}),$rows); | ||||
|   @lol = $foo_table->select(['bar'],undef,'bar'); | ||||
|   ok($lol[0]->[0],$new_bar); | ||||
|   my @loh = $foo_table->select_loh(['bar'],undef,'bar'); | ||||
|   ok($loh[0]->{bar},$new_bar); | ||||
|  | ||||
|   # data model | ||||
|   ok($dm->collects_table_h_byname('foo')->name,'foo'); | ||||
|   ok($dm->collects_table_h_byname('foo')->is_identified_by->as_sql,"PRIMARY KEY (foo,bar)"); | ||||
|  | ||||
|   # foreign keys | ||||
|   $foo_table = $dm->collects_table_h_byname('foo'); | ||||
|   ok($foo_table->is_identified_by->incorporates->name,'f_foo'); | ||||
|   my $bar_table = $dm->collects_table_h_byname('bar'); | ||||
|   ok($bar_table->has_foreign_keys_h_byname('f_foo')->name,'f_foo'); | ||||
|  | ||||
|   my @fk = @{$bar_table->has_foreign_keys_l}; | ||||
|   my %fk = %{$bar_table->has_foreign_keys_h}; | ||||
|   my @keys = keys(%fk); | ||||
|   ok(scalar(@fk),scalar(@keys)); | ||||
|  | ||||
|   @fk = $dm->collects_table_h_byname('foo')->is_identified_by->incorporates; | ||||
|   ok(scalar(@fk),scalar(@keys)); | ||||
|   ok($fk[0],$fk{f_foo}); | ||||
|  | ||||
|   # keys | ||||
|   ok($foo_table->in_key($foo_table->get_attributes('bar')),1); | ||||
|   ok($foo_table->in_key($foo_table->get_attributes('foo')),0); | ||||
|  | ||||
|   # primary keys | ||||
|   ok($foo_table->is_identified_by->belongs_to($foo_table),$foo_table); | ||||
|   ok($foo_table->in_primary_key($foo_table->get_attributes('foo')),1); | ||||
|   ok($foo_table->in_primary_key($foo_table->get_attributes('baz')),0); | ||||
|  | ||||
|   # foreign key | ||||
|   my @fks = @{$bar_table->has_foreign_keys_l}; | ||||
|   ok(@fks,1); | ||||
|   ok($bar_table->in_foreign_key($bar_table->get_attributes('foo_foo')),1); | ||||
|   ok($bar_table->in_foreign_key($bar_table->get_attributes('foo')),0); | ||||
|  | ||||
|   # non-keys | ||||
|   ok($foo_table->in_any_key($foo_table->get_attributes('foo')),1); | ||||
|   ok($bar_table->in_any_key($bar_table->get_attributes('bar')),0); | ||||
|   my @nka = $bar_table->non_key_attributes; | ||||
|   ok($nka[0]->name,'bar'); | ||||
|  | ||||
|   $dm->dbh->disconnect; | ||||
|   $dbh->disconnect; | ||||
| } | ||||
							
								
								
									
										82
									
								
								t/30persistent.t
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										82
									
								
								t/30persistent.t
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,82 @@ | ||||
| # Before `make install' is performed this script should be runnable with | ||||
| # `make test'. After `make install' it should work as `perl test.pl' | ||||
| use strict; | ||||
| use Test; | ||||
| use t::Config; | ||||
|  | ||||
| BEGIN { plan tests => scalar(@t::Config::drivers) * 12 } | ||||
|  | ||||
| require 't/util.pl'; | ||||
| use DbFramework::Persistent; | ||||
| use DbFramework::DataModel; | ||||
| use DbFramework::Table; | ||||
| use DbFramework::Util; | ||||
|  | ||||
| package Foo; | ||||
| use base qw(DbFramework::Persistent); | ||||
|  | ||||
| package main; | ||||
|  | ||||
| for ( @t::Config::drivers ) { foo($_) } | ||||
|  | ||||
| sub foo($) { | ||||
|   my($driver) = @_; | ||||
|  | ||||
|   my($catalog_db,$c_dsn,$c_u,$c_p) = connect_args($driver,'catalog'); | ||||
|   my($test_db,$dsn,$u,$p) = connect_args($driver,'test'); | ||||
|  | ||||
|   my $dm  = new DbFramework::DataModel($test_db,$dsn,$u,$p); | ||||
|   $dm->init_db_metadata($c_dsn,$c_u,$c_p); | ||||
|   my $dbh     = $dm->dbh; $dbh->{PrintError} = 0; | ||||
|   my $catalog = new DbFramework::Catalog($c_dsn); | ||||
|   my $foo     = new Foo($dm->collects_table_h_byname('foo'),$dbh,$catalog); | ||||
|   ok(1); | ||||
|  | ||||
|   # init | ||||
|   $foo->table->delete; | ||||
|   ok(1); | ||||
|  | ||||
|   # insert | ||||
|   $foo->attributes_h(['foo',0,'bar','bar','baz','baz','quux',0]); | ||||
|   my $pk = ($driver =~ /(mSQL|Pg)/ ) ? -1 : 1; | ||||
|   ok($foo->insert,$pk); | ||||
|   my %foo = ( foo => 0, bar => 'baz', baz => 'baz', quux => 1 ); | ||||
|   $foo->attributes_h([ %foo ]); | ||||
|   $pk = ($driver =~ /(mSQL|Pg)/ ) ? -1 : 2; | ||||
|   ok($foo->insert,$pk); | ||||
|   my @foo = $foo->attributes_h_byname('foo','bar'); | ||||
|   ok($foo[1],$foo{bar}); | ||||
|  | ||||
|   # update | ||||
|   $pk = ($driver =~ /(mSQL|Pg)/ ) ? 0 : 2; | ||||
|   $foo->attributes_h(['foo',$pk,'bar','baz','baz','quux']); | ||||
|   my $rows = ($driver =~ /mSQL/ ) ? -1 : 1; | ||||
|   ok($foo->update,$rows); | ||||
|  | ||||
|   # select | ||||
|   $foo->attributes_h([]); | ||||
|   @foo = $foo->select(undef,'bar'); | ||||
|   my @a = $foo[0]->attributes_h_byname('foo','bar'); | ||||
|   $pk = ($driver =~ /(mSQL|Pg)/ ) ? 0 : 1; | ||||
|   ok("@a","$pk bar"); | ||||
|   @a  = $foo[1]->attributes_h_byname('foo','bar'); | ||||
|   $pk = ($driver =~ /(mSQL|Pg)/ ) ? 0 : 2; | ||||
|   ok("@a","$pk baz"); | ||||
|   @foo = $foo->select(q{bar like 'b%'},'foo,bar'); | ||||
|   ok(@foo,2); | ||||
|  | ||||
|   # delete | ||||
|   $rows = ($driver =~ /mSQL/ ) ? -1 : 1; | ||||
|   ok($foo[0]->delete,$rows); | ||||
|  | ||||
|   # make persistent (sub)class | ||||
|   my($class,$table) = ('Bar','bar'); | ||||
|   my $ok = qq{package $class; | ||||
| use strict; | ||||
| use base qw(DbFramework::Persistent); | ||||
| }; | ||||
|   ok(DbFramework::Persistent->make_class($class),$ok); | ||||
|   eval $ok; | ||||
|   my $bar = $class->new($dm->collects_table_h_byname($table),$dbh,$catalog); | ||||
|   ok($bar->table->name,$table); | ||||
| } | ||||
							
								
								
									
										54
									
								
								t/40template.t
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										54
									
								
								t/40template.t
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| # Before `make install' is performed this script should be runnable with | ||||
| # `make test'. After `make install' it should work as `perl test.pl' | ||||
| use strict; | ||||
| use Test; | ||||
| use t::Config; | ||||
| require 't/util.pl'; | ||||
|  | ||||
| BEGIN { plan tests => scalar(@t::Config::drivers) * 4 + 1 } | ||||
|  | ||||
| use DbFramework::Template; | ||||
| ok(1); | ||||
| use DbFramework::DataModel; | ||||
|  | ||||
| for ( @t::Config::drivers ) { foo($_) } | ||||
|  | ||||
| sub foo($) { | ||||
|   my $driver = shift; | ||||
|  | ||||
|   my($catalog_db,$c_dsn,$c_u,$c_p) = connect_args($driver,'catalog'); | ||||
|   my($test_db,$dsn,$u,$p) = connect_args($driver,'test'); | ||||
|  | ||||
|   my $dm  = new DbFramework::DataModel($test_db,$dsn,$u,$p); | ||||
|   $dm->init_db_metadata($c_dsn,$c_u,$c_p); | ||||
|   my $dbh = $dm->dbh; $dbh->{PrintError} = 0; | ||||
|  | ||||
|   my $t  = new DbFramework::Template("(:&db_value(foo.bar):)", | ||||
| 				     $dm->collects_table_l); | ||||
|   ok(1); | ||||
|  | ||||
|   my $filling = 'bar'; | ||||
|   ok($t->fill({'foo.bar' => $filling}),$filling); | ||||
|  | ||||
|   $t->template->text("(:&db_html_form_field(foo.bar,,int):)"); | ||||
|   my $ok = '<INPUT NAME="bar" VALUE="" SIZE=10 TYPE="text">'; | ||||
|   ok($t->fill,$ok); | ||||
|  | ||||
|   $t->template->text("(:&db_fk_html_form_field(bar.f_foo):)"); | ||||
|   if ( $driver =~ /(mSQL|Pg)/ ) { | ||||
|     $ok = qq{<SELECT NAME="foo_foo,foo_bar"> | ||||
| <OPTION  VALUE="">** Any Value ** | ||||
| <OPTION  VALUE="NULL">NULL | ||||
| <OPTION  VALUE="0,baz">baz | ||||
| </SELECT> | ||||
| }; | ||||
|   } else { | ||||
|     $ok = qq{<SELECT NAME="foo_foo,foo_bar"> | ||||
| <OPTION  VALUE="">** Any Value ** | ||||
| <OPTION  VALUE="NULL">NULL | ||||
| <OPTION  VALUE="2,baz">baz | ||||
| </SELECT> | ||||
| }; | ||||
|   } | ||||
|   ok($t->fill,$ok); | ||||
| } | ||||
							
								
								
									
										20
									
								
								t/Config.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								t/Config.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| package t::Config; | ||||
|  | ||||
| $test_db = 'test'; | ||||
| @drivers = qw/mysql Pg/; | ||||
| %driver  = (mysql => {  | ||||
| test => {  | ||||
| p => '',u => '',dsn => 'DBI:mysql:database=test',}, | ||||
| dbframework_catalog => {  | ||||
| p => '',u => '',dsn => 'DBI:mysql:database=dbframework_catalog',}, | ||||
| }, | ||||
| Pg => {  | ||||
| test => {  | ||||
| p => '',u => '',dsn => 'DBI:Pg:dbname=test',}, | ||||
| dbframework_catalog => {  | ||||
| p => '',u => '',dsn => 'DBI:Pg:dbname=dbframework_catalog',}, | ||||
| }, | ||||
| ); | ||||
|  | ||||
| 1; | ||||
|  | ||||
							
								
								
									
										3
									
								
								t/template
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								t/template
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| <DbField foo.foo> | ||||
| <DbField foo.bar value=www.motorbase.com> | ||||
| <DbField foo.baz value=1 type=INT> | ||||
							
								
								
									
										6
									
								
								t/test/foo/foo.form
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								t/test/foo/foo.form
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| ( | ||||
|   foo => qq{<DbField foo.foo> | ||||
| <DbField foo.bar value=www.motorbase.com> | ||||
| <DbField foo.baz value=1 type=INT>}, | ||||
|   bar => q{bar}, | ||||
| ) | ||||
							
								
								
									
										54
									
								
								t/util.pl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								t/util.pl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
|  | ||||
| sub drop_create { | ||||
|   my($db,$table,$c,$sql,$dbh) = @_; | ||||
|   my $rv = $dbh->do("DROP TABLE $table"); | ||||
|  | ||||
|   ## init catalog | ||||
|   if ( defined $c ) { | ||||
|     my $c_sql = qq{ | ||||
|       DELETE FROM c_key | ||||
|       WHERE db_name      = '$db' | ||||
|       AND   ( table_name = '$table' ) | ||||
|     }; | ||||
|     my $sth = do_sql($c->dbh,$c_sql); $sth->finish; | ||||
|     $c_sql = qq{ | ||||
|       DELETE FROM c_relationship | ||||
|       WHERE db_name    = '$db' | ||||
|       AND   ( fk_table = '$table' ) | ||||
|     }; | ||||
|     $sth = do_sql($c->dbh,$c_sql); $sth->finish; | ||||
|   } | ||||
|  | ||||
|   return $dbh->do($sql) || die $dbh->errstr; | ||||
| } | ||||
|  | ||||
| sub do_sql { | ||||
|   my($dbh,$sql) = @_; | ||||
|   #print STDERR "$sql\n"; | ||||
|   my $sth = $dbh->prepare($sql) || die($dbh->errstr); | ||||
|   my $rv  = $sth->execute       || die($sth->errstr); | ||||
|   return $sth; | ||||
| }   | ||||
|  | ||||
| sub connect_args($$) { | ||||
|   my %driver      = %t::Config::driver; | ||||
|   my($driver,$db) = @_; | ||||
|   my $catalog_db  = $DbFramework::Catalog::db; | ||||
|   my($db_name,$dsn,$u,$p); | ||||
|  | ||||
|  SWITCH: { | ||||
|     ($db eq 'catalog') && do { | ||||
|       $db_name  = $catalog_db; | ||||
|     }; | ||||
|     ($db eq 'test') && do { | ||||
|       delete $driver{$driver}->{$catalog_db}; | ||||
|       ($db_name) = keys %{$driver{$driver}}; | ||||
|     }; | ||||
|   } | ||||
|   $dsn = $driver{$driver}->{$db_name}->{dsn}; | ||||
|   $u   = $driver{$driver}->{$db_name}->{u}; | ||||
|   $p   = $driver{$driver}->{$db_name}->{p}; | ||||
|   return($db_name,$dsn,$u,$p); | ||||
| } | ||||
|  | ||||
| 1; | ||||
		Reference in New Issue
	
	Block a user