Files
leadchat/spec/services/line/send_on_line_service_spec.rb

97 lines
2.8 KiB
Ruby

require 'rails_helper'
describe Line::SendOnLineService do
describe '#perform' do
let(:line_client) { double }
let(:line_channel) { create(:channel_line) }
let(:message) do
create(:message, message_type: :outgoing, content: 'test',
conversation: create(:conversation, inbox: line_channel.inbox))
end
before do
allow(Line::Bot::Client).to receive(:new).and_return(line_client)
end
context 'when message send' do
it 'calls @channel.client.push_message' do
allow(line_client).to receive(:push_message)
expect(line_client).to receive(:push_message)
described_class.new(message: message).perform
end
end
context 'when message send fails without details' do
let(:error_response) do
{
'message' => 'The request was invalid'
}.to_json
end
before do
allow(line_client).to receive(:push_message).and_return(OpenStruct.new(code: '400', body: error_response))
end
it 'updates the message status to failed' do
described_class.new(message: message).perform
message.reload
expect(message.status).to eq('failed')
end
it 'updates the external error without details' do
described_class.new(message: message).perform
message.reload
expect(message.external_error).to eq('The request was invalid')
end
end
context 'when message send fails with details' do
let(:error_response) do
{
'message' => 'The request was invalid',
'details' => [
{
'property' => 'messages[0].text',
'message' => 'May not be empty'
}
]
}.to_json
end
before do
allow(line_client).to receive(:push_message).and_return(OpenStruct.new(code: '400', body: error_response))
end
it 'updates the message status to failed' do
described_class.new(message: message).perform
message.reload
expect(message.status).to eq('failed')
end
it 'updates the external error with details' do
described_class.new(message: message).perform
message.reload
expect(message.external_error).to eq('The request was invalid, messages[0].text: May not be empty')
end
end
context 'when message send succeeds' do
let(:success_response) do
{
'message' => 'ok'
}.to_json
end
before do
allow(line_client).to receive(:push_message).and_return(OpenStruct.new(code: '200', body: success_response))
end
it 'updates the message status to delivered' do
described_class.new(message: message).perform
message.reload
expect(message.status).to eq('delivered')
end
end
end
end