|
4 | 4 | require_relative '../../../app/security_logger' |
5 | 5 |
|
6 | 6 | RSpec.describe Html2rss::Web::SecurityLogger do |
7 | | - let(:test_output) { StringIO.new } |
8 | 7 | let(:mock_logger) { instance_double(Logger) } |
9 | 8 |
|
10 | 9 | before do |
11 | 10 | allow(Logger).to receive(:new).with($stdout).and_return(mock_logger) |
12 | 11 | allow(mock_logger).to receive(:formatter=) |
| 12 | + allow(mock_logger).to receive(:info) |
13 | 13 | allow(mock_logger).to receive(:warn) |
14 | 14 | allow(mock_logger).to receive(:error) |
| 15 | + allow(Kernel).to receive(:warn) |
15 | 16 | described_class.reset_logger! |
16 | 17 | end |
17 | 18 |
|
|
51 | 52 | it 'logs token usage with basic data' do |
52 | 53 | described_class.log_token_usage('test-token-123', 'https://example.com', true) |
53 | 54 |
|
54 | | - expect(mock_logger).to have_received(:warn) do |message| |
| 55 | + expect(mock_logger).to have_received(:info) do |message| |
55 | 56 | data = JSON.parse(message, symbolize_names: true) |
56 | 57 | data.include?( |
57 | 58 | security_event: 'token_usage', |
|
64 | 65 | it 'includes hashed token in log data' do |
65 | 66 | described_class.log_token_usage('test-token-123', 'https://example.com', true) |
66 | 67 |
|
67 | | - expect(mock_logger).to have_received(:warn) do |message| |
| 68 | + expect(mock_logger).to have_received(:info) do |message| |
68 | 69 | data = JSON.parse(message, symbolize_names: true) |
69 | 70 | data[:token_hash].match?(/\A[a-f0-9]{8}\z/) |
70 | 71 | end |
|
107 | 108 | it 'logs configuration validation failure' do |
108 | 109 | described_class.log_config_validation_failure('secret_key', 'Invalid secret key') |
109 | 110 |
|
110 | | - expect(mock_logger).to have_received(:warn) do |message| |
| 111 | + expect(mock_logger).to have_received(:error) do |message| |
111 | 112 | data = JSON.parse(message, symbolize_names: true) |
112 | 113 | data.include?( |
113 | 114 | security_event: 'config_validation_failure', |
|
122 | 123 | it 'does not raise error when logger fails' do |
123 | 124 | # Mock the logger to raise an error when warn is called |
124 | 125 | allow(mock_logger).to receive(:warn).and_raise(StandardError, 'Logger error') |
125 | | - allow(mock_logger).to receive(:error) |
126 | 126 |
|
127 | 127 | # Should not raise an error |
128 | 128 | expect { described_class.log_auth_failure('192.168.1.1', 'Mozilla/5.0', 'invalid_token') }.not_to raise_error |
129 | 129 | end |
130 | 130 |
|
131 | 131 | it 'logs error when logger fails' do |
132 | | - # Mock the logger to raise an error when warn is called |
133 | 132 | allow(mock_logger).to receive(:warn).and_raise(StandardError, 'Logger error') |
134 | | - allow(mock_logger).to receive(:error) |
135 | 133 |
|
136 | 134 | described_class.log_auth_failure('192.168.1.1', 'Mozilla/5.0', 'invalid_token') |
137 | 135 |
|
138 | | - expect(mock_logger).to have_received(:error).with('Security logging error: Logger error') |
| 136 | + expect(Kernel).to have_received(:warn).with('Security logging error: Logger error') |
139 | 137 | end |
140 | 138 |
|
141 | 139 | it 'logs fallback message when logger fails' do |
142 | | - # Mock the logger to raise an error when warn is called |
143 | 140 | allow(mock_logger).to receive(:warn).and_raise(StandardError, 'Logger error') |
144 | | - allow(mock_logger).to receive(:error) |
145 | 141 |
|
146 | 142 | described_class.log_auth_failure('192.168.1.1', 'Mozilla/5.0', 'invalid_token') |
147 | 143 |
|
148 | | - expected_message = 'Security event: auth_failure - {ip: "192.168.1.1", ' \ |
149 | | - 'user_agent: "Mozilla/5.0", reason: "invalid_token"}' |
150 | | - expect(mock_logger).to have_received(:warn).with(expected_message) |
| 144 | + expect(Kernel).to have_received(:warn).with(a_string_including('Security event: auth_failure')) |
151 | 145 | end |
152 | 146 | end |
153 | 147 | end |
0 commit comments