braze_ruby 0.3.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +14 -3
  3. data/Gemfile.lock +38 -38
  4. data/braze_ruby.gemspec +6 -6
  5. data/lib/braze_ruby/api.rb +2 -2
  6. data/lib/braze_ruby/endpoints/campaigns.rb +1 -1
  7. data/lib/braze_ruby/endpoints/canvas.rb +2 -2
  8. data/lib/braze_ruby/endpoints/delete_users.rb +2 -2
  9. data/lib/braze_ruby/endpoints/email_status.rb +1 -1
  10. data/lib/braze_ruby/endpoints/email_sync.rb +2 -2
  11. data/lib/braze_ruby/endpoints/identify_users.rb +2 -2
  12. data/lib/braze_ruby/endpoints/schedule_messages.rb +1 -1
  13. data/lib/braze_ruby/endpoints/send_messages.rb +1 -1
  14. data/lib/braze_ruby/endpoints/subscription.rb +3 -3
  15. data/lib/braze_ruby/endpoints/track_users.rb +5 -5
  16. data/lib/braze_ruby/http.rb +8 -6
  17. data/lib/braze_ruby/rest/base.rb +4 -3
  18. data/lib/braze_ruby/rest/canvas_details.rb +2 -4
  19. data/lib/braze_ruby/rest/delete_users.rb +1 -2
  20. data/lib/braze_ruby/rest/email_hard_bounces.rb +2 -4
  21. data/lib/braze_ruby/rest/email_status.rb +2 -4
  22. data/lib/braze_ruby/rest/email_unsubscribes.rb +2 -4
  23. data/lib/braze_ruby/rest/export_users.rb +5 -7
  24. data/lib/braze_ruby/rest/identify_users.rb +2 -3
  25. data/lib/braze_ruby/rest/list_segments.rb +2 -4
  26. data/lib/braze_ruby/rest/schedule_messages.rb +2 -4
  27. data/lib/braze_ruby/rest/send_messages.rb +2 -4
  28. data/lib/braze_ruby/rest/subscription_status_get.rb +2 -4
  29. data/lib/braze_ruby/rest/subscription_status_set.rb +2 -4
  30. data/lib/braze_ruby/rest/subscription_user_status.rb +2 -4
  31. data/lib/braze_ruby/rest/track_users.rb +1 -2
  32. data/lib/braze_ruby/rest/trigger_campaign_send.rb +3 -7
  33. data/lib/braze_ruby/rest/trigger_canvas_send.rb +2 -4
  34. data/lib/braze_ruby/version.rb +1 -1
  35. data/spec/braze_ruby/endpoints/delete_users_spec.rb +1 -1
  36. data/spec/braze_ruby/endpoints/track_users_spec.rb +8 -8
  37. data/spec/braze_ruby/http_spec.rb +7 -4
  38. data/spec/braze_ruby/rest/delete_users_spec.rb +3 -3
  39. data/spec/braze_ruby/rest/email_status_spec.rb +0 -1
  40. data/spec/braze_ruby/rest/export_users_spec.rb +3 -3
  41. data/spec/braze_ruby/rest/identify_users_spec.rb +3 -3
  42. data/spec/braze_ruby/rest/schedule_messages_spec.rb +1 -2
  43. data/spec/braze_ruby/rest/send_messages_spec.rb +6 -13
  44. data/spec/braze_ruby/rest/track_users_spec.rb +10 -9
  45. data/spec/fixtures/responses/campaigns/trigger_send/sends_an_email.yml +17 -15
  46. data/spec/fixtures/responses/canvas/details/returns_error_when_no_canvas.yml +16 -14
  47. data/spec/fixtures/responses/canvas/trigger_send/sends_a_canvas.yml +18 -16
  48. data/spec/fixtures/responses/delete_users/unauthorized/responds_with_unauthorized.yml +20 -18
  49. data/spec/fixtures/responses/delete_users/with_success/responds_with_created.yml +25 -23
  50. data/spec/fixtures/responses/delete_users/with_success/responds_with_success_message.yml +25 -23
  51. data/spec/fixtures/responses/email_status/existing_email/responds_with_created.yml +22 -20
  52. data/spec/fixtures/responses/email_status/existing_email/responds_with_success_message.yml +22 -20
  53. data/spec/fixtures/responses/email_status/unknown_email/responds_with_bad_request.yml +22 -20
  54. data/spec/fixtures/responses/email_status/unknown_email/responds_with_success_message.yml +22 -20
  55. data/spec/fixtures/responses/email_sync/hard_bounces/responds_with_empty_array_when_no_hard_bounces.yml +18 -16
  56. data/spec/fixtures/responses/email_sync/unsubscribes/responds_with_empty_array_when_no_unsubscribes.yml +18 -16
  57. data/spec/fixtures/responses/email_sync/unsubscribes/responds_with_unsubscribed_emails.yml +21 -20
  58. data/spec/fixtures/responses/export_users/by_ids/with_success/responds_with_created.yml +25 -22
  59. data/spec/fixtures/responses/export_users/by_segment/with_success/responds_with_created.yml +24 -22
  60. data/spec/fixtures/responses/identify_users/unauthorized/responds_with_unauthorized.yml +10 -8
  61. data/spec/fixtures/responses/identify_users/with_success/responds_with_created.yml +12 -10
  62. data/spec/fixtures/responses/identify_users/with_success/responds_with_success_message.yml +12 -10
  63. data/spec/fixtures/responses/list_segments/with_success/responds_with_a_list_of_segments.yml +35 -35
  64. data/spec/fixtures/responses/list_segments/with_success/responds_with_success.yml +35 -35
  65. data/spec/fixtures/responses/schedule_messages/unauthorized/responds_with_unauthorize.yml +20 -19
  66. data/spec/fixtures/responses/schedule_messages/with_success/responds_with_created.yml +24 -23
  67. data/spec/fixtures/responses/schedule_messages/with_success/responds_with_success_message.yml +24 -23
  68. data/spec/fixtures/responses/send_messages/unauthorized/responds_with_unauthorized.yml +20 -18
  69. data/spec/fixtures/responses/send_messages/with_success/responds_with_created.yml +24 -22
  70. data/spec/fixtures/responses/send_messages/with_success/responds_with_success_message.yml +24 -22
  71. data/spec/fixtures/responses/subscription/subscription_status_set/when_subscribing/subscribes_the_user.yml +16 -14
  72. data/spec/fixtures/responses/subscription/subscription_status_set/when_subscription_group_does_not_exist/returns_an_error_status.yml +16 -14
  73. data/spec/fixtures/responses/subscription/subscription_status_set/when_unsubscribing/unsubscribes_the_user.yml +32 -28
  74. data/spec/fixtures/responses/subscription/when_getting_subscription_group_statuses/subscription_status_get/when_checking_subscribed_and_unsubscribed_user_status/returns_only_users_that_were_once_subscribed.yml +50 -44
  75. data/spec/fixtures/responses/subscription/when_getting_subscription_group_statuses/subscription_status_get/when_group_does_not_exist/returns_an_error.yml +48 -42
  76. data/spec/fixtures/responses/subscription/when_getting_subscription_group_statuses/subscription_user_status/returns_subscription_groups_and_status_for_every_group.yml +50 -46
  77. data/spec/fixtures/responses/track_users/unauthorized/responds_with_unauthorized.yml +23 -21
  78. data/spec/fixtures/responses/track_users/with_success/responds_with_created.yml +22 -20
  79. data/spec/fixtures/responses/track_users/with_success/responds_with_success_message.yml +22 -20
  80. data/spec/integrations/campaigns_spec.rb +4 -2
  81. data/spec/integrations/canvas_spec.rb +4 -2
  82. data/spec/integrations/delete_users_spec.rb +1 -0
  83. data/spec/integrations/email_sync_spec.rb +2 -2
  84. data/spec/integrations/export_users_spec.rb +2 -2
  85. data/spec/integrations/identify_users_spec.rb +1 -1
  86. data/spec/integrations/list_segments_spec.rb +1 -1
  87. data/spec/integrations/schedule_messages_spec.rb +2 -1
  88. data/spec/integrations/send_messages_spec.rb +2 -1
  89. data/spec/integrations/subscription_spec.rb +7 -7
  90. data/spec/integrations/track_users_spec.rb +1 -0
  91. data/spec/spec_helper.rb +0 -8
  92. data/spec/support/vcr.rb +3 -1
  93. metadata +15 -15
