Add some description to the test
[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
50 subtest "psgi.errors" => sub{
51
52     my $handle = MockHandle->new();
53     my $app = builder {
54
55         enable sub {
56             my $app = shift;
57             sub {
58                 my $env = shift;
59                 $env->{'psgi.errors'} = $handle;
60                 my $res = $app->($env);
61                 return $res;
62             };
63         };
64         TestApp->psgi_app;
65     };
66
67
68     test_psgi $app, sub {
69         my $cb = shift;
70         my $res = $cb->(GET "/log/debug");
71         my @logs = $handle->logs;
72         is(scalar(@logs), 1, "one event output");
73         like($logs[0], qr/debug$/, "event matches test data");
74     };
75 };
76
77 subtest "psgix.logger" => sub {
78
79     my @logs;
80     my $logger = sub {
81         push(@logs, @_);
82     };
83     my $app = builder {
84         enable sub {
85             my $app = shift;
86             sub {
87                 my $env = shift;
88                 $env->{'psgix.logger'} = $logger;
89                 $app->($env);
90             };
91         };
92         TestApp->psgi_app;
93     };
94
95     test_psgi $app, sub {
96         my $cb = shift;
97         my $res = $cb->(GET "/log/debug");
98         is(scalar(@logs), 1, "one event logged");
99         is_deeply($logs[0], { level => 'debug', message => "debug" }, "right stuff");
100     };
101 };
102
103
104
105 done_testing;