|
6 | 6 | RSpec.describe RailsStructuredLogging::MultiErrorReporter do |
7 | 7 | let(:exception) { StandardError.new("Test error") } |
8 | 8 | let(:context) { { user_id: 123, action: "test" } } |
| 9 | + # Default to no reporter |
| 10 | + let(:reporter) { nil } |
9 | 11 |
|
10 | 12 | describe '.report_exception' do |
11 | 13 | before do |
12 | 14 | # Reset the error reporter before each test |
13 | 15 | described_class.instance_variable_set(:@error_reporter, nil) |
| 16 | + |
| 17 | + # Hide all error reporting services by default |
| 18 | + hide_const("Sentry") if reporter != :sentry && reporter != :all |
| 19 | + hide_const("Bugsnag") if reporter != :bugsnag && reporter != :all |
| 20 | + hide_const("Rollbar") if reporter != :rollbar && reporter != :all |
| 21 | + hide_const("Honeybadger") if reporter != :honeybadger && reporter != :all |
| 22 | + |
14 | 23 | # Stub stdout to capture output |
15 | 24 | allow($stdout).to receive(:puts) |
16 | 25 | end |
17 | 26 |
|
18 | 27 | context 'when Sentry is available' do |
| 28 | + let(:reporter) { :sentry } |
| 29 | + |
19 | 30 | before do |
20 | | - stub_const('Sentry', double) |
21 | 31 | allow(Sentry).to receive(:capture_exception) |
22 | 32 | end |
23 | 33 |
|
|
44 | 54 | end |
45 | 55 |
|
46 | 56 | context 'when Bugsnag is available' do |
47 | | - let(:report) { double } |
| 57 | + let(:reporter) { :bugsnag } |
| 58 | + let(:report) { double('report') } |
48 | 59 |
|
49 | 60 | before do |
50 | | - stub_const('Bugsnag', double) |
51 | 61 | allow(Bugsnag).to receive(:notify).and_yield(report) |
52 | 62 | allow(report).to receive(:add_metadata) |
53 | 63 | end |
|
65 | 75 | end |
66 | 76 |
|
67 | 77 | context 'when Rollbar is available' do |
| 78 | + let(:reporter) { :rollbar } |
| 79 | + |
68 | 80 | before do |
69 | | - stub_const('Rollbar', double) |
70 | 81 | allow(Rollbar).to receive(:error) |
71 | 82 | end |
72 | 83 |
|
|
82 | 93 | end |
83 | 94 |
|
84 | 95 | context 'when Honeybadger is available' do |
| 96 | + let(:reporter) { :honeybadger } |
| 97 | + |
85 | 98 | before do |
86 | | - stub_const('Honeybadger', double) |
87 | 99 | allow(Honeybadger).to receive(:notify) |
88 | 100 | end |
89 | 101 |
|
|
99 | 111 | end |
100 | 112 |
|
101 | 113 | context 'when no error reporting service is available' do |
| 114 | + # reporter is nil by default |
| 115 | + |
102 | 116 | it 'logs to stdout with structured JSON' do |
103 | 117 | json_output = nil |
104 | 118 | expect($stdout).to receive(:puts) do |output| |
|
121 | 135 | end |
122 | 136 | end |
123 | 137 |
|
124 | | - context 'when exception is nil' do |
125 | | - it 'does nothing' do |
126 | | - expect(Sentry).not_to receive(:capture_exception) if defined?(Sentry) |
127 | | - expect($stdout).not_to receive(:puts) |
128 | | - described_class.report_exception(nil) |
129 | | - end |
130 | | - end |
131 | | - |
132 | 138 | context 'with multiple error services available' do |
133 | | - before do |
134 | | - # Define all services but only Sentry should be used (first one) |
135 | | - stub_const('Sentry', double) |
136 | | - stub_const('Bugsnag', double) |
137 | | - stub_const('Rollbar', double) |
138 | | - stub_const('Honeybadger', double) |
| 139 | + let(:reporter) { :all } |
139 | 140 |
|
| 141 | + before do |
140 | 142 | allow(Sentry).to receive(:capture_exception) |
141 | 143 | allow(Bugsnag).to receive(:notify) |
142 | 144 | allow(Rollbar).to receive(:error) |
|
0 commit comments