@@ -3,18 +3,16 @@
3
3
  module BrazeRuby
4
4
  module REST
5
5
  class EmailStatus < Base
6
- attr_reader :api_key, :email, :status
6
+ attr_reader :email, :status
7
7
 
8
8
  def initialize(api_key, braze_url, options, email: nil, status: nil)
9
- @api_key = api_key
10
9
  @email = email
11
10
  @status = status
12
- super braze_url, options
11
+ super api_key, braze_url, options
13
12
  end
14
13
 
15
14
  def perform
16
15
  http.post '/email/status', {
17
- 'api_key': api_key,
18
16
  'email': email,
19
17
  'subscription_state': status
20
18
  }
@@ -3,17 +3,15 @@
3
3
  module BrazeRuby
4
4
  module REST
5
5
  class EmailUnsubscribes < Base
6
- attr_reader :api_key, :params
6
+ attr_reader :params
7
7
 
8
8
  def initialize(api_key, braze_url, options, **params)
9
- @api_key = api_key
10
9
  @params = params
11
- super braze_url, options
10
+ super api_key, braze_url, options
12
11
  end
13
12
 
14
13
  def perform
15
14
  http.get('/email/unsubscribes', {
16
- 'api_key': api_key,
17
15
  **params
18
16
  })
19
17
  end
