add test (and fix) for loading external custom content from unsingularized results...
[dbsrgits/DBIx-Class-Schema-Loader.git] / t / 25backcompat_v4.t
index b4a6f74..993d128 100644 (file)
@@ -12,87 +12,6 @@ my $DUMP_DIR = './t/_common_dump';
 rmtree $DUMP_DIR;
 my $SCHEMA_CLASS = 'DBIXCSL_Test::Schema';
 
-sub run_loader {
-    my %loader_opts = @_;
-
-    eval {
-        foreach my $source_name ($SCHEMA_CLASS->clone->sources) {
-            Class::Unload->unload("${SCHEMA_CLASS}::${source_name}");
-        }
-
-        Class::Unload->unload($SCHEMA_CLASS);
-    };
-    undef $@;
-
-    my @connect_info = $make_dbictest_db2::dsn;
-    my @loader_warnings;
-    local $SIG{__WARN__} = sub { push(@loader_warnings, $_[0]); };
-    eval qq{
-        package $SCHEMA_CLASS;
-        use base qw/DBIx::Class::Schema::Loader/;
-
-        __PACKAGE__->loader_options(\%loader_opts);
-        __PACKAGE__->connection(\@connect_info);
-    };
-
-    ok(!$@, "Loader initialization") or diag $@;
-
-    my $schema = $SCHEMA_CLASS->clone;
-    my (%monikers, %classes);
-    foreach my $source_name ($schema->sources) {
-        my $table_name = $schema->source($source_name)->from;
-        $monikers{$table_name} = $source_name;
-        $classes{$table_name}  = "${SCHEMA_CLASS}::${source_name}";
-    }
-
-    return {
-        schema => $schema,
-        warnings => \@loader_warnings,
-        monikers => \%monikers,
-        classes => \%classes,
-    };
-}
-
-sub run_v4_tests {
-    my $res = shift;
-    my $schema = $res->{schema};
-
-    is_deeply [ @{ $res->{monikers} }{qw/foos bar bazs quuxs/} ],
-        [qw/Foos Bar Bazs Quuxs/],
-        'correct monikers in 0.04006 mode';
-
-    isa_ok ((my $bar = eval { $schema->resultset('Bar')->find(1) }),
-        $res->{classes}{bar},
-        'found a bar');
-
-    isa_ok eval { $bar->foo_id }, $res->{classes}{foos},
-        'correct rel name in 0.04006 mode';
-
-    ok my $baz  = eval { $schema->resultset('Bazs')->find(1) };
-
-    isa_ok eval { $baz->quux }, 'DBIx::Class::ResultSet',
-        'correct rel type and name for UNIQUE FK in 0.04006 mode';
-}
-
-sub run_v5_tests {
-    my $res = shift;
-    my $schema = $res->{schema};
-
-    is_deeply [ @{ $res->{monikers} }{qw/foos bar bazs quuxs/} ],
-        [qw/Foo Bar Baz Quux/],
-        'correct monikers in current mode';
-
-    ok my $bar = eval { $schema->resultset('Bar')->find(1) };
-
-    isa_ok eval { $bar->foo }, $res->{classes}{foos},
-        'correct rel name in current mode';
-
-    ok my $baz  = eval { $schema->resultset('Baz')->find(1) };
-
-    isa_ok eval { $baz->quux }, $res->{classes}{quuxs},
-        'correct rel type and name for UNIQUE FK in current mode';
-}
-
 # test dynamic schema in 0.04006 mode
 {
     my $res = run_loader();
@@ -169,17 +88,47 @@ EOF
     pop @INC;
 }
 
