--- /dev/null
+# 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 ],
+ );
+}