@@ -3,24 +3,22 @@
3
3
  module BrazeRuby
4
4
  module REST
5
5
  class ExportUsers < Base
6
- def perform(api_key, external_ids: nil, segment_id: nil, **options)
7
- return export_users_by_ids(api_key, external_ids) if external_ids
6
+ def perform(external_ids: nil, segment_id: nil, **options)
7
+ return export_users_by_ids(external_ids) if external_ids
8
8
 
9
- export_users_by_segment(api_key, segment_id, options) if segment_id
9
+ export_users_by_segment(segment_id, options) if segment_id
10
10
  end
11
11
 
12
12
  private
13
13
 
14
- def export_users_by_ids(api_key, external_ids)
14
+ def export_users_by_ids(external_ids)
15
15
  http.post '/users/export/ids', {
16
- 'api_key': api_key,
17
16
  'external_ids': external_ids
18
17
  }
19
18
  end
20
19
 
21
- def export_users_by_segment(api_key, segment_id, options)
20
+ def export_users_by_segment(segment_id, options)
22
21
  http.post '/users/export/segment', {
23
- 'api_key': api_key,
24
22
  'segment_id': segment_id
25
23
  }.merge(options)
26
24
  end
@@ -3,10 +3,9 @@
3
3
  module BrazeRuby
4
4
  module REST
5
5
  class IdentifyUsers < Base
6
- def perform(api_key, aliases_to_identify: [])
6
+ def perform(aliases_to_identify: [])
7
7
  http.post '/users/identify', {
8
- 'api_key': api_key,
9
- 'aliases_to_identify': aliases_to_identify,
8
+ 'aliases_to_identify': aliases_to_identify
10
9
  }
11
10
  end
12
11
  end
@@ -3,10 +3,8 @@
3
3
  module BrazeRuby
4
4
  module REST
5
5
  class ListSegments < Base
6
- def perform(api_key)
7
- http.get '/segments/list', {
8
- 'api_key': api_key
9
- }
6
+ def perform
7
+ http.get '/segments/list'
10
8
  end
11
9
  end
12
10
  end
@@ -3,20 +3,18 @@
3
3
  module BrazeRuby
4
4
  module REST
5
5
  class ScheduleMessages < Base
6
- attr_reader :api_key, :time, :messages, :in_local_time, :external_user_ids
6
+ attr_reader :time, :messages, :in_local_time, :external_user_ids
7
7
 
8
8
  def initialize(api_key, braze_url, options, time: nil, messages: [], external_user_ids: [], in_local_time: false)
9
- @api_key = api_key
10
9
  @messages = messages
11
10
  @time = time
12
11
  @external_user_ids = external_user_ids
13
12
  @in_local_time = in_local_time
14
- super braze_url, options
13
+ super api_key, braze_url, options
15
14
  end
16
15
 
17
16
  def perform
