148 lines
4.2 KiB
Ruby
148 lines
4.2 KiB
Ruby
require 'rails_helper'
|
|
|
|
describe Whatsapp::PhoneInfoService do
|
|
let(:waba_id) { 'test_waba_id' }
|
|
let(:phone_number_id) { 'test_phone_number_id' }
|
|
let(:access_token) { 'test_access_token' }
|
|
let(:service) { described_class.new(waba_id, phone_number_id, access_token) }
|
|
let(:api_client) { instance_double(Whatsapp::FacebookApiClient) }
|
|
|
|
before do
|
|
allow(Whatsapp::FacebookApiClient).to receive(:new).with(access_token).and_return(api_client)
|
|
end
|
|
|
|
describe '#perform' do
|
|
let(:phone_response) do
|
|
{
|
|
'data' => [
|
|
{
|
|
'id' => phone_number_id,
|
|
'display_phone_number' => '1234567890',
|
|
'verified_name' => 'Test Business',
|
|
'code_verification_status' => 'VERIFIED'
|
|
}
|
|
]
|
|
}
|
|
end
|
|
|
|
context 'when all parameters are valid' do
|
|
before do
|
|
allow(api_client).to receive(:fetch_phone_numbers).with(waba_id).and_return(phone_response)
|
|
end
|
|
|
|
it 'returns formatted phone info' do
|
|
result = service.perform
|
|
expect(result).to eq({
|
|
phone_number_id: phone_number_id,
|
|
phone_number: '+1234567890',
|
|
verified: true,
|
|
business_name: 'Test Business'
|
|
})
|
|
end
|
|
end
|
|
|
|
context 'when phone_number_id is not provided' do
|
|
let(:phone_number_id) { nil }
|
|
let(:phone_response) do
|
|
{
|
|
'data' => [
|
|
{
|
|
'id' => 'first_phone_id',
|
|
'display_phone_number' => '1234567890',
|
|
'verified_name' => 'Test Business',
|
|
'code_verification_status' => 'VERIFIED'
|
|
}
|
|
]
|
|
}
|
|
end
|
|
|
|
before do
|
|
allow(api_client).to receive(:fetch_phone_numbers).with(waba_id).and_return(phone_response)
|
|
end
|
|
|
|
it 'uses the first available phone number' do
|
|
result = service.perform
|
|
expect(result[:phone_number_id]).to eq('first_phone_id')
|
|
end
|
|
end
|
|
|
|
context 'when specific phone_number_id is not found' do
|
|
let(:phone_number_id) { 'different_id' }
|
|
let(:phone_response) do
|
|
{
|
|
'data' => [
|
|
{
|
|
'id' => 'available_phone_id',
|
|
'display_phone_number' => '9876543210',
|
|
'verified_name' => 'Different Business',
|
|
'code_verification_status' => 'VERIFIED'
|
|
}
|
|
]
|
|
}
|
|
end
|
|
|
|
before do
|
|
allow(api_client).to receive(:fetch_phone_numbers).with(waba_id).and_return(phone_response)
|
|
end
|
|
|
|
it 'uses the first available phone number as fallback' do
|
|
result = service.perform
|
|
expect(result[:phone_number_id]).to eq('available_phone_id')
|
|
expect(result[:phone_number]).to eq('+9876543210')
|
|
end
|
|
end
|
|
|
|
context 'when no phone numbers are available' do
|
|
let(:phone_response) { { 'data' => [] } }
|
|
|
|
before do
|
|
allow(api_client).to receive(:fetch_phone_numbers).with(waba_id).and_return(phone_response)
|
|
end
|
|
|
|
it 'raises an error' do
|
|
expect { service.perform }.to raise_error(/No phone numbers found for WABA/)
|
|
end
|
|
end
|
|
|
|
context 'when waba_id is blank' do
|
|
let(:waba_id) { '' }
|
|
|
|
it 'raises ArgumentError' do
|
|
expect { service.perform }.to raise_error(ArgumentError, 'WABA ID is required')
|
|
end
|
|
end
|
|
|
|
context 'when access_token is blank' do
|
|
let(:access_token) { '' }
|
|
|
|
it 'raises ArgumentError' do
|
|
expect { service.perform }.to raise_error(ArgumentError, 'Access token is required')
|
|
end
|
|
end
|
|
|
|
context 'when phone number has special characters' do
|
|
let(:phone_response) do
|
|
{
|
|
'data' => [
|
|
{
|
|
'id' => phone_number_id,
|
|
'display_phone_number' => '+1 (234) 567-8900',
|
|
'verified_name' => 'Test Business',
|
|
'code_verification_status' => 'VERIFIED'
|
|
}
|
|
]
|
|
}
|
|
end
|
|
|
|
before do
|
|
allow(api_client).to receive(:fetch_phone_numbers).with(waba_id).and_return(phone_response)
|
|
end
|
|
|
|
it 'sanitizes the phone number' do
|
|
result = service.perform
|
|
expect(result[:phone_number]).to eq('+12345678900')
|
|
end
|
|
end
|
|
end
|
|
end
|