require 'rails_helper' describe Agents::GoogleCalendarPublishAgent do let(:valid_params) do { 'expected_update_period_in_days' => "10", 'calendar_id' => calendar_id, 'google' => { 'key_file' => File.dirname(__FILE__) + '/../../data_fixtures/private.key', 'key_secret' => 'notasecret', 'service_account_email' => '1029936966326-ncjd7776pcspc98hsg82gsb56t3217ef@developer.gserviceaccount.com' } } end let(:agent) do _agent = Agents::GoogleCalendarPublishAgent.new(name: "somename", options: valid_params) _agent.user = users(:jane) _agent.save! _agent end describe '#receive' do let(:message) do { 'visibility' => 'default', 'summary' => "Awesome event", 'description' => "An example event with text. Pro tip: DateTimes are in RFC3339", 'end' => { 'date_time' => '2014-10-02T11:00:00-05:00' }, 'start' => { 'date_time' => '2014-10-02T10:00:00-05:00' } } end let(:event) do _event = Event.new _event.agent = agents(:bob_manual_event_agent) _event.payload = { 'message' => message } _event.save! _event end let(:calendar_id) { 'sqv39gj35tc837gdns1g4d81cg@group.calendar.google.com' } let(:response_hash) do {"kind"=>"calendar#event", "etag"=>"\"2908684044040000\"", "id"=>"baz", "status"=>"confirmed", "html_link"=> "https://calendar.google.com/calendar/event?eid=foobar", "created"=>"2016-02-01T15:53:41.000Z", "updated"=>"2016-02-01T15:53:42.020Z", "summary"=>"Awesome event", "description"=> "An example event with text. Pro tip: DateTimes are in RFC3339", "creator"=> {"email"=> "blah-foobar@developer.gserviceaccount.com"}, "organizer"=> {"email"=>calendar_id, "display_name"=>"Huginn Location Log", "self"=>true}, "start"=>{"date_time"=>"2014-10-03T00:30:00+09:30"}, "end"=>{"date_time"=>"2014-10-03T01:30:00+09:30"}, "i_cal_uid"=>"blah@google.com", "sequence"=>0, "reminders"=>{"use_default"=>true} } end def setup_mock! fake_interface = Object.new expect(GoogleCalendar).to receive(:new).with(agent.interpolate_options(agent.options), Rails.logger) { fake_interface } expect(fake_interface).to receive(:publish_as).with(calendar_id, message) { response_hash } expect(fake_interface).to receive(:cleanup!) end describe 'when the calendar_id is in the options' do it 'should publish any payload it receives' do setup_mock! expect { agent.receive([event]) }.to change { agent.events.count }.by(1) expect(agent.events.last.payload).to eq({ "success" => true, "published_calendar_event" => response_hash, "agent_id" => event.agent_id, "event_id" => event.id }) end end describe 'with Liquid templating' do it 'should allow Liquid in the calendar_id' do setup_mock! agent.options['calendar_id'] = '{{ cal_id }}' agent.save! event.payload['cal_id'] = calendar_id event.save! agent.receive([event]) expect(agent.events.count).to eq(1) expect(agent.events.last.payload).to eq({ "success" => true, "published_calendar_event" => response_hash, "agent_id" => event.agent_id, "event_id" => event.id }) end it 'should allow Liquid in the key' do agent.options['google'].delete('key_file') agent.options['google']['key'] = '{% credential google_key %}' agent.save! users(:jane).user_credentials.create! credential_name: 'google_key', credential_value: 'something' agent.reload setup_mock! agent.receive([event]) expect(agent.events.count).to eq(1) end end end describe '#receive old style event' do let(:event) do _event = Event.new _event.agent = agents(:bob_manual_event_agent) _event.payload = { 'message' => { 'visibility' => 'default', 'summary' => "Awesome event", 'description' => "An example event with text. Pro tip: DateTimes are in RFC3339", 'end' => { 'dateTime' => '2014-10-02T11:00:00-05:00' }, 'start' => { 'dateTime' => '2014-10-02T10:00:00-05:00' } } } _event.save! _event end let(:calendar_id) { 'sqv39gj35tc837gdns1g4d81cg@group.calendar.google.com' } let(:message) do { 'visibility' => 'default', 'summary' => "Awesome event", 'description' => "An example event with text. Pro tip: DateTimes are in RFC3339", 'end' => { 'date_time' => '2014-10-02T11:00:00-05:00' }, 'start' => { 'date_time' => '2014-10-02T10:00:00-05:00' } } end let(:response_hash) do {"kind"=>"calendar#event", "etag"=>"\"2908684044040000\"", "id"=>"baz", "status"=>"confirmed", "html_link"=> "https://calendar.google.com/calendar/event?eid=foobar", "created"=>"2016-02-01T15:53:41.000Z", "updated"=>"2016-02-01T15:53:42.020Z", "summary"=>"Awesome event", "description"=> "An example event with text. Pro tip: DateTimes are in RFC3339", "creator"=> {"email"=> "blah-foobar@developer.gserviceaccount.com"}, "organizer"=> {"email"=>calendar_id, "display_name"=>"Huginn Location Log", "self"=>true}, "start"=>{"date_time"=>"2014-10-03T00:30:00+09:30"}, "end"=>{"date_time"=>"2014-10-03T01:30:00+09:30"}, "i_cal_uid"=>"blah@google.com", "sequence"=>0, "reminders"=>{"use_default"=>true} } end def setup_mock! fake_interface = Object.new expect(GoogleCalendar).to receive(:new).with(agent.interpolate_options(agent.options), Rails.logger) { fake_interface } expect(fake_interface).to receive(:publish_as).with(calendar_id, message) { response_hash } expect(fake_interface).to receive(:cleanup!) end describe 'when the calendar_id is in the options' do it 'should publish old style payload it receives' do setup_mock! expect { agent.receive([event]) }.to change { agent.events.count }.by(1) expect(agent.events.last.payload).to eq({ "success" => true, "published_calendar_event" => response_hash, "agent_id" => event.agent_id, "event_id" => event.id }) end end end end