require 'rails_helper' describe Agents::BeeperAgent do let(:base_params) { { 'type' => 'message', 'app_id' => 'some-app-id', 'api_key' => 'some-api-key', 'sender_id' => 'sender-id', 'phone' => '+111111111111', 'text' => 'Some text' } } subject { agent = described_class.new(name: 'beeper-agent', options: base_params) agent.user = users(:jane) agent.save! and return agent } context 'validation' do it 'valid' do expect(subject).to be_valid end [:type, :app_id, :api_key, :sender_id].each do |attr| it "invalid without #{attr}" do subject.options[attr] = nil expect(subject).not_to be_valid end end it 'invalid with group_id and phone' do subject.options['group_id'] ='some-group-id' expect(subject).not_to be_valid end context '#message' do it 'requires text' do subject.options[:text] = nil expect(subject).not_to be_valid end end context '#image' do before(:each) do subject.options[:type] = 'image' end it 'invalid without image' do expect(subject).not_to be_valid end it 'valid with image' do subject.options[:image] = 'some-url' expect(subject).to be_valid end end context '#event' do before(:each) do subject.options[:type] = 'event' end it 'invalid without start_time' do expect(subject).not_to be_valid end it 'valid with start_time' do subject.options[:start_time] = Time.now expect(subject).to be_valid end end context '#location' do before(:each) do subject.options[:type] = 'location' end it 'invalid without latitude and longitude' do expect(subject).not_to be_valid end it 'valid with latitude and longitude' do subject.options[:latitude] = 15.0 subject.options[:longitude] = 16.0 expect(subject).to be_valid end end context '#task' do before(:each) do subject.options[:type] = 'task' end it 'valid with text' do expect(subject).to be_valid end end end context 'payload_for' do it 'removes unwanted attributes' do result = subject.send(:payload_for, {'type' => 'message', 'text' => 'text', 'sender_id' => 'sender', 'phone' => '+1', 'random_attribute' => 'unwanted'}) expect(result).to eq('{"text":"text","sender_id":"sender","phone":"+1"}') end end context 'headers' do it 'sets X-Beeper-Application-Id header with app_id' do expect(subject.send(:headers)['X-Beeper-Application-Id']).to eq(base_params['app_id']) end it 'sets X-Beeper-REST-API-Key header with api_key' do expect(subject.send(:headers)['X-Beeper-REST-API-Key']).to eq(base_params['api_key']) end it 'sets Content-Type' do expect(subject.send(:headers)['Content-Type']).to eq('application/json') end end context 'endpoint_for' do it 'returns valid URL for message' do expect(subject.send(:endpoint_for, 'message')).to eq('https://api.beeper.io/api/messages.json') end it 'returns valid URL for image' do expect(subject.send(:endpoint_for, 'image')).to eq('https://api.beeper.io/api/images.json') end it 'returns valid URL for event' do expect(subject.send(:endpoint_for, 'event')).to eq('https://api.beeper.io/api/events.json') end it 'returns valid URL for location' do expect(subject.send(:endpoint_for, 'location')).to eq('https://api.beeper.io/api/locations.json') end it 'returns valid URL for task' do expect(subject.send(:endpoint_for, 'task')).to eq('https://api.beeper.io/api/tasks.json') end end end