From f263b42a62dc99946f8a684f76f344500ff6dd44 Mon Sep 17 00:00:00 2001 From: Julia Date: Mon, 27 Jan 2025 17:26:27 +0400 Subject: [PATCH] Update NATS::Msg#respond_with_error --- lib/nats/io/msg.rb | 29 +++++++++---- spec/msg_spec.rb | 100 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 7 deletions(-) create mode 100644 spec/msg_spec.rb diff --git a/lib/nats/io/msg.rb b/lib/nats/io/msg.rb index 5ba2d8e..a9777f0 100644 --- a/lib/nats/io/msg.rb +++ b/lib/nats/io/msg.rb @@ -43,14 +43,29 @@ def respond(data = "") def respond_with_error(error) message = dup - message.header = { - "Nats-Service-Error" => error.message, - "Nats-Service-Error-Code" => 500 - } - message.subject = reply - message.reply = nil - message.data = nil + message.reply = "" + message.data = "" + + case error + when Exception + message.header = { + "Nats-Service-Error" => error.message, + "Nats-Service-Error-Code" => 500 + } + when Hash + message.header = { + "Nats-Service-Error" => error[:description], + "Nats-Service-Error-Code" => error[:code] + } + + message.data = error[:data] + else + message.header = { + "Nats-Service-Error" => error.to_s, + "Nats-Service-Error-Code" => 500 + } + end respond_msg(message) end diff --git a/spec/msg_spec.rb b/spec/msg_spec.rb new file mode 100644 index 0000000..e9ad8df --- /dev/null +++ b/spec/msg_spec.rb @@ -0,0 +1,100 @@ +# frozen_string_literal: true + +RSpec.describe NATS::Msg do + subject { described_class.new(options) } + + let(:options) do + { + subject: "foo", + reply: "bar", + data: "foo.bar", + header: {}, + nc: nil, + sub: nil + } + end + + describe "#respond_with_error" do + let(:respond_with_error) { subject.respond_with_error(error) } + + before do + allow(subject).to receive(:respond_msg) + end + + let(:respond) do + { + subject: "bar", + header: { + "Nats-Service-Error" => "error", + "Nats-Service-Error-Code" => 500 + }, + reply: "", + data: "" + } + end + + context "when argument is a string" do + let(:error) { "error" } + + it "responds with service error message" do + respond_with_error + + expect(subject).to have_received(:respond_msg).with have_attributes(respond) + end + end + + context "when argument is a hash" do + let(:error) { { code: 503, description: "error", data: "data" } } + + let(:respond) do + { + subject: "bar", + header: { + "Nats-Service-Error" => "error", + "Nats-Service-Error-Code" => 503 + }, + reply: "", + data: "data" + } + end + + it "responds with service error message" do + respond_with_error + + expect(subject).to have_received(:respond_msg).with have_attributes(respond) + end + end + + context "when argument is an error" do + let(:error) { StandardError.new("error") } + + it "responds with service error message" do + respond_with_error + + expect(subject).to have_received(:respond_msg).with have_attributes(respond) + end + end + + context "when argument is a random object" do + let(:error) { [1, 2, 3] } + + let(:respond) do + { + subject: "bar", + header: { + "Nats-Service-Error" => "[1, 2, 3]", + "Nats-Service-Error-Code" => 500 + }, + reply: "", + data: "" + } + end + + it "responds with argument " do + respond_with_error + + expect(subject).to have_received(:respond_msg).with have_attributes(respond) + end + end + end +end