rename t/50addl_base_classes.t from Mark Hedges to t/50rt59849.t
[dbsrgits/DBIx-Class-Schema-Loader.git] / t / 50rt59849.t
diff --git a/t/50rt59849.t b/t/50rt59849.t
new file mode 100644 (file)
index 0000000..9080ed7
--- /dev/null
@@ -0,0 +1,127 @@
+# test for loading additional methods from file-defined packages
+# by Mark Hedges (  hedges   -at|   scriptdolphin.com )
+
+use strict;
+use Test::More tests => 7 * 5;
+use Test::Exception;
+
+use lib 't/lib';
+
+use make_dbictest_db;
+
+use DBIx::Class::Schema::Loader;
+
+$ENV{SCHEMA_LOADER_BACKCOMPAT} = 1;
+
+# In the first test run, then, Foo should be a DBICTestMethods::Namespaces::Schema::Result::Foo
+
+run_test_sequence(
+    testname        => "naming => 'current'",
+    schema_class    => 'DBICTestMethods::Namespaces::Schema',
+    foo_class       => 'DBICTestMethods::Namespaces::Schema::Result::Foo',
+    schema_opts     => {
+        naming => 'current',
+    },
+);
+
+# In the second test run with use_namespaces => 0 (backcompat), Foo should be a DBICTestMethods::Backcompat::Schema
+
+run_test_sequence(
+    testname        => "naming => 'current', use_namespaces => 0",
+    schema_class    => 'DBICTestMethods::Backcompat::Schema',
+    foo_class       => 'DBICTestMethods::Backcompat::Schema::Foo',
+    schema_opts     => {
+        naming              => 'current',
+        use_namespaces      => 0,
+    },
+);
+
+# In the third test, with use_namespaces => 1, Foo gets the explicit Result class again
+
+run_test_sequence(
+    testname        => "naming => 'current', use_namespaces => 1",
+    schema_class    => 'DBICTestMethods::Namespaces::Schema',
+    foo_class        => 'DBICTestMethods::Namespaces::Schema::Result::Foo',
+    schema_opts     => {
+        naming              => 'current',
+        use_namespaces      => 1,
+    },
+);
+
+# try it in full backcompat 0.04006 mode with no schema options
+
+run_test_sequence(
+    testname        => "no naming or namespaces options (0.04006 mode)",
+    schema_class    => 'DBICTestMethods::Backcompat::Schema',
+    foo_class        => 'DBICTestMethods::Backcompat::Schema::Foo',
+    schema_opts     => {
+    },
+);
+
+# try it in backcompat mode (no naming option) but with use_namespaces => 1
+
+run_test_sequence(
+    testname        => "no naming, but with use_namespaces options (0.04006 mode)",
+    schema_class    => 'DBICTestMethods::Namespaces::Schema',
+    foo_class        => 'DBICTestMethods::Namespaces::Schema::Result::Foo',
+    schema_opts     => {
+        use_namespaces      => 1,
+    },
+);
+
+sub run_test_sequence {
+    my %p = @_;
+    die "specify a $_ test param" for grep !$p{$_}, 
+        qw( testname schema_opts schema_class foo_class );
+
+    my $schema; 
+    lives_ok { $schema = make_schema_with(%p) } "($p{testname}) get schema";
+
+    SKIP: {
+        skip 'no point in checking if schema could not be connected', 6 unless defined $schema;
+
+        # well, if that worked, try to get a ResultSet
+        my $foo_rs;
+        lives_ok {
+            $foo_rs = $schema->resultset('Foo')->search();
+        } "($p{testname}) get a ResultSet for Foo";
+    
+        # get a foo
+        my $foo;
+        lives_ok {
+            $foo = $foo_rs->first();
+        } "($p{testname}) get the first foo";
+    
+        ok(defined $foo, "($p{testname}) \$foo is defined");
+    
+        SKIP: {
+            skip 'foo is not defined', 3 unless defined $foo;
+    
+            isa_ok $foo, $p{foo_class};
+    
+            # call the file-defined method
+            my $biz;
+            lives_ok {
+                $biz = $foo->biz();
+            } "($p{testname}) call the file-defined Foo->biz method";
+    
+            SKIP: {
+                skip 'no point in checking value if method was not found', 1 unless defined $biz;
+        
+                ok(
+                    $biz eq 'foo bar biz baz boz noz schnozz', 
+                    "($p{testname}) biz() method returns correct string"
+                );
+            }
+        }
+    }
+}
+    
+sub make_schema_with {
+    my %p = @_;
+    return DBIx::Class::Schema::Loader::make_schema_at(
+        $p{schema_class},
+        $p{schema_opts},
+        [ $make_dbictest_db::dsn ],
+    );
+}