+# test upgraded static schema with external content loaded
+{
+    my $temp_dir = tempdir;
+    push @INC, $temp_dir;
+
+    my $external_result_dir = join '/', $temp_dir, split /::/, $SCHEMA_CLASS;
+    make_path $external_result_dir;
+
+    IO::File->new(">$external_result_dir/Quuxs.pm")->print(<<"EOF");
+package ${SCHEMA_CLASS}::Quuxs;
+sub a_method { 'dongs' }
+1;
+EOF
+
+    write_v4_schema_pm();
+
+    my $res = run_loader(dump_directory => $DUMP_DIR, naming => 'current');
+    my $schema = $res->{schema};
+
+    run_v5_tests($res);
+
+    is eval { $schema->resultset('Quux')->find(1)->a_method }, 'dongs',
+'external custom content for unsingularized Result was loaded by upgraded ' .
+'static Schema';
+
+    my $file = $schema->_loader->_get_dump_filename($res->{classes}{quuxs});
+    my $code = do { local ($/, @ARGV) = (undef, $file); <> };
+
+    like $code, qr/package ${SCHEMA_CLASS}::Quux;/,
+'package line translated correctly from external custom content in static dump';
+
+    like $code, qr/sub a_method { 'dongs' }/,
+'external custom content loaded into static dump correctly';
+
+    rmtree $temp_dir;
+    pop @INC;
+}
+
 # test running against v4 schema without upgrade
 {
-    # write out the 0.04006 Schema.pm we have in __DATA__
-    (my $schema_dir = "$DUMP_DIR/$SCHEMA_CLASS") =~ s/::[^:]+\z//;
-    make_path $schema_dir;
-    my $schema_pm = "$schema_dir/Schema.pm";
-    open my $fh, '>', $schema_pm or die $!;
-    while (<DATA>) {
-        print $fh $_;
-    }
-    close $fh;
+    write_v4_schema_pm();
 
     # now run the loader
     my $res = run_loader(dump_directory => $DUMP_DIR);
@@ -247,9 +196,54 @@ END {
     rmtree $DUMP_DIR unless $ENV{SCHEMA_LOADER_TESTS_NOCLEANUP};
 }
 
-# a Schema.pm made with 0.04006
+sub run_loader {
+    my %loader_opts = @_;
+
+    eval {
+        foreach my $source_name ($SCHEMA_CLASS->clone->sources) {
+            Class::Unload->unload("${SCHEMA_CLASS}::${source_name}");
+        }
+
+        Class::Unload->unload($SCHEMA_CLASS);
+    };
+    undef $@;
+
+    my @connect_info = $make_dbictest_db2::dsn;
+    my @loader_warnings;
+    local $SIG{__WARN__} = sub { push(@loader_warnings, $_[0]); };
+    eval qq{
+        package $SCHEMA_CLASS;
+        use base qw/DBIx::Class::Schema::Loader/;
+
+        __PACKAGE__->loader_options(\%loader_opts);
+        __PACKAGE__->connection(\@connect_info);
+    };
+
+    ok(!$@, "Loader initialization") or diag $@;
+
+    my $schema = $SCHEMA_CLASS->clone;
+    my (%monikers, %classes);
+    foreach my $source_name ($schema->sources) {
+        my $table_name = $schema->source($source_name)->from;
+        $monikers{$table_name} = $source_name;
+        $classes{$table_name}  = "${SCHEMA_CLASS}::${source_name}";
+    }
+
+    return {
+        schema => $schema,
+        warnings => \@loader_warnings,
+        monikers => \%monikers,
+        classes => \%classes,
+    };
+}
 
-__DATA__
+sub write_v4_schema_pm {
+    (my $schema_dir = "$DUMP_DIR/$SCHEMA_CLASS") =~ s/::[^:]+\z//;
+    rmtree $schema_dir;
+    make_path $schema_dir;
+    my $schema_pm = "$schema_dir/Schema.pm";
+    open my $fh, '>', $schema_pm or die $!;
+    print $fh <<'EOF';
 package DBIXCSL_Test::Schema;
 
 use strict;
@@ -266,4 +260,45 @@ __PACKAGE__->load_classes;
 
 # You can replace this text with custom content, and it will be preserved on regeneration
 1;
+EOF
+}
+
+sub run_v4_tests {
+    my $res = shift;
+    my $schema = $res->{schema};
+
+    is_deeply [ @{ $res->{monikers} }{qw/foos bar bazs quuxs/} ],
+        [qw/Foos Bar Bazs Quuxs/],
+        'correct monikers in 0.04006 mode';
+
+    isa_ok ((my $bar = eval { $schema->resultset('Bar')->find(1) }),
+        $res->{classes}{bar},
+        'found a bar');
+
+    isa_ok eval { $bar->foo_id }, $res->{classes}{foos},
+        'correct rel name in 0.04006 mode';
 
+    ok my $baz  = eval { $schema->resultset('Bazs')->find(1) };
+
+    isa_ok eval { $baz->quux }, 'DBIx::Class::ResultSet',
+        'correct rel type and name for UNIQUE FK in 0.04006 mode';
+}
+
+sub run_v5_tests {
+    my $res = shift;
+    my $schema = $res->{schema};
+
+    is_deeply [ @{ $res->{monikers} }{qw/foos bar bazs quuxs/} ],
+        [qw/Foo Bar Baz Quux/],
+        'correct monikers in current mode';
+
+    ok my $bar = eval { $schema->resultset('Bar')->find(1) };
+
+    isa_ok eval { $bar->foo }, $res->{classes}{foos},
+        'correct rel name in current mode';
+
+    ok my $baz  = eval { $schema->resultset('Baz')->find(1) };
+
+    isa_ok eval { $baz->quux }, $res->{classes}{quuxs},
+        'correct rel type and name for UNIQUE FK in current mode';
+}