turn off cascade_delete/copy, set on_delete/update
[dbsrgits/DBIx-Class-Schema-Loader.git] / t / lib / dbixcsl_common_tests.pm
index 75158fa..d8dc3f5 100644 (file)
@@ -10,6 +10,7 @@ use File::Path;
 use DBI;
 use Digest::MD5;
 use File::Find 'find';
+use Class::Unload ();
 
 my $DUMP_DIR = './t/_common_dump';
 rmtree $DUMP_DIR;
@@ -59,46 +60,35 @@ sub _monikerize {
     return undef;
 }
 
-sub _custom_column_info {
-    my ( $table_name, $column_name, $column_info ) = @_;
+sub run_tests {
+    my $self = shift;
 
-    $table_name = lc ( $table_name );
-    $column_name = lc ( $column_name );
+    my @connect_info;
 
-    if ( $table_name eq 'loader_test35' 
-        and $column_name eq 'an_int' 
-    ){
-        return { is_numeric => 1 }
+    if ($self->{dsn}) {
+        push @connect_info, [ @{$self}{qw/dsn user password connect_info_opts/ } ];
     }
-    # Set inflate_datetime or  inflate_date to check 
-    #   datetime_timezone and datetime_locale
-    if ( $table_name eq 'loader_test36' ){
-        return { inflate_datetime => 1 } if 
-            ( $column_name eq 'b_char_as_data' );
-        return { inflate_date => 1 } if 
-            ( $column_name eq 'c_char_as_data' );
+    else {
+        foreach my $info (@{ $self->{connect_info} || [] }) {
+            push @connect_info, [ @{$info}{qw/dsn user password connect_info_opts/ } ];
+        }
     }
 
-    return;
-}
+    plan tests => @connect_info * (171 + ($self->{extra}->{count} || 0));
 
-sub run_tests {
-    my $self = shift;
+    foreach my $info_idx (0..$#connect_info) {
+        my $info = $connect_info[$info_idx];
 
-    plan tests => 159 + ($self->{extra}->{count} || 0);
+        @{$self}{qw/dsn user password connect_info_opts/} = @$info;
 
-    $self->create();
+        $self->create();
 
-    my @connect_info = (
-       $self->{dsn},
-       $self->{user},
-       $self->{password},
-       $self->{connect_info_opts},
-    );
+        my $schema_class = $self->setup_schema(@$info);
+        $self->test_schema($schema_class);
 
-    # First, with in-memory classes
-    my $schema_class = $self->setup_schema(@connect_info);
-    $self->test_schema($schema_class);
+        rmtree $DUMP_DIR
+            unless $ENV{SCHEMA_LOADER_TESTS_NOCLEANUP} && $info_idx == $#connect_info;
+    }
 }
 
 # defined in sub create
@@ -137,6 +127,8 @@ sub setup_schema {
 
     $loader_opts{db_schema} = $self->{db_schema} if $self->{db_schema};
 
+    Class::Unload->unload($schema_class);
+
     my $file_count;
     my $expected_count = 36;
     {
@@ -377,7 +369,7 @@ sub test_schema {
     );
 
     SKIP: {
-        skip $self->{skip_rels}, 101 if $self->{skip_rels};
+        skip $self->{skip_rels}, 113 if $self->{skip_rels};
 
         my $moniker3 = $monikers->{loader_test3};
         my $class3   = $classes->{loader_test3};
@@ -511,12 +503,49 @@ sub test_schema {
         isa_ok( $rs_rel4->first, $class4);
 
         # check rel naming with prepositions
-        ok ($class4->has_relationship('loader_test5s_to'),
+        ok ($rsobj4->result_source->has_relationship('loader_test5s_to'),
             "rel with preposition 'to' pluralized correctly");
 
-        ok ($class4->has_relationship('loader_test5s_from'),
+        ok ($rsobj4->result_source->has_relationship('loader_test5s_from'),
             "rel with preposition 'from' pluralized correctly");
 
+        # check default relationship attributes
+        is $rsobj3->result_source->relationship_info('loader_test4zes')->{attrs}{cascade_delete}, 0,
+            'cascade_delete => 0 on has_many by default';
+
+        is $rsobj3->result_source->relationship_info('loader_test4zes')->{attrs}{cascade_copy}, 0,
+            'cascade_copy => 0 on has_many by default';
+
+        ok ((not exists $rsobj3->result_source->relationship_info('loader_test4zes')->{attrs}{on_delete}),
+            'has_many does not have on_delete');
+
+        ok ((not exists $rsobj3->result_source->relationship_info('loader_test4zes')->{attrs}{on_update}),
+            'has_many does not have on_update');
+
+        is $rsobj4->result_source->relationship_info('fkid_singular')->{attrs}{on_delete}, 'CASCADE',
+            "on_delete => 'CASCADE' on belongs_to by default";
+
+        is $rsobj4->result_source->relationship_info('fkid_singular')->{attrs}{on_update}, 'CASCADE',
+            "on_update => 'CASCADE' on belongs_to by default";
+
+        ok ((not exists $rsobj4->result_source->relationship_info('fkid_singular')->{attrs}{cascade_delete}),
+            'belongs_to does not have cascade_delete');
+
+        ok ((not exists $rsobj4->result_source->relationship_info('fkid_singular')->{attrs}{cascade_copy}),
+            'belongs_to does not have cascade_copy');
+
+        is $rsobj27->result_source->relationship_info('loader_test28')->{attrs}{cascade_delete}, 0,
+            'cascade_delete => 0 on might_have by default';
+
+        is $rsobj27->result_source->relationship_info('loader_test28')->{attrs}{cascade_copy}, 0,
+            'cascade_copy => 0 on might_have by default';
+
+        ok ((not exists $rsobj27->result_source->relationship_info('loader_test28')->{attrs}{on_delete}),
+            'might_have does not have on_delete');
+
+        ok ((not exists $rsobj27->result_source->relationship_info('loader_test28')->{attrs}{on_update}),
+            'might_have does not have on_update');
+
         # find on multi-col pk
         my $obj5 = 
            eval { $rsobj5->find({id1 => 1, iD2 => 1}) } ||
@@ -824,6 +853,8 @@ sub test_schema {
 
     $self->{extra}->{run}->($conn, $monikers, $classes) if $self->{extra}->{run};
 
+    $self->drop_tables unless $ENV{SCHEMA_LOADER_TESTS_NOCLEANUP};
+
     $conn->storage->disconnect;
 }
 
@@ -855,6 +886,7 @@ sub dbconnect {
             RaiseError => $complain,
             ShowErrorStatement => $complain,
             PrintError => 0,
+            %{ $self->{connect_info_opts} || {} },
         },
     ]);
 
@@ -966,8 +998,8 @@ sub create {
                 id1 INTEGER NOT NULL,
                 iD2 INTEGER NOT NULL,
                 dat VARCHAR(8),
-                from_id INTEGER,
-                to_id INTEGER,
+                from_id INTEGER $self->{null},
+                to_id INTEGER $self->{null},
                 PRIMARY KEY (id1,iD2),
                 FOREIGN KEY (from_id) REFERENCES loader_test4 (id),
                 FOREIGN KEY (to_id) REFERENCES loader_test4 (id)
@@ -1430,6 +1462,29 @@ sub drop_tables {
     $dbh->disconnect;
 }
 
+sub _custom_column_info {
+    my ( $table_name, $column_name, $column_info ) = @_;
+
+    $table_name = lc ( $table_name );
+    $column_name = lc ( $column_name );
+
+    if ( $table_name eq 'loader_test35' 
+        and $column_name eq 'an_int' 
+    ){
+        return { is_numeric => 1 }
+    }
+    # Set inflate_datetime or  inflate_date to check 
+    #   datetime_timezone and datetime_locale
+    if ( $table_name eq 'loader_test36' ){
+        return { inflate_datetime => 1 } if 
+            ( $column_name eq 'b_char_as_data' );
+        return { inflate_date => 1 } if 
+            ( $column_name eq 'c_char_as_data' );
+    }
+
+    return;
+}
+
 sub DESTROY {
     my $self = shift;
     unless ($ENV{SCHEMA_LOADER_TESTS_NOCLEANUP}) {