@@ -25,7 +25,7 @@ module Agents |
||
| 25 | 25 |
|
| 26 | 26 |
Agent Configuration: |
| 27 | 27 |
|
| 28 |
- `calendar_id` - The id the calendar you want to publish to. Typically your google account email address. |
|
| 28 |
+ `calendar_id` - The id the calendar you want to publish to. Typically your google account email address. Liquid formatting (e.g. `{{ cal_id }}`) is allowed here in order to extract the calendar_id from the incoming event.
|
|
| 29 | 29 |
|
| 30 | 30 |
`google` A hash of configuration options for the agent. |
| 31 | 31 |
|
@@ -35,7 +35,6 @@ module Agents |
||
| 35 | 35 |
|
| 36 | 36 |
`google` `key_secret` - The secret for the key, typically 'notasecret' |
| 37 | 37 |
|
| 38 |
- |
|
| 39 | 38 |
|
| 40 | 39 |
Set `expected_update_period_in_days` to the maximum amount of time that you'd expect to pass between Events being created by this Agent. |
| 41 | 40 |
|
@@ -94,8 +93,8 @@ module Agents |
||
| 94 | 93 |
incoming_events.each do |event| |
| 95 | 94 |
calendar = GoogleCalendar.new(options, Rails.logger) |
| 96 | 95 |
|
| 97 |
- calendar_event = JSON.parse(calendar.publish_as(options['calendar_id'], event.payload["message"]).response.body) |
|
| 98 |
- |
|
| 96 |
+ calendar_event = JSON.parse(calendar.publish_as(interpolated(event)['calendar_id'], event.payload["message"]).response.body) |
|
| 97 |
+ |
|
| 99 | 98 |
create_event :payload => {
|
| 100 | 99 |
'success' => true, |
| 101 | 100 |
'published_calendar_event' => calendar_event, |
@@ -1,43 +1,104 @@ |
||
| 1 | 1 |
require 'rails_helper' |
| 2 | 2 |
|
| 3 | 3 |
describe Agents::GoogleCalendarPublishAgent, :vcr do |
| 4 |
- before do |
|
| 5 |
- @valid_params = {
|
|
| 6 |
- 'expected_update_period_in_days' => "10", |
|
| 7 |
- 'calendar_id' => 'sqv39gj35tc837gdns1g4d81cg@group.calendar.google.com', |
|
| 8 |
- 'google' => {
|
|
| 9 |
- 'key_file' => File.dirname(__FILE__) + '/../../data_fixtures/private.key', |
|
| 10 |
- 'key_secret' => 'notasecret', |
|
| 11 |
- 'service_account_email' => '1029936966326-ncjd7776pcspc98hsg82gsb56t3217ef@developer.gserviceaccount.com' |
|
| 12 |
- } |
|
| 4 |
+ let(:valid_params) do |
|
| 5 |
+ {
|
|
| 6 |
+ 'expected_update_period_in_days' => "10", |
|
| 7 |
+ 'calendar_id' => calendar_id, |
|
| 8 |
+ 'google' => {
|
|
| 9 |
+ 'key_file' => File.dirname(__FILE__) + '/../../data_fixtures/private.key', |
|
| 10 |
+ 'key_secret' => 'notasecret', |
|
| 11 |
+ 'service_account_email' => '1029936966326-ncjd7776pcspc98hsg82gsb56t3217ef@developer.gserviceaccount.com' |
|
| 13 | 12 |
} |
| 14 |
- @checker = Agents::GoogleCalendarPublishAgent.new(:name => "somename", :options => @valid_params) |
|
| 15 |
- @checker.user = users(:jane) |
|
| 16 |
- @checker.save! |
|
| 13 |
+ } |
|
| 14 |
+ end |
|
| 15 |
+ |
|
| 16 |
+ let(:agent) do |
|
| 17 |
+ _agent = Agents::GoogleCalendarPublishAgent.new(name: "somename", options: valid_params) |
|
| 18 |
+ _agent.user = users(:jane) |
|
| 19 |
+ _agent.save! |
|
| 20 |
+ _agent |
|
| 17 | 21 |
end |
| 18 | 22 |
|
| 19 | 23 |
describe '#receive' do |
| 20 |
- it 'should publish any payload it receives' do |
|
| 21 |
- event1 = Event.new |
|
| 22 |
- event1.agent = agents(:bob_manual_event_agent) |
|
| 23 |
- event1.payload = {
|
|
| 24 |
- 'message' => {
|
|
| 25 |
- 'visibility' => 'default', |
|
| 26 |
- 'summary' => "Awesome event", |
|
| 27 |
- 'description' => "An example event with text. Pro tip: DateTimes are in RFC3339", |
|
| 28 |
- 'end' => {
|
|
| 29 |
- 'dateTime' => '2014-10-02T11:00:00-05:00' |
|
| 30 |
- }, |
|
| 31 |
- 'start' => {
|
|
| 32 |
- 'dateTime' => '2014-10-02T10:00:00-05:00' |
|
| 33 |
- } |
|
| 24 |
+ let(:event) do |
|
| 25 |
+ _event = Event.new |
|
| 26 |
+ _event.agent = agents(:bob_manual_event_agent) |
|
| 27 |
+ _event.payload = { 'message' => message }
|
|
| 28 |
+ _event.save! |
|
| 29 |
+ _event |
|
| 30 |
+ end |
|
| 31 |
+ |
|
| 32 |
+ let(:calendar_id) { 'sqv39gj35tc837gdns1g4d81cg@group.calendar.google.com' }
|
|
| 33 |
+ let(:message) do |
|
| 34 |
+ {
|
|
| 35 |
+ 'visibility' => 'default', |
|
| 36 |
+ 'summary' => "Awesome event", |
|
| 37 |
+ 'description' => "An example event with text. Pro tip: DateTimes are in RFC3339", |
|
| 38 |
+ 'end' => {
|
|
| 39 |
+ 'dateTime' => '2014-10-02T11:00:00-05:00' |
|
| 40 |
+ }, |
|
| 41 |
+ 'start' => {
|
|
| 42 |
+ 'dateTime' => '2014-10-02T10:00:00-05:00' |
|
| 34 | 43 |
} |
| 35 | 44 |
} |
| 36 |
- event1.save! |
|
| 45 |
+ end |
|
| 46 |
+ let(:response_body) do |
|
| 47 |
+ {"kind"=>"calendar#event",
|
|
| 48 |
+ "etag"=>"\"2908684044040000\"", |
|
| 49 |
+ "id"=>"baz", |
|
| 50 |
+ "status"=>"confirmed", |
|
| 51 |
+ "htmlLink"=> |
|
| 52 |
+ "https://calendar.google.com/calendar/event?eid=foobar", |
|
| 53 |
+ "created"=>"2016-02-01T15:53:41.000Z", |
|
| 54 |
+ "updated"=>"2016-02-01T15:53:42.020Z", |
|
| 55 |
+ "summary"=>"Awesome event", |
|
| 56 |
+ "description"=> |
|
| 57 |
+ "An example event with text. Pro tip: DateTimes are in RFC3339", |
|
| 58 |
+ "creator"=> |
|
| 59 |
+ {"email"=>
|
|
| 60 |
+ "blah-foobar@developer.gserviceaccount.com"}, |
|
| 61 |
+ "organizer"=> |
|
| 62 |
+ {"email"=>calendar_id,
|
|
| 63 |
+ "displayName"=>"Huginn Location Log", |
|
| 64 |
+ "self"=>true}, |
|
| 65 |
+ "start"=>{"dateTime"=>"2014-10-03T00:30:00+09:30"},
|
|
| 66 |
+ "end"=>{"dateTime"=>"2014-10-03T01:30:00+09:30"},
|
|
| 67 |
+ "iCalUID"=>"blah@google.com", |
|
| 68 |
+ "sequence"=>0, |
|
| 69 |
+ "reminders"=>{"useDefault"=>true}
|
|
| 70 |
+ }.to_json |
|
| 71 |
+ end |
|
| 72 |
+ |
|
| 73 |
+ before do |
|
| 74 |
+ fake_interface = Object.new |
|
| 75 |
+ mock(GoogleCalendar).new(agent.options, Rails.logger) { fake_interface }
|
|
| 76 |
+ mock(fake_interface).publish_as(calendar_id, message) { stub!.response.stub!.body { response_body } }
|
|
| 77 |
+ end |
|
| 78 |
+ |
|
| 79 |
+ describe 'when the calendar_id is in the options' do |
|
| 80 |
+ it 'should publish any payload it receives' do |
|
| 81 |
+ expect {
|
|
| 82 |
+ agent.receive([event]) |
|
| 83 |
+ }.to change { agent.events.count }.by(1)
|
|
| 84 |
+ |
|
| 85 |
+ expect(agent.events.last.payload).to eq({ "success" => true, "published_calendar_event" => JSON.parse(response_body), "agent_id" => event.agent_id, "event_id" => event.id })
|
|
| 86 |
+ end |
|
| 87 |
+ end |
|
| 88 |
+ |
|
| 89 |
+ describe 'with Liquid templating' do |
|
| 90 |
+ it 'should allow Liquid in the calendar_id' do |
|
| 91 |
+ agent.options['calendar_id'] = '{{ cal_id }}'
|
|
| 92 |
+ agent.save! |
|
| 93 |
+ |
|
| 94 |
+ event.payload['cal_id'] = calendar_id |
|
| 95 |
+ event.save! |
|
| 37 | 96 |
|
| 38 |
- @checker.receive([event1]) |
|
| 97 |
+ agent.receive([event]) |
|
| 39 | 98 |
|
| 40 |
- expect(@checker.events.count).to eq(1) |
|
| 99 |
+ expect(agent.events.count).to eq(1) |
|
| 100 |
+ expect(agent.events.last.payload).to eq({ "success" => true, "published_calendar_event" => JSON.parse(response_body), "agent_id" => event.agent_id, "event_id" => event.id })
|
|
| 101 |
+ end |
|
| 41 | 102 |
end |
| 42 | 103 |
end |
| 43 | 104 |
end |