123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- 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 = double('fake_interface')
- 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 do
- agent.receive([event])
- end.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 = double('fake_interface')
- expect(GoogleCalendar).to receive(:new).with(agent.interpolate_options(agent.options), Rails.logger) {
- fake_interface
- }
- allow(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 do
- agent.receive([event])
- end.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
|