123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- 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
|