Skip to content

Commit b40eb40

Browse files
author
Sebastian Wilgosz
committed
Add logging mechanizm
Whenever user implements the `log_error` method in the including class Gem calls it for all unmapped errors allowing custom error logging and email notifications to be sent. Resolves: driggl#13
1 parent b7fa057 commit b40eb40

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

lib/jsonapi_errors_handler.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ def self.included(base)
1616

1717
def handle_error(e)
1818
mapped = map_error(e)
19+
log_error(e) if respond_to?(:log_error) && !mapped
1920
mapped ||= ::JsonapiErrorsHandler::Errors::StandardError.new
2021
render_error(mapped)
2122
end

spec/jsonapi_errors_handler_spec.rb

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,36 @@
22

33
class TestJsonapiErrorsHandler
44
include JsonapiErrorsHandler
5-
5+
6+
def render(json: {}, status:)
7+
json.to_h.merge(status: status)
8+
end
9+
end
10+
11+
class DummyErrorLogger
12+
include JsonapiErrorsHandler
13+
614
def render(json: {}, status:)
715
json.to_h.merge(status: status)
816
end
17+
18+
def log_error(e)
19+
end
920
end
1021

11-
RSpec.describe JsonapiErrorsHandler do
22+
RSpec.describe JsonapiErrorsHandler do
1223
let(:dummy) { TestJsonapiErrorsHandler.new }
13-
24+
1425
it 'expects ErrorMapper to have already mapped some errors' do
1526
dummy
1627
expect(JsonapiErrorsHandler::ErrorMapper.mapped_errors).not_to be_empty
1728
end
1829

1930
describe '.handle_error' do
31+
let(:mapped_error) { JsonapiErrorsHandler::Errors::Forbidden.new }
2032
let(:subject) { dummy.handle_error(mapped_error) }
2133

2234
context 'when error is mapped' do
23-
let(:mapped_error) { JsonapiErrorsHandler::Errors::Forbidden.new }
2435
let(:expected_result) do
2536
{ errors: [{detail: 'You have no rights to access this resource',
2637
source: {'pointer'=>'/request/headers/authorization'},
@@ -32,10 +43,20 @@ def render(json: {}, status:)
3243
it 'renders mapped error' do
3344
expect(subject).to include(expected_result)
3445
end
46+
47+
context 'when responds to log_error method' do
48+
let(:dummy) { DummyErrorLogger.new }
49+
let(:subject) { dummy.handle_error(mapped_error) }
50+
it 'does not call error that is mapped' do
51+
expect(dummy).not_to receive(:log_error)
52+
subject
53+
end
54+
end
3555
end
3656

3757
context 'when error is not mapped' do
38-
let(:mapped_error) { 'Error' }
58+
let(:unmapped_error) { 'Error' }
59+
let(:subject) { dummy.handle_error(unmapped_error) }
3960
let(:expected_result) do
4061
{ errors: [{detail: 'We encountered unexpected error, but our developers had been already notified about it',
4162
source: {},
@@ -47,12 +68,21 @@ def render(json: {}, status:)
4768
it 'renders 500 error' do
4869
expect(subject).to include(expected_result)
4970
end
71+
72+
context 'when responds to log_error method' do
73+
let(:dummy) { DummyErrorLogger.new }
74+
let(:subject) { dummy.handle_error(unmapped_error) }
75+
it 'logs unmapped error' do
76+
expect(dummy).to receive(:log_error).with(unmapped_error)
77+
subject
78+
end
79+
end
5080
end
5181
end
5282

5383
describe '.map_error' do
5484
let(:subject) { dummy.map_error(mapped_error) }
55-
85+
5686
context 'error is not in defined error list' do
5787
let(:mapped_error) { 'Error' }
5888

@@ -72,7 +102,7 @@ def render(json: {}, status:)
72102

73103
describe '.render_error' do
74104
let(:subject) { dummy.render_error(error) }
75-
105+
76106
context 'renders the error' do
77107
let(:error) { JsonapiErrorsHandler::Errors::Forbidden.new }
78108
let(:expected_result) do

0 commit comments

Comments
 (0)