Skip to content

Commit e8107a6

Browse files
committed
fix: preserve respond_with_error payloads
1 parent a2e239b commit e8107a6

File tree

4 files changed

+40
-10
lines changed

4 files changed

+40
-10
lines changed

lib/leopard/message_wrapper.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ def respond(payload)
3131
raw.respond(serialize(payload))
3232
end
3333

34-
# @param err [String, Exception] The error message or exception to respond with.
34+
# @param err [Object] The error payload to respond with.
3535
#
3636
# @return [void]
37-
def respond_with_error(err)
38-
raw.respond_with_error(err.to_s)
37+
def respond_with_error(err, &)
38+
raw.respond_with_error(err, &)
3939
end
4040

4141
private

lib/leopard/nats_api_server.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ def handle_message(raw_msg, handler)
313313
process_result(wrapper, result)
314314
rescue StandardError => e
315315
logger.error 'Error processing message: ', e
316-
wrapper.respond_with_error(e.message)
316+
wrapper.respond_with_error(e)
317317
end
318318

319319
# Processes the result of the handler execution.

test/lib/message_wrapper.rb

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
require 'leopard/message_wrapper'
55

66
class FakeMsg
7-
attr_reader :data, :responded_payload, :error_args
7+
attr_reader :data, :responded_payload, :error_args, :error_block_called_with
88
attr_accessor :header
99

1010
def initialize(data, header = {})
@@ -18,6 +18,11 @@ def respond(payload)
1818

1919
def respond_with_error(err)
2020
@error_args = [err]
21+
return unless block_given?
22+
23+
yielded_error = {}
24+
yield yielded_error
25+
@error_block_called_with = yielded_error
2126
end
2227
end
2328

@@ -63,10 +68,23 @@ def respond_with_error(err)
6368
assert_equal ['fail'], msg.error_args
6469
end
6570

66-
it 'coerces exception objects to strings when responding with error' do
71+
it 'passes exception objects through when responding with error' do
6772
err = StandardError.new('broken')
6873
wrapper.respond_with_error(err)
6974

70-
assert_equal ['broken'], msg.error_args
75+
assert_equal [err], msg.error_args
76+
end
77+
78+
it 'passes hash payloads through when responding with error' do
79+
err = { 'description' => 'broken', 'code' => 422 }
80+
wrapper.respond_with_error(err)
81+
82+
assert_equal [err], msg.error_args
83+
end
84+
85+
it 'forwards blocks when responding with error' do
86+
wrapper.respond_with_error(code: 422) { |error| error[:code] = 422 }
87+
88+
assert_equal({ code: 422 }, msg.error_block_called_with)
7189
end
7290
end

test/lib/nats_api_server.rb

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,12 +139,15 @@ def call(wrapper)
139139

140140
it 'responds with error when handler raises' do
141141
raw_msg = Object.new
142-
wrapper = Minitest::Mock.new
143-
wrapper.expect(:respond_with_error, nil, ['boom'])
142+
err = nil
143+
wrapper = Object.new
144+
wrapper.define_singleton_method(:respond_with_error) { |raised| err = raised }
144145
Rubyists::Leopard::MessageWrapper.stub(:new, wrapper) do
145146
@instance.send(:handle_message, raw_msg, proc { raise 'boom' })
146147
end
147-
wrapper.verify
148+
149+
assert_instance_of RuntimeError, err
150+
assert_equal 'boom', err.message
148151
end
149152

150153
it 'responds when processing Success result' do
@@ -162,4 +165,13 @@ def call(wrapper)
162165
@instance.send(:process_result, wrapper, result)
163166
wrapper.verify
164167
end
168+
169+
it 'passes hash failures through unchanged' do
170+
err = { code: 422, description: 'invalid' }
171+
wrapper = Minitest::Mock.new
172+
wrapper.expect(:respond_with_error, nil, [err])
173+
result = Rubyists::Leopard::NatsApiServer::Failure.new(err)
174+
@instance.send(:process_result, wrapper, result)
175+
wrapper.verify
176+
end
165177
end

0 commit comments

Comments
 (0)