View | Details | Raw Unified | Return to bug 38818
Collapse All | Expand All

(-)a/t/Test/Mock/Logger.t (-1 / +176 lines)
Line 0 Link Here
0
- 
1
use Modern::Perl;
2
use Test::More tests => 10;
3
use Test::Warn;
4
5
# Module under test
6
use t::lib::Mocks::Logger;
7
use Koha::Logger;
8
9
# Test instantiation
10
my $logger;
11
subtest 'Constructor tests' => sub {
12
    plan tests => 2;
13
    $logger = t::lib::Mocks::Logger->new();
14
    isa_ok( $logger, 't::lib::Mocks::Logger', 'Constructor returns expected object' );
15
    can_ok(
16
        $logger, qw(new diag debug_is error_is fatal_is info_is trace_is warn_is
17
            debug_like error_like fatal_like info_like trace_like warn_like
18
            count clear)
19
    );
20
};
21
22
# Get a reference to the mocked logger
23
my $mocked_logger = Koha::Logger->get();
24
25
# Test logging at various log levels and verify that the messages are captured
26
subtest 'Basic logging tests' => sub {
27
    plan tests => 1;
28
29
    $logger->clear();
30
31
    $mocked_logger->debug('Debug message');
32
    $mocked_logger->info('Info message');
33
    $mocked_logger->warn('Warning message');
34
    $mocked_logger->error('Error message');
35
    $mocked_logger->fatal('Fatal message');
36
    $mocked_logger->trace('Trace message');
37
38
    is( $logger->count, 6, 'All 6 log messages were captured' );
39
};
40
41
# Test exact message matching methods
42
subtest 'Exact message matching' => sub {
43
    plan tests => 6;
44
45
    $logger->clear();
46
47
    $mocked_logger->debug('Debug message');
48
    $mocked_logger->info('Info message');
49
    $mocked_logger->warn('Warning message');
50
    $mocked_logger->error('Error message');
51
    $mocked_logger->fatal('Fatal message');
52
    $mocked_logger->trace('Trace message');
53
54
    $logger->debug_is( 'Debug message', 'Debug message matched exactly' );
55
    $logger->info_is( 'Info message', 'Info message matched exactly' );
56
    $logger->warn_is( 'Warning message', 'Warning message matched exactly' );
57
    $logger->error_is( 'Error message', 'Error message matched exactly' );
58
    $logger->fatal_is( 'Fatal message', 'Fatal message matched exactly' );
59
    $logger->trace_is( 'Trace message', 'Trace message matched exactly' );
60
};
61
62
# Test regex message matching methods
63
subtest 'Regex message matching' => sub {
64
    plan tests => 6;
65
66
    $logger->clear();
67
68
    $mocked_logger->debug('Debug message 123');
69
    $mocked_logger->info('Info message 456');
70
    $mocked_logger->warn('Warning message 789');
71
    $mocked_logger->error('Error message abc');
72
    $mocked_logger->fatal('Fatal message def');
73
    $mocked_logger->trace('Trace message ghi');
74
75
    $logger->debug_like( qr/Debug.*123/, 'Debug message matched regex' );
76
    $logger->info_like( qr/Info.*456/, 'Info message matched regex' );
77
    $logger->warn_like( qr/Warning.*789/, 'Warning message matched regex' );
78
    $logger->error_like( qr/Error.*abc/, 'Error message matched regex' );
79
    $logger->fatal_like( qr/Fatal.*def/, 'Fatal message matched regex' );
80
    $logger->trace_like( qr/Trace.*ghi/, 'Trace message matched regex' );
81
};
82
83
# Test count method
84
subtest 'Count method tests' => sub {
85
    plan tests => 7;
86
87
    $logger->clear();
88
89
    is( $logger->count, 0, 'Count is 0 after clear' );
90
91
    $mocked_logger->debug('Debug message');
92
    is( $logger->count,          1, 'Count is 1 after one message' );
93
    is( $logger->count('debug'), 1, 'Debug count is 1' );
94
    is( $logger->count('error'), 0, 'Error count is 0' );
95
96
    $mocked_logger->error('Error message');
97
    is( $logger->count,          2, 'Count is 2 after two messages' );
98
    is( $logger->count('debug'), 1, 'Debug count is still 1' );
99
    is( $logger->count('error'), 1, 'Error count is now 1' );
100
};
101
102
# Test clear method
103
subtest 'Clear method tests' => sub {
104
    plan tests => 3;
105
106
    $logger->clear();
107
    $mocked_logger->debug('Debug message');
108
    $mocked_logger->error('Error message');
109
110
    is( $logger->count, 2, 'Count is 2 before clear' );
111
112
    $logger->clear('debug');
113
    is( $logger->count('debug'), 0, 'Debug count is 0 after specific clear' );
114
    is( $logger->count('error'), 1, 'Error count is still 1 after specific clear' );
115
};
116
117
# Test method chaining
118
subtest 'Method chaining tests' => sub {
119
    plan tests => 4;
120
121
    $logger->clear();
122
123
    $mocked_logger->debug('Debug message 1');
124
    $mocked_logger->debug('Debug message 2');
125
    $mocked_logger->error('Error message');
126
127
    my $result =
128
        $logger->debug_is( 'Debug message 1', 'First debug message matched' )
129
        ->debug_is( 'Debug message 2', 'Second debug message matched' )
130
        ->error_is( 'Error message', 'Error message matched' );
131
132
    isa_ok( $result, 't::lib::Mocks::Logger', 'Method chaining returns the logger object' );
133
};
134
135
# Test diag method (output capture is complex, just verify it runs)
136
subtest 'Diag method test' => sub {
137
    plan tests => 1;
138
139
    $logger->clear();
140
    $mocked_logger->debug('Debug message');
141
142
    # Just make sure it doesn't throw an exception
143
    eval { $logger->diag(); };
144
    is( $@, '', 'diag() method executed without errors' );
145
};
146
147
# Test handling of empty log buffers
148
subtest 'Empty log buffer handling' => sub {
149
    plan tests => 6;
150
151
    $logger->clear();
152
153
    $logger->debug_is( '', 'Empty string returned when no debug messages' );
154
    $logger->info_is( '', 'Empty string returned when no info messages' );
155
    $logger->warn_is( '', 'Empty string returned when no warn messages' );
156
    $logger->error_is( '', 'Empty string returned when no error messages' );
157
    $logger->fatal_is( '', 'Empty string returned when no fatal messages' );
158
    $logger->trace_is( '', 'Empty string returned when no trace messages' );
159
};
160
161
# Test multiple messages at the same level
162
subtest 'Multiple messages at same level' => sub {
163
    plan tests => 5;
164
165
    $logger->clear();
166
167
    $mocked_logger->debug('Debug message 1');
168
    $mocked_logger->debug('Debug message 2');
169
    $mocked_logger->debug('Debug message 3');
170
171
    is( $logger->count('debug'), 3, 'Three debug messages recorded' );
172
    $logger->debug_is( 'Debug message 1', 'First debug message matched' );
173
    $logger->debug_is( 'Debug message 2', 'Second debug message matched' );
174
    $logger->debug_is( 'Debug message 3', 'Third debug message matched' );
175
    is( $logger->count('debug'), 0, 'All debug messages consumed' );
176
};

Return to bug 38818