first cut at :ChildOf
[catagits/Catalyst-Runtime.git] / t / unit_core_component_loading.t
CommitLineData
0756fe3b 1# 2 initial tests, and 6 per component in the loop below
2# (do not forget to update the number of components in test 3 as well)
18de900e 3# 4 extra tests for the loading options
4use Test::More tests => 2 + 6 * 24 + 4;
0756fe3b 5
6use strict;
7use warnings;
8
9use File::Spec;
10use File::Path;
11
12my $libdir = 'test_trash';
13unshift(@INC, $libdir);
14
15my $appclass = 'TestComponents';
16my @components = (
17 { type => 'Controller', prefix => 'C', name => 'Bar' },
18 { type => 'Controller', prefix => 'C', name => 'Foo::Bar' },
19 { type => 'Controller', prefix => 'C', name => 'Foo::Foo::Bar' },
20 { type => 'Controller', prefix => 'C', name => 'Foo::Foo::Foo::Bar' },
21 { type => 'Controller', prefix => 'Controller', name => 'Bar::Bar::Bar::Foo' },
22 { type => 'Controller', prefix => 'Controller', name => 'Bar::Bar::Foo' },
23 { type => 'Controller', prefix => 'Controller', name => 'Bar::Foo' },
24 { type => 'Controller', prefix => 'Controller', name => 'Foo' },
25 { type => 'Model', prefix => 'M', name => 'Bar' },
26 { type => 'Model', prefix => 'M', name => 'Foo::Bar' },
27 { type => 'Model', prefix => 'M', name => 'Foo::Foo::Bar' },
28 { type => 'Model', prefix => 'M', name => 'Foo::Foo::Foo::Bar' },
29 { type => 'Model', prefix => 'Model', name => 'Bar::Bar::Bar::Foo' },
30 { type => 'Model', prefix => 'Model', name => 'Bar::Bar::Foo' },
31 { type => 'Model', prefix => 'Model', name => 'Bar::Foo' },
32 { type => 'Model', prefix => 'Model', name => 'Foo' },
33 { type => 'View', prefix => 'V', name => 'Bar' },
34 { type => 'View', prefix => 'V', name => 'Foo::Bar' },
35 { type => 'View', prefix => 'V', name => 'Foo::Foo::Bar' },
36 { type => 'View', prefix => 'V', name => 'Foo::Foo::Foo::Bar' },
37 { type => 'View', prefix => 'View', name => 'Bar::Bar::Bar::Foo' },
38 { type => 'View', prefix => 'View', name => 'Bar::Bar::Foo' },
39 { type => 'View', prefix => 'View', name => 'Bar::Foo' },
40 { type => 'View', prefix => 'View', name => 'Foo' },
41);
42
43sub make_component_file {
44 my ($type, $prefix, $name) = @_;
45
46 my $compbase = "Catalyst::${type}";
47 my $fullname = "${appclass}::${prefix}::${name}";
48 my @namedirs = split(/::/, $name);
49 my $name_final = pop(@namedirs);
50 my @dir_list = ($libdir, $appclass, $prefix, @namedirs);
51 my $dir_ux = join(q{/}, @dir_list);
52 my $dir = File::Spec->catdir(@dir_list);
53 my $file = File::Spec->catfile($dir, $name_final . '.pm');
54
55 mkpath($dir_ux); # mkpath wants unix '/' seperators :p
56 open(my $fh, '>', $file) or die "Could not open file $file for writing: $!";
57 print $fh <<EOF;
58package $fullname;
59use base '$compbase';
60sub COMPONENT {
61 my \$self = shift->NEXT::COMPONENT(\@_);
62 no strict 'refs';
63 *{\__PACKAGE__ . "::whoami"} = sub { return \__PACKAGE__; };
64 \$self;
65}
661;
67
68EOF
69
70 close($fh);
71}
72
73foreach my $component (@components) {
74 make_component_file($component->{type},
75 $component->{prefix},
76 $component->{name});
77}
78
79eval "package $appclass; use Catalyst; __PACKAGE__->setup";
80
81can_ok( $appclass, 'components');
82
83my $complist = $appclass->components;
84
85# the +1 below is for the app class itself
86is(scalar keys %$complist, 24+1, "Correct number of components loaded");
87
88foreach (keys %$complist) {
89
90 # Skip the component which happens to be the app itself
91 next if $_ eq $appclass;
92
93 my $instance = $appclass->component($_);
94 isa_ok($instance, $_);
95 can_ok($instance, 'whoami');
96 is($instance->whoami, $_);
97
98 if($_ =~ /^${appclass}::(?:V|View)::(.*)/) {
99 my $moniker = $1;
100 isa_ok($instance, 'Catalyst::View');
101 can_ok($appclass->view($moniker), 'whoami');
102 is($appclass->view($moniker)->whoami, $_);
103 }
104 elsif($_ =~ /^${appclass}::(?:M|Model)::(.*)/) {
105 my $moniker = $1;
106 isa_ok($instance, 'Catalyst::Model');
107 can_ok($appclass->model($moniker), 'whoami');
108 is($appclass->model($moniker)->whoami, $_);
109 }
110 elsif($_ =~ /^${appclass}::(?:C|Controller)::(.*)/) {
111 my $moniker = $1;
112 isa_ok($instance, 'Catalyst::Controller');
113 can_ok($appclass->controller($moniker), 'whoami');
114 is($appclass->controller($moniker)->whoami, $_);
115 }
116 else {
117 die "Something is wrong with this test, this should"
118 . " have been unreachable";
119 }
120}
121
122rmtree($libdir);
18de900e 123
124# test extra component loading options
125
126$appclass = 'ExtraOptions';
127push @components, { type => 'View', prefix => 'Extra', name => 'Foo' };
128
129foreach my $component (@components) {
130 make_component_file($component->{type},
131 $component->{prefix},
132 $component->{name});
133}
134
135eval qq(
136package $appclass;
137use Catalyst;
138__PACKAGE__->config->{ setup_components } = {
139 search_extra => [ '::Extra' ],
140 except => [ "${appclass}::Controller::Foo" ]
141};
142__PACKAGE__->setup;
143);
144
145can_ok( $appclass, 'components');
146
147$complist = $appclass->components;
148
149is(scalar keys %$complist, 24+1, "Correct number of components loaded");
150
2d486591 151ok( !exists $complist->{ "${appclass}::Controller::Foo" }, 'Controller::Foo was skipped' );
152ok( exists $complist->{ "${appclass}::Extra::Foo" }, 'Extra::Foo was loaded' );
18de900e 153
154rmtree($libdir);