include test for failure mode
[catagits/Catalyst-Runtime.git] / t / unit_core_component_loading.t
index a01edf0..d27b9b7 100644 (file)
@@ -1,6 +1,7 @@
 # 2 initial tests, and 6 per component in the loop below
 # (do not forget to update the number of components in test 3 as well)
-use Test::More tests => 2 + 6 * 24;
+# 5 extra tests for the loading options
+use Test::More tests => 2 + 6 * 24 + 5;
 
 use strict;
 use warnings;
@@ -8,6 +9,8 @@ use warnings;
 use File::Spec;
 use File::Path;
 
+use Test::MockObject;
+
 my $libdir = 'test_trash';
 unshift(@INC, $libdir);
 
@@ -39,6 +42,18 @@ my @components = (
     { type => 'View', prefix => 'View', name => 'Foo' },
 );
 
+sub write_component_file { 
+  my ($dir_list, $module_name, $content) = @_;
+
+  my $dir  = File::Spec->catdir(@$dir_list);
+  my $file = File::Spec->catfile($dir, $module_name . '.pm');
+
+  mkpath(join(q{/}, @$dir_list) );
+  open(my $fh, '>', $file) or die "Could not open file $file for writing: $!";
+  print $fh $content;
+  close $fh;
+}
+
 sub make_component_file {
     my ($type, $prefix, $name) = @_;
 
@@ -47,17 +62,13 @@ sub make_component_file {
     my @namedirs = split(/::/, $name);
     my $name_final = pop(@namedirs);
     my @dir_list = ($libdir, $appclass, $prefix, @namedirs);
-    my $dir_ux   = join(q{/}, @dir_list);
-    my $dir      = File::Spec->catdir(@dir_list);
-    my $file     = File::Spec->catfile($dir, $name_final . '.pm');
 
-    mkpath($dir_ux); # mkpath wants unix '/' seperators :p
-    open(my $fh, '>', $file) or die "Could not open file $file for writing: $!";
-    print $fh <<EOF;
+    write_component_file(\@dir_list, $name_final, <<EOF);
 package $fullname;
+use MRO::Compat;
 use base '$compbase';
 sub COMPONENT {
-    my \$self = shift->NEXT::COMPONENT(\@_);
+    my \$self = shift->next::method(\@_);
     no strict 'refs';
     *{\__PACKAGE__ . "::whoami"} = sub { return \__PACKAGE__; };
     \$self;
@@ -65,8 +76,6 @@ sub COMPONENT {
 1;
 
 EOF
-
-    close($fh);
 }
 
 foreach my $component (@components) {
@@ -75,7 +84,19 @@ foreach my $component (@components) {
                         $component->{name});
 }
 
-eval "package $appclass; use Catalyst; __PACKAGE__->setup";
+my $shut_up_deprecated_warnings = q{
+    use Test::MockObject;
+    my $old_logger = __PACKAGE__->log;
+    my $logger = Test::MockObject->new;
+    $logger->mock('warn', sub { 
+        my $self = shift;
+        return if $_[0] =~ /deprecated/;
+        $old_logger->warn(@_);
+    });
+    __PACKAGE__->log($logger);
+};
+
+eval "package $appclass; use Catalyst; $shut_up_deprecated_warnings __PACKAGE__->setup";
 
 can_ok( $appclass, 'components');
 
@@ -119,3 +140,73 @@ foreach (keys %$complist) {
 }
 
 rmtree($libdir);
+
+# test extra component loading options
+
+$appclass = 'ExtraOptions';
+push @components, { type => 'View', prefix => 'Extra', name => 'Foo' };
+
+foreach my $component (@components) {
+    make_component_file($component->{type},
+                        $component->{prefix},
+                        $component->{name});
+}
+
+eval qq(
+package $appclass;
+use Catalyst;
+$shut_up_deprecated_warnings
+__PACKAGE__->config->{ setup_components } = {
+    search_extra => [ '::Extra' ],
+    except       => [ "${appclass}::Controller::Foo" ]
+};
+__PACKAGE__->setup;
+);
+
+can_ok( $appclass, 'components');
+
+$complist = $appclass->components;
+
+is(scalar keys %$complist, 24+1, "Correct number of components loaded");
+
+ok( !exists $complist->{ "${appclass}::Controller::Foo" }, 'Controller::Foo was skipped' );
+ok( exists $complist->{ "${appclass}::Extra::Foo" }, 'Extra::Foo was loaded' );
+
+rmtree($libdir);
+
+$appclass = "ComponentOnce";
+
+write_component_file([$libdir, $appclass, 'Model'], 'TopLevel', <<EOF);
+package ${appclass}::Model::TopLevel;
+use base 'Catalyst::Model';
+sub COMPONENT {
+    my \$self = shift->next::method(\@_);
+    no strict 'refs';
+    *{\__PACKAGE__ . "::whoami"} = sub { return \__PACKAGE__; };
+    \$self;
+}
+
+package ${appclass}::Model::TopLevel::Nested;
+
+sub COMPONENT { die "COMPONENT called in the wrong order!"; }
+
+1;
+
+EOF
+
+write_component_file([$libdir, $appclass, 'Model', 'TopLevel'], 'Nested', <<EOF);
+package ${appclass}::Model::TopLevel::Nested;
+use base 'Catalyst::Model';
+
+no warnings 'redefine';
+sub COMPONENT { return shift->next::method(\@_); }
+1;
+
+EOF
+
+eval "package $appclass; use Catalyst; __PACKAGE__->setup";
+
+is($@, '', "Didn't load component twice");
+
+rmtree($libdir);