From 593e62d78ff09626a61d4f1fb58e4bf10f97642f Mon Sep 17 00:00:00 2001 From: daphnevilhar Date: Mon, 28 Jul 2025 09:59:05 -0300 Subject: [PATCH 1/3] Feat: Update publish to handle both hash and json string messages --- lib/aws/sns/configurator/topic.rb | 3 ++- spec/aws/sns/configurator/topic_spec.rb | 30 +++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/lib/aws/sns/configurator/topic.rb b/lib/aws/sns/configurator/topic.rb index f6e2cd5..eedb365 100644 --- a/lib/aws/sns/configurator/topic.rb +++ b/lib/aws/sns/configurator/topic.rb @@ -48,7 +48,8 @@ def subscribe!(protocol, endpoint, options) end def publish!(message) - default_client.aws.publish(topic_arn: @arn, message: message.to_json) + payload = message.is_a?(Hash) ? message.to_json : message + default_client.aws.publish(topic_arn: @arn, message: payload) end private diff --git a/spec/aws/sns/configurator/topic_spec.rb b/spec/aws/sns/configurator/topic_spec.rb index b2ba8d9..5b6b7cc 100644 --- a/spec/aws/sns/configurator/topic_spec.rb +++ b/spec/aws/sns/configurator/topic_spec.rb @@ -155,10 +155,36 @@ describe '#publish!' do let(:topic) { build :topic } + let(:aws_client) { double('AwsClient') } subject { topic.publish!(name: 'linqueta', blog: 'linqueta.com') } - it 'should publish in the topic', :vcr do - is_expected.to be_truthy + before do + allow(topic).to receive_message_chain(:default_client, :aws).and_return(aws_client) + allow(aws_client).to receive(:publish) + end + + context 'when payload is a hash' do + let(:message) { { nome: 'linqueta', blog: 'linqueta.com' } } + + it 'should publish in the topic with message as json' do + expect(aws_client).to receive(:publish).with( + topic_arn: topic.arn, + message: message.to_json + ) + topic.publish!(message) + end + end + + context 'when message is a json string' do + let(:json_message) { '{"nome":"linqueta", "blog":"linqueta.com"}' } + + it 'should publish in the topic with message as json' do + expect(aws_client).to receive(:publish).with( + topic_arn: topic.arn, + message: json_message + ) + topic.publish!(json_message) + end end end end From c2a2f327fd027ff8e7493c95be687cc05dc68306 Mon Sep 17 00:00:00 2001 From: daphnevilhar Date: Mon, 28 Jul 2025 10:02:15 -0300 Subject: [PATCH 2/3] Fix: Rubocop --- spec/aws/sns/configurator/topic_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/aws/sns/configurator/topic_spec.rb b/spec/aws/sns/configurator/topic_spec.rb index 5b6b7cc..b510f8f 100644 --- a/spec/aws/sns/configurator/topic_spec.rb +++ b/spec/aws/sns/configurator/topic_spec.rb @@ -165,7 +165,7 @@ context 'when payload is a hash' do let(:message) { { nome: 'linqueta', blog: 'linqueta.com' } } - + it 'should publish in the topic with message as json' do expect(aws_client).to receive(:publish).with( topic_arn: topic.arn, @@ -177,7 +177,7 @@ context 'when message is a json string' do let(:json_message) { '{"nome":"linqueta", "blog":"linqueta.com"}' } - + it 'should publish in the topic with message as json' do expect(aws_client).to receive(:publish).with( topic_arn: topic.arn, From 325ca2b010b11876f80824fd7ae2fb1433a8a238 Mon Sep 17 00:00:00 2001 From: daphnevilhar Date: Mon, 28 Jul 2025 12:42:37 -0300 Subject: [PATCH 3/3] Refactor: move message formatting to private method --- lib/aws/sns/configurator/topic.rb | 7 +++-- spec/aws/sns/configurator/topic_spec.rb | 40 +++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/lib/aws/sns/configurator/topic.rb b/lib/aws/sns/configurator/topic.rb index eedb365..ab5bff5 100644 --- a/lib/aws/sns/configurator/topic.rb +++ b/lib/aws/sns/configurator/topic.rb @@ -48,8 +48,7 @@ def subscribe!(protocol, endpoint, options) end def publish!(message) - payload = message.is_a?(Hash) ? message.to_json : message - default_client.aws.publish(topic_arn: @arn, message: payload) + default_client.aws.publish(topic_arn: @arn, message: format_message(message)) end private @@ -92,6 +91,10 @@ def build_name_formatted! def build_arn! @arn = ['arn:aws:sns', @region, account_id, @name_formatted].compact.join(':') end + + def format_message(message) + message.is_a?(Hash) ? message.to_json : message + end end end end diff --git a/spec/aws/sns/configurator/topic_spec.rb b/spec/aws/sns/configurator/topic_spec.rb index b510f8f..691d6fa 100644 --- a/spec/aws/sns/configurator/topic_spec.rb +++ b/spec/aws/sns/configurator/topic_spec.rb @@ -156,7 +156,6 @@ describe '#publish!' do let(:topic) { build :topic } let(:aws_client) { double('AwsClient') } - subject { topic.publish!(name: 'linqueta', blog: 'linqueta.com') } before do allow(topic).to receive_message_chain(:default_client, :aws).and_return(aws_client) @@ -164,7 +163,7 @@ end context 'when payload is a hash' do - let(:message) { { nome: 'linqueta', blog: 'linqueta.com' } } + let(:message) { { nome: 'petlove', site: 'petlove.com.br' } } it 'should publish in the topic with message as json' do expect(aws_client).to receive(:publish).with( @@ -176,7 +175,7 @@ end context 'when message is a json string' do - let(:json_message) { '{"nome":"linqueta", "blog":"linqueta.com"}' } + let(:json_message) { '{"nome":"petlove", "site":"petlove.com.br"}' } it 'should publish in the topic with message as json' do expect(aws_client).to receive(:publish).with( @@ -187,4 +186,39 @@ end end end + + describe '#format_message' do + let(:topic) { build :topic } + + context 'when message is a hash' do + let(:message) { { nome: 'petlove', site: 'petlove.com.br' } } + + it 'returns a valid JSON string' do + result = topic.send(:format_message, message) + + expect(result).to be_a(String) + + parsed_message = JSON.parse(result) + + expect(parsed_message['nome']).to eq('petlove') + expect(parsed_message['site']).to eq('petlove.com.br') + end + end + + context 'when the message is already a JSON string' do + let(:json_message) { '{"nome":"petlove", "site":"petlove.com.br"}' } + + it 'returns the original JSON string unchanged' do + result = topic.send(:format_message, json_message) + + expect(result).to be_a(String) + expect(result).to eq(json_message) + + parsed_message = JSON.parse(result) + + expect(parsed_message['nome']).to eq('petlove') + expect(parsed_message['site']).to eq('petlove.com.br') + end + end + end end