18
17
  http.post '/messages/schedule/create', {
19
- 'api_key': api_key,
20
18
  'external_user_ids': external_user_ids,
21
19
  'schedule': {
22
20
  'time': time,
@@ -3,18 +3,16 @@
3
3
  module BrazeRuby
4
4
  module REST
5
5
  class SendMessages < Base
6
- attr_reader :api_key, :messages, :external_user_ids
6
+ attr_reader :messages, :external_user_ids
7
7
 
8
8
  def initialize(api_key, braze_url, options, messages: [], external_user_ids: [])
9
- @api_key = api_key
10
9
  @messages = messages
11
10
  @external_user_ids = external_user_ids
12
- super braze_url, options
11
+ super api_key, braze_url, options
13
12
  end
14
13
 
15
14
  def perform
16
15
  http.post '/messages/send', {
17
- 'api_key': api_key,
18
16
  'messages': messages,
19
17
  'external_user_ids': external_user_ids
20
18
  }
@@ -3,17 +3,15 @@
3
3
  module BrazeRuby
4
4
  module REST
5
5
  class SubscriptionStatusGet < Base
6
- attr_reader :api_key, :params
6
+ attr_reader :params
7
7
 
8
8
  def initialize(api_key, braze_url, options, **params)
9
- @api_key = api_key
10
9
  @params = params
11
- super braze_url, options
10
+ super api_key, braze_url, options
12
11
  end
13
12
 
14
13
  def perform
15
14
  http.get('/subscription/status/get', {
16
- 'api_key': api_key,
17
15
  **params
18
16
  })
19
17
  end
@@ -3,17 +3,15 @@
3
3
  module BrazeRuby
4
4
  module REST
5
5
  class SubscriptionStatusSet < Base
6
- attr_reader :api_key, :params
6
+ attr_reader :params
7
7
 
8
8
  def initialize(api_key, braze_url, options, **params)
9
- @api_key = api_key
10
9
  @params = params
11
- super braze_url, options
10
+ super api_key, braze_url, options
12
11
  end
13
12
 
14
13
  def perform
15
14
  http.post('/subscription/status/set', {
16
- 'api_key': api_key,
17
15
  **params
18
16
  })
19
17
  end
@@ -3,17 +3,15 @@
3
3
  module BrazeRuby
4
4
  module REST
5
5
  class SubscriptionUserStatus < Base
6
- attr_reader :api_key, :params
6
+ attr_reader :params
7
7
 
8
8
  def initialize(api_key, braze_url, options, **params)
9
- @api_key = api_key
10
9
  @params = params
11
- super braze_url, options
10
+ super api_key, braze_url, options
12
11
  end
13
12
 
14
13
  def perform
15
14
  http.get('/subscription/user/status', {
16
- 'api_key': api_key,
17
15
  **params
18
16
  })
19
17
  end
@@ -3,9 +3,8 @@
3
3
  module BrazeRuby
4
4
  module REST
5
5
  class TrackUsers < Base
6
- def perform(api_key, attributes: [], events: [], purchases: [])
6
+ def perform(attributes: [], events: [], purchases: [])
7
7
  http.post '/users/track', {
8
- 'api_key': api_key,
9
8
  'attributes': attributes,
10
9
  'events': events,
11
10
  'purchases': purchases
@@ -3,19 +3,15 @@
3
3
  module BrazeRuby
4
4
  module REST
5
5
  class TriggerCampaignSend < Base
6
- attr_reader :api_key, :params
6
+ attr_reader :params
7
7
 
8
8
  def initialize(api_key, braze_url, options, **params)
9
- @api_key = api_key
10
9
  @params = params
11
- super braze_url, options
10
+ super api_key, braze_url, options
12
11
  end
13
12
 
14
13
  def perform
15
- http.post('/campaigns/trigger/send', {
16
- 'api_key': api_key,
17
- **@params
18
- })
14
+ http.post('/campaigns/trigger/send', @params)
19
15
  end
20
16
  end
21
17
  end
@@ -3,17 +3,15 @@
3
3
  module BrazeRuby
4
4
  module REST
5
5
  class TriggerCanvasSend < Base
6
- attr_reader :api_key, :params
6
+ attr_reader :params
7
7
 
8
8
  def initialize(api_key, braze_url, options, **params)
9
- @api_key = api_key
10
9
  @params = params
11
- super braze_url, options
10
+ super api_key, braze_url, options
12
11
  end
13
12
 
14
13
  def perform
15
14
  http.post('/canvas/trigger/send', {
16
- 'api_key': api_key,
17
15
  **@params
18
16
  })
19
17
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BrazeRuby
4
- VERSION = '0.3.3'.freeze
4
+ VERSION = '0.4.0'.freeze
5
5
  end
@@ -23,7 +23,7 @@ describe BrazeRuby::Endpoints::DeleteUsers do
23
23
 
24
24
  it 'deletes users' do
25
25
  expect(delete_users_service).to receive(:perform)
26
- .with(:api_key, external_ids: payload)
26
+ .with(external_ids: payload)
27
27
 
28
28
  delete_users!
29
29
  end
@@ -23,11 +23,11 @@ describe BrazeRuby::Endpoints::TrackUsers do
23
23
  purchases: [build(:purchase)]
24
24
  }}
25
25
 
26
- subject(:track_users!) { api.track_users(payload) }
26
+ subject(:track_users!) { api.track_users(**payload) }
27
27
 
28
28
  it 'tracks attributes, events and purchases' do
29
29
  expect(track_users_service).to receive(:perform)
30
- .with(:api_key, payload)
30
+ .with(payload)
31
31
 
32
32
  track_users!
33
33
  end
@@ -36,11 +36,11 @@ describe BrazeRuby::Endpoints::TrackUsers do
36
36
  describe '#track_purchase' do
37
37
  let(:payload) { build(:purchase) }
38
38
 
39
- subject(:track_purchase!) { api.track_purchase(payload) }
39
+ subject(:track_purchase!) { api.track_purchase(**payload) }
40
40
 
41
41
  it 'tracks a single purchase' do
42
42
  expect(track_users_service).to receive(:perform)
43
- .with(:api_key, purchases: [payload])
43
+ .with(purchases: [payload])
44
44
 
45
45
  track_purchase!
46
46
  end
@@ -49,11 +49,11 @@ describe BrazeRuby::Endpoints::TrackUsers do
49
49
  describe '#track_event' do
50
50
  let(:payload) { build(:event) }
51
51
 
52
- subject(:track_event!) { api.track_event(payload) }
52
+ subject(:track_event!) { api.track_event(**payload) }
53
53
 
54
54
  it 'tracks a single purchase' do
55
55
  expect(track_users_service).to receive(:perform)
56
- .with(:api_key, events: [payload])
56
+ .with(events: [payload])
57
57
 
58
58
  track_event!
59
59
  end
@@ -62,11 +62,11 @@ describe BrazeRuby::Endpoints::TrackUsers do
62
62
  describe '#track_attribute' do
63
63
  let(:payload) { build(:attribute) }
64
64
 
65
- subject(:track_attribute!) { api.track_attribute(payload) }
65
+ subject(:track_attribute!) { api.track_attribute(**payload) }
66
66
 
67
67
  it 'tracks a single purchase' do
68
68
  expect(track_users_service).to receive(:perform)
69
- .with(:api_key, attributes: [payload])
69
+ .with(attributes: [payload])
70
70
 
71
71
  track_attribute!
72
72
  end
@@ -8,6 +8,8 @@ describe BrazeRuby::HTTP do
8
8
  let(:options) { double("options", :"[]=" => nil) }
9
9
  let(:headers) { double("headers", :"[]=" => nil) }
10
10
  let(:conn) { double("conn", adapter: nil, options: options, headers: headers) }
11
+ let(:api_key) { "braze-api-key" }
12
+ let(:braze_url) { "http://example.com" }
11
13
 
12
14
  before :each do
13
15
  allow(Faraday).to receive(:new).and_yield(conn)
@@ -15,29 +17,30 @@ describe BrazeRuby::HTTP do
15
17
  end
16
18
 
17
19
  it "it defaults to the timeout option" do
18
- described_class.new("http://example.com").connection
20
+ described_class.new(api_key, braze_url).connection
19
21
 
20
22
  expect(options).to have_received(:"[]=").with(:timeout, described_class::DEFAULT_TIMEOUT)
21
23
  end
22
24
 
23
25
  it "it sets the default timeout option when given" do
24
26
  timeout = 5
25
- described_class.new("http://example.com", {timeout: timeout}).connection
27
+ described_class.new(api_key, braze_url, {timeout: timeout}).connection
26
28
 
27
29
  expect(options).to have_received(:"[]=").with(:timeout, timeout)
28
30
  end
29
31
 
30
32
  it "sets the headers" do
31
- described_class.new("http://example.com").connection
33
+ described_class.new(api_key, braze_url).connection
32
34
 
33
35
 
34
36
  expect(headers).to have_received(:"[]=").with("Content-Type", "application/json")
35
37
  expect(headers).to have_received(:"[]=").with("Accept", "application/json")
36
38
  expect(headers).to have_received(:"[]=").with("User-Agent", "Braze Ruby gem v#{BrazeRuby::VERSION}")
39
+ expect(headers).to have_received(:"[]=").with("Authorization", "Bearer braze-api-key")
37
40
  end
38
41
 
39
42
  it "it sets the default adapter" do
40
- described_class.new("http://example.com").connection
43
+ described_class.new(api_key, braze_url).connection
41
44
 
42
45
  expect(conn).to have_received(:adapter).with(:default_adapter)
43
46
  end
@@ -9,14 +9,14 @@ describe BrazeRuby::REST::DeleteUsers do
9
9
 
10
10
  let(:api_key) { :api_key }
11
11
 
12
- subject { described_class.new :rest_url, {}}
12
+ subject { described_class.new :api_key, :rest_url, {}}
13
13
 
14
14
  before { subject.http = http }
15
15
 
16
16
  it 'makes an http call to the delete user endpoint' do
17
17
  expect(http).to receive(:post).with '/users/delete',
18
- payload.merge({ api_key: :api_key })
18
+ payload
19
19
 
20
- subject.perform(api_key, payload)
20
+ subject.perform(**payload)
21
21
  end
22
22
  end
@@ -11,7 +11,6 @@ describe BrazeRuby::REST::EmailStatus do
11
11
 
12
12
  it 'makes an http call to the email status endpoint' do
13
13
  expect(http).to receive(:post).with '/email/status', {
14
- api_key: :api_key,
15
14
  email: :email,
16
15
  subscription_state: :status
17
16
  }
@@ -8,14 +8,14 @@ describe BrazeRuby::REST::ExportUsers do
8
8
  let(:payload) {{ external_ids: external_ids }}
9
9
  let(:external_ids) { [1] }
10
10
 
11
- subject { described_class.new :rest_url, {} }
11
+ subject { described_class.new :api_key, :rest_url, {} }
12
12
 
13
13
  before { subject.http = http }
14
14
 
15
15
  it 'makes an http call to the track user endpoint' do
16
16
  expect(http).to receive(:post).with '/users/export/ids',
17
- payload.merge({ api_key: :api_key })
17
+ payload
18
18
 
19
- subject.perform(:api_key, payload)
19
+ subject.perform(**payload)
20
20
  end
21
21
  end
@@ -10,14 +10,14 @@ describe BrazeRuby::REST::IdentifyUsers do
10
10
 
11
11
  let(:api_key) { :api_key }
12
12
 
13
- subject { described_class.new :rest_url, {}}
13
+ subject { described_class.new :api_key, :rest_url, {}}
14
14
 
15
15
  before { subject.http = http }
16
16
 
17
17
  it 'makes an http call to the identify users endpoint' do
18
18
  expect(http).to receive(:post).with '/users/identify',
19
- payload.merge({ api_key: :api_key })
19
+ payload
20
20
 
21
- subject.perform(api_key, payload)
21
+ subject.perform(**payload)
22
22
  end
23
23
  end
@@ -14,7 +14,7 @@ describe BrazeRuby::REST::ScheduleMessages do
14
14
 
15
15
  let(:api_key) { :api_key }
16
16
 
17
- subject { described_class.new(api_key, :rest_url, {}, payload) }
17
+ subject { described_class.new(api_key, :rest_url, {}, **payload) }
18
18
 
19
19
  before { subject.http = http }
20
20
 
@@ -26,7 +26,6 @@ describe BrazeRuby::REST::ScheduleMessages do
26
26
 
27
27
  def expect_schedule_messages_http_call
28
28
  expect(http).to receive(:post).with '/messages/schedule/create', {
29
- api_key: api_key,
30
29
  external_user_ids: :external_user_ids,
31
30
  schedule: {
32
31
  time: :time,