drop namespace::autoclean
[catagits/Catalyst-Runtime.git] / t / psgi-log.t
1 =head1 PROBLEM
2
3 In https://github.com/plack/Plack/commit/cafa5db84921f020183a9c834fd6a4541e5a6b84
4 chansen made a change to the FCGI handler in Plack, in which he replaced
5 STDERR, STDOUT and STDIN with proper IO::Handle objects.
6
7 The side effect of that change is that catalyst outputing logs on STDERR will
8 no longer end up by default in the error log of the webserver when running
9 under FCGI. This test tries to make sure we use the propper parts of the psgi
10 environment when we output things from Catalyst::Log.
11
12 There is one more "regression", and that is warnings. By using
13 Catalyst::Plugin::LogWarnings, you also get those in the right place if this
14 test passes :)
15
16 =cut
17
18 use strict;
19 use warnings;
20 no warnings 'once';
21 use FindBin;
22 use lib "$FindBin::Bin/lib";
23
24 use Test::More;
25
26 use File::Spec;
27 use File::Temp qw/ tempdir /;
28
29 use TestApp;
30
31 use Plack::Builder;
32 use Plack::Test;
33 use HTTP::Request::Common;
34
35 {
36     package MockHandle;
37     use Moose;
38
39     has 'log' => (is => 'ro', isa => 'ArrayRef', traits => ['Array'], default => sub { [] },
40         handles => {
41             'logs' => 'elements',
42             'print' => 'push',
43         }
44     );
45
46     no Moose;
47 }
48
49 my $cmp = TestApp->debug ? '>=' : '==';
50
51 #subtest "psgi.errors" => sub
52 {
53
54     my $handle = MockHandle->new();
55     my $app = builder {
56
57         enable sub {
58             my $app = shift;
59             sub {
60                 my $env = shift;
61                 $env->{'psgi.errors'} = $handle;
62                 my $res = $app->($env);
63                 return $res;
64             };
65         };
66         TestApp->psgi_app;
67     };
68
69
70     test_psgi $app, sub {
71         my $cb = shift;
72         my $res = $cb->(GET "/log/info");
73         my @logs = $handle->logs;
74         cmp_ok(scalar(@logs), $cmp, 1, "psgi.errors: one event output");
75         like($logs[0], qr/info$/m, "psgi.errors: event matches test data") unless TestApp->debug;
76     };
77 };
78
79 #subtest "psgix.logger" => sub
80 {
81
82     my @logs;
83     my $logger = sub {
84         push(@logs, @_);
85     };
86     my $app = builder {
87         enable sub {
88             my $app = shift;
89             sub {
90                 my $env = shift;
91                 $env->{'psgix.logger'} = $logger;
92                 $app->($env);
93             };
94         };
95         TestApp->psgi_app;
96     };
97
98     test_psgi $app, sub {
99         my $cb = shift;
100         my $res = $cb->(GET "/log/info");
101         cmp_ok(scalar(@logs), $cmp, 1, "psgix.logger: one event logged");
102         is(scalar(grep { $_->{level} eq 'info' and $_->{message} eq 'info' } @logs),
103            1, "psgix.logger: right stuff");
104     };
105 };
106
107
108
109 done_testing;