spec/queue_poller_spec.rb in pheme-3.4.0 vs spec/queue_poller_spec.rb in pheme-4.0.0

- old
+ new

@@ -12,11 +12,11 @@ end let(:message) { nil } let(:message_id) { SecureRandom.uuid } context 'base poller' do - subject { described_class.new(queue_url: queue_url).handle(nil, nil) } + subject { described_class.new(queue_url: queue_url).handle(nil, nil, nil) } it 'does not implement handle' do expect { subject }.to raise_error(NotImplementedError) end end @@ -88,43 +88,45 @@ end context 'when handling messages' do context 'when doing it the old way, via the handle function' do it 'uses the handle function by default' do - expect { described_class.new(queue_url: queue_url).handle(nil, nil) }.to raise_error(NotImplementedError) + expect { described_class.new(queue_url: queue_url).handle(nil, nil, nil) }.to raise_error(NotImplementedError) end end context 'when given a message_handler as parameter' do it 'uses default when given nil' do - expect { described_class.new(queue_url: queue_url, message_handler: nil).handle(nil, nil) }.to raise_error(NotImplementedError) + expect { described_class.new(queue_url: queue_url, message_handler: nil).handle(nil, nil, nil) }.to raise_error(NotImplementedError) end it 'uses default when given invalid message_handler' do expect { described_class.new(queue_url: queue_url, message_handler: Hash) }.to raise_error(ArgumentError) end it 'uses handler when given one' do mock_handler = double('MessageHandler') allow(mock_handler).to receive(:handle) - allow(ExampleMessageHandler).to receive(:new).with(message: 'message', metadata: 'metadata').and_return(mock_handler) + allow(ExampleMessageHandler).to receive(:new). + with(message: 'message', metadata: 'metadata', message_attributes: 'message_attributes'). + and_return(mock_handler) - described_class.new(queue_url: queue_url, message_handler: ExampleMessageHandler).handle('message', 'metadata') + described_class.new(queue_url: queue_url, message_handler: ExampleMessageHandler).handle('message', 'metadata', 'message_attributes') expect(mock_handler).to have_received(:handle).once end end context 'when given a message_handler as block' do it 'uses handler when given one' do mock_handler = spy('MessageHandler') - poller = described_class.new(queue_url: queue_url) do |message, metadata| - mock_handler.process(message, metadata) + poller = described_class.new(queue_url: queue_url) do |message, metadata, message_attributes| + mock_handler.process(message, metadata, message_attributes) end - poller.handle('message', 'metadata') + poller.handle('message', 'metadata', 'message_attributes') - expect(mock_handler).to have_received(:process).with('message', 'metadata').once + expect(mock_handler).to have_received(:process).with('message', 'metadata', 'message_attributes').once end it 'fails on invalid handler' do expect do described_class.new(queue_url: queue_url, message_handler: ExampleMessageHandler) { raise Error('should never happen') } @@ -132,10 +134,67 @@ end end end end + describe '#parse_message_attributes' do + subject { described_class.new(queue_url: queue_url).parse_message_attributes(queue_message) } + + context 'when no message_attributes' do + it { is_expected.to eq({}) } + end + + context 'when message attributes' do + let(:queue_message) do + OpenStruct.new( + body: { Message: message }.to_json, + message_id: message_id, + message_attributes: { + "key" => { + "data_type" => data_type, + "string_value" => string_value, + }, + }, + ) + end + + context 'when data_type is String' do + let(:data_type) { 'String' } + let(:string_value) { 'some-string-value' } + let(:expected_value) { 'some-string-value' } + + its([:key]) { is_expected.to eq(expected_value) } + end + + context 'when data_type is Number' do + let(:data_type) { 'Number' } + + context 'and it is an int' do + let(:string_value) { '1' } + let(:expected_value) { 1 } + + its([:key]) { is_expected.to eq(expected_value) } + end + + context 'and it is a float' do + let(:string_value) { '1.5' } + let(:expected_value) { 1.5 } + + its([:key]) { is_expected.to eq(expected_value) } + end + end + + context 'when data_type is String.array' do + let(:data_type) { 'String.Array' } + let(:string_value) { '["sdfsdf",1,2,null,true,false]' } + let(:expected_value) { ["sdfsdf", 1, 2, nil, true, false] } + + its([:key]) { is_expected.to eq(expected_value) } + end + end + end + describe "#parse_body" do subject { poller.parse_body(queue_message) } let(:format) { nil } let(:poller) { described_class.new(queue_url: queue_url, format: format) } @@ -303,9 +362,10 @@ it "handles the message" do expect(ExampleMessageHandler).to receive(:new).with( message: RecursiveOpenStruct.new(message), metadata: { timestamp: timestamp, topic_arn: topic_arn }, + message_attributes: {}, ) subject.poll end it "deletes the message from the queue" do