Add test for ContextClosure.
[catagits/Catalyst-Runtime.git] / t / lib / TestApp.pm
1 package TestApp;
2
3 use strict;
4 use Catalyst qw/
5     Test::MangleDollarUnderScore
6     Test::Errors 
7     Test::Headers 
8     Test::Plugin
9     Test::Inline
10     +TestApp::Plugin::FullyQualified
11     +TestApp::Plugin::AddDispatchTypes
12     +TestApp::Role
13 /;
14 use Catalyst::Utils;
15
16 use Moose;
17 use namespace::autoclean;
18
19 our $VERSION = '0.01';
20
21 TestApp->config( name => 'TestApp', root => '/some/dir' );
22
23 if (eval { Class::MOP::load_class('CatalystX::LeakChecker'); 1 }) {
24     with 'CatalystX::LeakChecker';
25
26     has leaks => (
27         is      => 'ro',
28         default => sub { [] },
29     );
30 }
31
32 sub found_leaks {
33     my ($ctx, @leaks) = @_;
34     push @{ $ctx->leaks }, @leaks;
35 }
36
37 sub count_leaks {
38     my ($ctx) = @_;
39     return scalar @{ $ctx->leaks };
40 }
41
42 TestApp->setup;
43
44 sub index : Private {
45     my ( $self, $c ) = @_;
46     $c->res->body('root index');
47 }
48
49 sub global_action : Private {
50     my ( $self, $c ) = @_;
51     $c->forward('TestApp::View::Dump::Request');
52 }
53
54 sub execute {
55     my $c      = shift;
56     my $class  = ref( $c->component( $_[0] ) ) || $_[0];
57     my $action = $_[1]->reverse;
58
59     my $method;
60
61     if ( $action =~ /->(\w+)$/ ) {
62         $method = $1;
63     }
64     elsif ( $action =~ /\/(\w+)$/ ) {
65         $method = $1;
66     }
67     elsif ( $action =~ /^(\w+)$/ ) {
68         $method = $action;
69     }
70
71     if ( $class && $method && $method !~ /^_/ ) {
72         my $executed = sprintf( "%s->%s", $class, $method );
73         my @executed = $c->response->headers->header('X-Catalyst-Executed');
74         push @executed, $executed;
75         $c->response->headers->header(
76             'X-Catalyst-Executed' => join ', ',
77             @executed
78         );
79     }
80
81     return $c->SUPER::execute(@_);
82 }
83
84 # Replace the very large HTML error page with
85 # useful info if something crashes during a test
86 sub finalize_error {
87     my $c = shift;
88     
89     $c->next::method(@_);
90     
91     $c->res->status(500);
92     $c->res->body( 'FATAL ERROR: ' . join( ', ', @{ $c->error } ) );
93 }
94
95 sub class_forward_test_method :Private {
96     my ( $self, $c ) = @_;
97     $c->response->headers->header( 'X-Class-Forward-Test-Method' => 1 );
98 }
99
100 sub loop_test : Local {
101     my ( $self, $c ) = @_;
102
103     for( 1..1001 ) {
104         $c->forward( 'class_forward_test_method' );
105     }
106 }
107
108 sub recursion_test : Local {
109     my ( $self, $c ) = @_;
110     $c->forward( 'recursion_test' );
111 }
112
113 {
114     no warnings 'redefine';
115     sub Catalyst::Log::error { }
116 }
117
118 # Make sure we can load Inline plugins. 
119
120 package Catalyst::Plugin::Test::Inline;
121
122 use strict;
123
124 use base qw/Class::Data::Inheritable/;
125
126 1;