starting work on extended set of Pg auto-pk tests
[dbsrgits/DBIx-Class.git] / t / 72pg.t
index 4b94d9b..248d5e8 100644 (file)
--- a/t/72pg.t
+++ b/t/72pg.t
@@ -14,8 +14,8 @@ Set \$ENV{DBICTEST_PG_DSN}, _USER and _PASS to run this test
 ( NOTE: This test drops and creates tables called 'artist', 'casecheck',
   'array_test' and 'sequence_test' as well as following sequences:
   'pkid1_seq', 'pkid2_seq' and 'nonpkid_seq''.  as well as following
-  schemas: 'testschema', 'anothertestschema', 'yetanothertestschema',
-  'unq_nextval_schema', and 'unq_nextval_schema2'
+  schemas: 'dbic_t_schema', 'dbic_t_schema_2', 'dbic_t_schema_3',
+  'dbic_t_schema_4', and 'dbic_t_schema_5'
 )
 EOM
 
@@ -53,98 +53,16 @@ DBICTest::Schema->load_classes( map {s/.+:://;$_} @test_classes ) if @test_class
 my $schema = DBICTest::Schema->connect($dsn, $user, $pass);
 my $dbh = $schema->storage->dbh;
 
-drop_test_schema($dbh, 'no warn');
-create_test_schema($dbh);
+drop_test_schema($schema, 'no warn');
+create_test_schema($schema);
 
 ### begin main tests
 
-###  auto-pk / last_insert_id / sequence discovery
-{
-    local $SIG{__WARN__} = sub {};
-    _cleanup ($schema);
-
-    $schema->source("Artist")->name("testschema.artist");
-
-    # This is in Core now, but it's here just to test that it doesn't break
-    $schema->class('Artist')->load_components('PK::Auto');
-    cmp_ok( $schema->resultset('Artist')->count, '==', 0, 'this should start with an empty artist table');
-
-    # test that auto-pk also works with the defined search path by
-    # un-schema-qualifying the table name
-    my $artist_name_save = $schema->source("Artist")->name;
-    $schema->source("Artist")->name("artist");
-
-    my $unq_new;
-    lives_ok {
-        $unq_new = $schema->resultset('Artist')->create({ name => 'baz' });
-    } 'insert into unqualified, shadowed table succeeds';
-
-    is($unq_new && $unq_new->artistid, 1, "and got correct artistid");
-
-    my @test_schemas = ( [qw| anothertestschema    1      |],
-                         [qw| yetanothertestschema 1      |],
-                       );
-    foreach my $t ( @test_schemas ) {
-        my ($sch_name, $start_num) = @$t;
-        #test with anothertestschema
-        $schema->source('Artist')->name("$sch_name.artist");
-        $schema->source('Artist')->column_info('artistid')->{sequence} = undef; #< clear sequence name cache
-        my $another_new;
-        lives_ok {
-            $another_new = $schema->resultset('Artist')->create({ name => 'Tollbooth Willy'});
-            is( $another_new->artistid,$start_num, "got correct artistid for $sch_name")
-                or diag "USED SEQUENCE: ".($schema->source('Artist')->column_info('artistid')->{sequence} || '<none>');
-        } "$sch_name liid 1 did not die"
-            or diag "USED SEQUENCE: ".($schema->source('Artist')->column_info('artistid')->{sequence} || '<none>');
-        lives_ok {
-            $another_new = $schema->resultset('Artist')->create({ name => 'Adam Sandler'});
-            is( $another_new->artistid,$start_num+1, "got correct artistid for $sch_name")
-                or diag "USED SEQUENCE: ".($schema->source('Artist')->column_info('artistid')->{sequence} || '<none>');
-        } "$sch_name liid 2 did not die"
-            or diag "USED SEQUENCE: ".($schema->source('Artist')->column_info('artistid')->{sequence} || '<none>');
-
-    }
-
-
-    my @todo_schemas = (
-                        [qw| unq_nextval_schema   2 |],
-                        [qw| unq_nextval_schema2  1 |],
-                       );
-
-    foreach my $t ( @todo_schemas ) {
-        my ($sch_name, $start_num) = @$t;
-
-        #test with anothertestschema
-        $schema->source('Artist')->name("$sch_name.artist");
-        $schema->source('Artist')->column_info('artistid')->{sequence} = undef; #< clear sequence name cache
-        my $another_new;
-        lives_ok {
-            $another_new = $schema->resultset('Artist')->create({ name => 'Tollbooth Willy'});
-            is( $another_new->artistid,$start_num, "got correct artistid for $sch_name")
-                or diag "USED SEQUENCE: ".($schema->source('Artist')->column_info('artistid')->{sequence} || '<none>');
-        } "$sch_name liid 1 did not die"
-            or diag "USED SEQUENCE: ".($schema->source('Artist')->column_info('artistid')->{sequence} || '<none>');
-
-        lives_ok {
-            $another_new = $schema->resultset('Artist')->create({ name => 'Adam Sandler'});
-            is( $another_new->artistid,$start_num+1, "got correct artistid for $sch_name")
-                or diag "USED SEQUENCE: ".($schema->source('Artist')->column_info('artistid')->{sequence} || '<none>');
-        } "$sch_name liid 2 did not die"
-            or diag "USED SEQUENCE: ".($schema->source('Artist')->column_info('artistid')->{sequence} || '<none>');
-    }
-
-    $schema->source('Artist')->column_info('artistid')->{sequence} = undef; #< clear sequence name cache
-    $schema->source("Artist")->name($artist_name_save);
-}
-
-lives_ok {
-    my $new = $schema->resultset('Artist')->create({ name => 'foo' });
-    is($new->artistid, 4, "Auto-PK worked");
-    $new = $schema->resultset('Artist')->create({ name => 'bar' });
-    is($new->artistid, 5, "Auto-PK worked");
-} 'old auto-pk tests did not die either';
-
 
+# run a BIG bunch of tests for last-insert-id / Auto-PK / sequence
+# discovery
+run_apk_tests($schema); #< older set of auto-pk tests
+run_extended_apk_tests($schema); #< new extended set of auto-pk tests
 
 ### type_info tests
 
@@ -181,7 +99,7 @@ my $test_type_info = {
     },
 };
 
-my $type_info = $schema->storage->columns_info_for('testschema.artist');
+my $type_info = $schema->storage->columns_info_for('dbic_t_schema.artist');
 my $artistid_defval = delete $type_info->{artistid}->{default_value};
 like($artistid_defval,
      qr/^nextval\('([^\.]*\.){0,1}artist_artistid_seq'::(?:text|regclass)\)/,
@@ -203,7 +121,7 @@ BEGIN {
   use base 'DBIx::Class';
 
   __PACKAGE__->load_components(qw/Core/);
-  __PACKAGE__->table('testschema.array_test');
+  __PACKAGE__->table('dbic_t_schema.array_test');
   __PACKAGE__->add_columns(qw/id arrayfield/);
   __PACKAGE__->column_info_from_storage(1);
   __PACKAGE__->set_primary_key('id');
@@ -250,7 +168,7 @@ BEGIN {
   use base 'DBIx::Class';
 
   __PACKAGE__->load_components(qw/Core/);
-  __PACKAGE__->table('testschema.casecheck');
+  __PACKAGE__->table('dbic_t_schema.casecheck');
   __PACKAGE__->add_columns(qw/id name NAME uc_name storecolumn/);
   __PACKAGE__->column_info_from_storage(1);
   __PACKAGE__->set_primary_key('id');
@@ -288,7 +206,7 @@ SKIP: {
     skip "Sys::SigAction is not available", 3 unless $HaveSysSigAction;
     # create a new schema
     my $schema2 = DBICTest::Schema->connect($dsn, $user, $pass);
-    $schema2->source("Artist")->name("testschema.artist");
+    $schema2->source("Artist")->name("dbic_t_schema.artist");
 
     $schema->txn_do( sub {
         my $artist = $schema->resultset('Artist')->search(
@@ -325,7 +243,7 @@ SKIP: {
     skip "Sys::SigAction is not available", 3 unless $HaveSysSigAction;
     # create a new schema
     my $schema2 = DBICTest::Schema->connect($dsn, $user, $pass);
-    $schema2->source("Artist")->name("testschema.artist");
+    $schema2->source("Artist")->name("dbic_t_schema.artist");
 
     $schema->txn_do( sub {
         my $artist = $schema->resultset('Artist')->search(
@@ -356,9 +274,9 @@ SKIP: {
 }
 
 
-######## other Auto-pk tests
+######## other older Auto-pk tests
 
-$schema->source("SequenceTest")->name("testschema.sequence_test");
+$schema->source("SequenceTest")->name("dbic_t_schema.sequence_test");
 for (1..5) {
     my $st = $schema->resultset('SequenceTest')->create({ name => 'foo' });
     is($st->pkid1, $_, "Oracle Auto-PK without trigger: First primary key");
@@ -368,22 +286,22 @@ for (1..5) {
 my $st = $schema->resultset('SequenceTest')->create({ name => 'foo', pkid1 => 55 });
 is($st->pkid1, 55, "Oracle Auto-PK without trigger: First primary key set manually");
 
-sub _cleanup {
-  my $schema = shift or return;
-  local $SIG{__WARN__} = sub {};
+done_testing;
 
 exit;
-END { drop_test_schema($dbh) }
+END { drop_test_schema($schema) }
 
 
 ######### SUBROUTINES
 
 sub create_test_schema {
-    my $dbh = shift;
+    my $schema = shift;
+    $schema->storage->dbh_do(sub {
+      my (undef,$dbh) = @_;
 
-    local $SIG{__WARN__} = sub {};
+      local $dbh->{Warn} = 0;
 
-    my $std_artist_table = <<EOS;
+      my $std_artist_table = <<EOS;
 (
   artistid serial PRIMARY KEY
   , name VARCHAR(100)
@@ -393,10 +311,10 @@ sub create_test_schema {
 )
 EOS
 
-    $dbh->do("CREATE SCHEMA testschema");
-    $dbh->do("CREATE TABLE testschema.artist $std_artist_table");
-    $dbh->do(<<EOS);
-CREATE TABLE testschema.sequence_test (
+      $dbh->do("CREATE SCHEMA dbic_t_schema");
+      $dbh->do("CREATE TABLE dbic_t_schema.artist $std_artist_table");
+      $dbh->do(<<EOS);
+CREATE TABLE dbic_t_schema.sequence_test (
     pkid1 integer
     , pkid2 integer
     , nonpkid integer
@@ -404,11 +322,11 @@ CREATE TABLE testschema.sequence_test (
     , CONSTRAINT pk PRIMARY KEY(pkid1, pkid2)
 )
 EOS
-    $dbh->do("CREATE SEQUENCE pkid1_seq START 1 MAXVALUE 999999 MINVALUE 0");
-    $dbh->do("CREATE SEQUENCE pkid2_seq START 10 MAXVALUE 999999 MINVALUE 0");
-    $dbh->do("CREATE SEQUENCE nonpkid_seq START 20 MAXVALUE 999999 MINVALUE 0");
-    $dbh->do(<<EOS);
-CREATE TABLE testschema.casecheck (
+      $dbh->do("CREATE SEQUENCE pkid1_seq START 1 MAXVALUE 999999 MINVALUE 0");
+      $dbh->do("CREATE SEQUENCE pkid2_seq START 10 MAXVALUE 999999 MINVALUE 0");
+      $dbh->do("CREATE SEQUENCE nonpkid_seq START 20 MAXVALUE 999999 MINVALUE 0");
+      $dbh->do(<<EOS);
+CREATE TABLE dbic_t_schema.casecheck (
     id serial PRIMARY KEY
     , "name" VARCHAR(1)
     , "NAME" VARCHAR(2)
@@ -416,21 +334,21 @@ CREATE TABLE testschema.casecheck (
     , "storecolumn" VARCHAR(10)
 )
 EOS
-    $dbh->do(<<EOS);
-CREATE TABLE testschema.array_test (
+      $dbh->do(<<EOS);
+CREATE TABLE dbic_t_schema.array_test (
     id serial PRIMARY KEY
     , arrayfield INTEGER[]
 )
 EOS
-    $dbh->do("CREATE SCHEMA anothertestschema");
-    $dbh->do("CREATE TABLE anothertestschema.artist $std_artist_table");
-    $dbh->do("CREATE SCHEMA yetanothertestschema");
-    $dbh->do("CREATE TABLE yetanothertestschema.artist $std_artist_table");
-    $dbh->do('set search_path=testschema,public');
-    $dbh->do("CREATE SCHEMA unq_nextval_schema");
-    $dbh->do("CREATE SCHEMA unq_nextval_schema2");
-    $dbh->do(<<EOS);
- CREATE TABLE unq_nextval_schema.artist
+      $dbh->do("CREATE SCHEMA dbic_t_schema_2");
+      $dbh->do("CREATE TABLE dbic_t_schema_2.artist $std_artist_table");
+      $dbh->do("CREATE SCHEMA dbic_t_schema_3");
+      $dbh->do("CREATE TABLE dbic_t_schema_3.artist $std_artist_table");
+      $dbh->do('set search_path=dbic_t_schema,public');
+      $dbh->do("CREATE SCHEMA dbic_t_schema_4");
+      $dbh->do("CREATE SCHEMA dbic_t_schema_5");
+      $dbh->do(<<EOS);
+ CREATE TABLE dbic_t_schema_4.artist
  (
    artistid integer not null default nextval('artist_artistid_seq'::regclass) PRIMARY KEY
    , name VARCHAR(100)
@@ -439,10 +357,10 @@ EOS
    , arrayfield INTEGER[]
  );
 EOS
-    $dbh->do('set search_path=public,testschema,yetanothertestschema');
-    $dbh->do('create sequence public.artist_artistid_seq'); #< in the public schema
-    $dbh->do(<<EOS);
- CREATE TABLE unq_nextval_schema2.artist
+      $dbh->do('set search_path=public,dbic_t_schema,dbic_t_schema_3');
+      $dbh->do('create sequence public.artist_artistid_seq'); #< in the public schema
+      $dbh->do(<<EOS);
+ CREATE TABLE dbic_t_schema_5.artist
  (
    artistid integer not null default nextval('public.artist_artistid_seq'::regclass) PRIMARY KEY
    , name VARCHAR(100)
@@ -451,29 +369,137 @@ EOS
    , arrayfield INTEGER[]
  );
 EOS
-    $dbh->do('set search_path=testschema,public');
+      $dbh->do('set search_path=dbic_t_schema,public');
+  });
 }
 
 
 
 sub drop_test_schema {
-  my ( $dbh, $no_warn ) = @_;
-
-  return unless $dbh->ping;
-
-  for my $stat (
-    'DROP SCHEMA testschema CASCADE',
-    'DROP SCHEMA anothertestschema CASCADE',
-    'DROP SCHEMA yetanothertestschema CASCADE',
-    'DROP SEQUENCE pkid1_seq',
-    'DROP SEQUENCE pkid2_seq',
-    'DROP SEQUENCE nonpkid_seq',
-  ) {
-    eval { $schema->storage->_do_query ($stat) };
-    diag $@ if $@ && !$no_warn;
-  }
+    my ( $schema, $no_warn ) = @_;
+
+    $schema->storage->dbh_do(sub {
+        my (undef,$dbh) = @_;
+
+        local $dbh->{Warn} = 0;
+
+        for my $stat (
+                      'DROP SCHEMA dbic_t_schema_5 CASCADE',
+                      'DROP SEQUENCE public.artist_artistid_seq',
+                      'DROP SCHEMA dbic_t_schema_4 CASCADE',
+                      'DROP SCHEMA dbic_t_schema CASCADE',
+                      'DROP SEQUENCE pkid1_seq',
+                      'DROP SEQUENCE pkid2_seq',
+                      'DROP SEQUENCE nonpkid_seq',
+                      'DROP SCHEMA dbic_t_schema_2 CASCADE',
+                      'DROP SCHEMA dbic_t_schema_3 CASCADE',
+                     ) {
+            eval { $dbh->do ($stat) };
+            diag $@ if $@ && !$no_warn;
+        }
+    });
 }
 
-done_testing;
 
-END { _cleanup($schema) }
+###  auto-pk / last_insert_id / sequence discovery
+sub run_apk_tests {
+    my $schema = shift;
+
+    # This is in Core now, but it's here just to test that it doesn't break
+    $schema->class('Artist')->load_components('PK::Auto');
+    cmp_ok( $schema->resultset('Artist')->count, '==', 0, 'this should start with an empty artist table');
+
+    # test that auto-pk also works with the defined search path by
+    # un-schema-qualifying the table name
+    apk_t_set($schema,'artist');
+
+    my $unq_new;
+    lives_ok {
+        $unq_new = $schema->resultset('Artist')->create({ name => 'baz' });
+    } 'insert into unqualified, shadowed table succeeds';
+
+    is($unq_new && $unq_new->artistid, 1, "and got correct artistid");
+
+    my @test_schemas = ( [qw| dbic_t_schema_2    1  |],
+                         [qw| dbic_t_schema_3    1  |],
+                         [qw| dbic_t_schema_4    2  |],
+                         [qw| dbic_t_schema_5    1  |],
+                       );
+    foreach my $t ( @test_schemas ) {
+        my ($sch_name, $start_num) = @$t;
+        #test with dbic_t_schema_2
+        apk_t_set($schema,"$sch_name.artist");
+        my $another_new;
+        lives_ok {
+            $another_new = $schema->resultset('Artist')->create({ name => 'Tollbooth Willy'});
+            is( $another_new->artistid,$start_num, "got correct artistid for $sch_name")
+                or diag "USED SEQUENCE: ".($schema->source('Artist')->column_info('artistid')->{sequence} || '<none>');
+        } "$sch_name liid 1 did not die"
+            or diag "USED SEQUENCE: ".($schema->source('Artist')->column_info('artistid')->{sequence} || '<none>');
+        lives_ok {
+            $another_new = $schema->resultset('Artist')->create({ name => 'Adam Sandler'});
+            is( $another_new->artistid,$start_num+1, "got correct artistid for $sch_name")
+                or diag "USED SEQUENCE: ".($schema->source('Artist')->column_info('artistid')->{sequence} || '<none>');
+        } "$sch_name liid 2 did not die"
+            or diag "USED SEQUENCE: ".($schema->source('Artist')->column_info('artistid')->{sequence} || '<none>');
+
+    }
+
+    lives_ok {
+        apk_t_set($schema,'dbic_t_schema.artist');
+        my $new = $schema->resultset('Artist')->create({ name => 'foo' });
+        is($new->artistid, 4, "Auto-PK worked");
+        $new = $schema->resultset('Artist')->create({ name => 'bar' });
+        is($new->artistid, 5, "Auto-PK worked");
+    } 'old auto-pk tests did not die either';
+
+
+}
+
+
+# sets the artist table name and clears sequence name cache
+sub apk_t_set {
+    my ( $s, $n ) = @_;
+    $s->source("Artist")->name($n);
+    $s->source('Artist')->column_info('artistid')->{sequence} = undef; #< clear sequence name cache
+}
+
+
+sub run_extended_apk_tests {
+    my $schema = shift;
+
+    drop_ext_apk_test_schema($schema);
+    create_ext_apk_test_schema($schema);
+
+
+
+    # drop our auto-pk test schema
+    drop_ext_apk_test_schema($schema);
+}
+
+sub create_ext_apk_test_schema {
+    my $schema = shift;
+    $schema->storage->dbh_do(sub {
+      my (undef,$dbh) = @_;
+
+      local $dbh->{Warn} = 0;
+
+    });
+}
+
+sub drop_ext_apk_test_schema {
+    my ( $schema, $no_warn ) = @_;
+
+    $schema->storage->dbh_do(sub {
+        my (undef,$dbh) = @_;
+
+        local $dbh->{Warn} = 0;
+
+        for my $stat (
+                      ()
+                     ) {
+            eval { $dbh->do ($stat) };
+            diag $@ if $@ && !$no_warn;
+        }
+    });
+}