rework component resolution methods (i.e. model(), models(), etc), plus add in some...
[catagits/Catalyst-Runtime.git] / t / unit_core_mvc.t
1 use Test::More tests => 37;
2 use strict;
3 use warnings;
4
5 use_ok('Catalyst');
6
7 my @complist =
8   map { "MyApp::$_"; }
9   qw/C::Controller M::Model V::View Controller::C Model::M View::V Controller::Model::Dummy::Model Model::Dummy::Model/;
10
11 my $thingie={};
12 bless $thingie,'MyApp::Model::Test::Object';
13 push @complist,$thingie;
14 {
15
16     package MyApp;
17
18     use base qw/Catalyst/;
19
20     __PACKAGE__->components( { map { ( ref($_)||$_ , $_ ) } @complist } );
21
22     # allow $c->log->warn to work
23     __PACKAGE__->setup_log;
24 }
25
26 is( MyApp->view('View'), 'MyApp::V::View', 'V::View ok' );
27
28 is( MyApp->controller('Controller'),
29     'MyApp::C::Controller', 'C::Controller ok' );
30
31 is( MyApp->model('Model'), 'MyApp::M::Model', 'M::Model ok' );
32
33 is( MyApp->model('Dummy::Model'), 'MyApp::Model::Dummy::Model', 'Model::Dummy::Model ok' );
34
35 isa_ok( MyApp->model('Test::Object'), 'MyApp::Model::Test::Object', 'Test::Object ok' );
36
37 is( MyApp->controller('Model::Dummy::Model'), 'MyApp::Controller::Model::Dummy::Model', 'Controller::Model::Dummy::Model ok' );
38
39 is( MyApp->view('V'), 'MyApp::View::V', 'View::V ok' );
40
41 is( MyApp->controller('C'), 'MyApp::Controller::C', 'Controller::C ok' );
42
43 is( MyApp->model('M'), 'MyApp::Model::M', 'Model::M ok' );
44
45 # failed search
46 {
47     is( MyApp->model('DNE'), undef, 'undef for invalid search' );
48 }
49
50 is_deeply( [ sort MyApp->views ],
51            [ qw/V View/ ],
52            'views ok' );
53
54 is_deeply( [ sort MyApp->controllers ],
55            [ qw/C Controller Model::Dummy::Model/ ],
56            'controllers ok');
57
58 is_deeply( [ sort MyApp->models ],
59            [ qw/Dummy::Model M Model Test::Object/ ],
60            'models ok');
61
62 {
63     my $warnings = 0;
64     no warnings 'redefine';
65     local *Catalyst::Log::warn = sub { $warnings++ };
66
67     like (MyApp->view , qr/^MyApp\::(V|View)\::/ , 'view() with no defaults returns *something*');
68     ok( $warnings, 'view() w/o a default is random, warnings thrown' );
69 }
70
71 is ( bless ({stash=>{current_view=>'V'}}, 'MyApp')->view , 'MyApp::View::V', 'current_view ok');
72
73 my $view = bless {} , 'MyApp::View::V'; 
74 is ( bless ({stash=>{current_view_instance=> $view }}, 'MyApp')->view , $view, 'current_view_instance ok');
75
76 is ( bless ({stash=>{current_view_instance=> $view, current_view=>'MyApp::V::View' }}, 'MyApp')->view , $view, 
77   'current_view_instance precedes current_view ok');
78
79 {
80     my $warnings = 0;
81     no warnings 'redefine';
82     local *Catalyst::Log::warn = sub { $warnings++ };
83
84     like (MyApp->model , qr/^MyApp\::(M|Model)\::/ , 'model() with no defaults returns *something*');
85     ok( $warnings, 'model() w/o a default is random, warnings thrown' );
86 }
87
88 is ( bless ({stash=>{current_model=>'M'}}, 'MyApp')->model , 'MyApp::Model::M', 'current_model ok');
89
90 my $model = bless {} , 'MyApp::Model::M'; 
91 is ( bless ({stash=>{current_model_instance=> $model }}, 'MyApp')->model , $model, 'current_model_instance ok');
92
93 is ( bless ({stash=>{current_model_instance=> $model, current_model=>'MyApp::M::Model' }}, 'MyApp')->model , $model, 
94   'current_model_instance precedes current_model ok');
95
96 MyApp->config->{default_view} = 'V';
97 is ( bless ({stash=>{}}, 'MyApp')->view , 'MyApp::View::V', 'default_view ok');
98 is ( MyApp->view , 'MyApp::View::V', 'default_view in class method ok');
99
100 MyApp->config->{default_model} = 'M';
101 is ( bless ({stash=>{}}, 'MyApp')->model , 'MyApp::Model::M', 'default_model ok');
102 is ( MyApp->model , 'MyApp::Model::M', 'default_model in class method ok');
103
104 # regexp behavior tests
105 {
106     # is_deeply is used because regexp behavior means list context
107     is_deeply( [ MyApp->view( qr{^V[ie]+w$} ) ], [ 'MyApp::V::View' ], 'regexp view ok' );
108     is_deeply( [ MyApp->controller( qr{Dummy\::Model$} ) ], [ 'MyApp::Controller::Model::Dummy::Model' ], 'regexp controller ok' );
109     is_deeply( [ MyApp->model( qr{Dum{2}y} ) ], [ 'MyApp::Model::Dummy::Model' ], 'regexp model ok' );
110 }
111
112 {
113     my @expected = qw( MyApp::C::Controller MyApp::Controller::C );
114     is_deeply( [ sort MyApp->controller( qr{^C} ) ], \@expected, 'multiple controller returns from regexp search' );
115 }
116
117 {
118     my @expected = qw( MyApp::V::View MyApp::View::V );
119     is_deeply( [ sort MyApp->view( qr{^V} ) ], \@expected, 'multiple view returns from regexp search' );
120 }
121
122 {
123     my @expected = qw( MyApp::M::Model MyApp::Model::M );
124     is_deeply( [ sort MyApp->model( qr{^M} ) ], \@expected, 'multiple model returns from regexp search' );
125 }
126
127 # failed search
128 {
129     is( scalar MyApp->controller( qr{DNE} ), 0, '0 results for failed search' );
130 }
131
132 #checking @args passed to ACCEPT_CONTEXT
133 my $args;
134 {
135     no warnings; 
136     *MyApp::Model::M::ACCEPT_CONTEXT = sub { my ($self, $c, @args) = @_; $args= \@args};
137     *MyApp::View::V::ACCEPT_CONTEXT = sub { my ($self, $c, @args) = @_; $args= \@args};
138
139 MyApp->model('M', qw/foo bar/);
140 is_deeply($args, [qw/foo bar/], '$c->model args passed to ACCEPT_CONTEXT ok');
141 MyApp->view('V', qw/baz moo/);
142 is_deeply($args, [qw/baz moo/], '$c->view args passed to ACCEPT_CONTEXT ok');
143