aa0c4fcf620349c93361d2c97757f5a348851797
[catagits/Catalyst-Runtime.git] / t / aggregate / unit_core_component_setup.t
1 package TestAppComponents;
2 use warnings;
3 use strict;
4 use base 'Catalyst';
5
6 sub locate_components {
7     my @comps;
8     push @comps, "TestAppComponents::$_" for qw/
9         C::Bar
10         C::Foo::Bar
11         C::Foo::Foo::Bar
12         C::Foo::Foo::Foo::Bar
13         Controller::Bar::Bar::Bar::Foo
14         Controller::Bar::Bar::Foo
15         Controller::Bar::Foo
16         Controller::Foo
17         M::Bar
18         M::Foo::Bar
19         M::Foo::Foo::Bar
20         M::Foo::Foo::Foo::Bar
21         Model::Bar::Bar::Bar::Foo
22         Model::Bar::Bar::Foo
23         Model::Bar::Foo
24         Model::Foo
25         V::Bar
26         V::Foo::Bar
27         V::Foo::Foo::Bar
28         V::Foo::Foo::Foo::Bar
29         View::Bar::Bar::Bar::Foo
30         View::Bar::Bar::Foo
31         View::Bar::Foo
32         View::Foo
33     /;
34     return @comps;
35 }
36
37 __PACKAGE__->components( {} );
38
39 # this is so $c->container will work
40 __PACKAGE__->setup_config;
41
42 # this is so $c->log->warn will work
43 __PACKAGE__->setup_log;
44
45 for my $component (TestAppComponents->locate_components) {
46     my $classname = "$component";
47     eval <<COMPONENT;
48 package $classname;
49 use warnings;
50 use strict;
51 use base 'Catalyst::Component';
52
53 1;
54 COMPONENT
55 }
56
57 package main;
58 use strict;
59 use warnings;
60
61 use Test::More;
62
63 my @comps = TestAppComponents->locate_components;
64
65 {
66     my @loaded_comps;
67     my $warnings = 0;
68
69     no warnings 'redefine';
70
71     local *Catalyst::Log::warn = sub { $warnings++ };
72     local *Catalyst::Utils::ensure_class_loaded = sub { my $class = shift; push @loaded_comps, $class; };
73
74     eval { TestAppComponents->setup_components };
75
76     ok( !$@, "setup_components doesnt die" );
77     ok( $warnings, "it warns about deprecated names" );
78     is_deeply( \@comps, \@loaded_comps, 'all components loaded' );
79 }
80
81 my @controllers = @comps[0..7];
82 my @models      = @comps[8..15];
83 my @views       = @comps[16..23];
84 my $container   = TestAppComponents->container;
85
86 is_deeply(
87     [ sort $container->get_sub_container('controller')->get_service_list ],
88     [ sort @controllers ],
89     'controllers are in the container',
90 );
91
92 is_deeply(
93     [ sort $container->get_sub_container('model')->get_service_list ],
94     [ sort @models ],
95     'models are in the container',
96 );
97
98 is_deeply(
99     [ sort $container->get_sub_container('view')->get_service_list ],
100     [ sort @views ],
101     'views are in the container',
102 );
103
104 is_deeply(
105     [ sort keys %{ TestAppComponents->components } ],
106     [ sort @comps ],
107     'all components are in the components accessor'
108 );
109
110 done_testing();