braze_ruby 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +26 -0
  3. data/.github/workflows/gem_credentials +2 -0
  4. data/.github/workflows/release.yml +20 -0
  5. data/.gitignore +12 -19
  6. data/.standard.yml +1 -0
  7. data/Gemfile +1 -2
  8. data/LICENSE.txt +17 -18
  9. data/README.md +54 -2
  10. data/Rakefile +2 -1
  11. data/bin/release +16 -0
  12. data/braze_ruby.gemspec +28 -31
  13. data/lib/braze_ruby.rb +4 -4
  14. data/lib/braze_ruby/api.rb +17 -10
  15. data/lib/braze_ruby/deprecated.rb +4 -5
  16. data/lib/braze_ruby/endpoints.rb +11 -7
  17. data/lib/braze_ruby/endpoints/create_user_aliases.rb +19 -0
  18. data/lib/braze_ruby/endpoints/remove_email_addresses_from_spam.rb +19 -0
  19. data/lib/braze_ruby/endpoints/remove_external_ids.rb +19 -0
  20. data/lib/braze_ruby/endpoints/rename_external_ids.rb +19 -0
  21. data/lib/braze_ruby/endpoints/subscription.rb +0 -1
  22. data/lib/braze_ruby/http.rb +12 -9
  23. data/lib/braze_ruby/rest.rb +21 -17
  24. data/lib/braze_ruby/rest/base.rb +3 -3
  25. data/lib/braze_ruby/rest/canvas_details.rb +1 -1
  26. data/lib/braze_ruby/rest/create_user_aliases.rb +13 -0
  27. data/lib/braze_ruby/rest/delete_users.rb +2 -2
  28. data/lib/braze_ruby/rest/email_hard_bounces.rb +1 -1
  29. data/lib/braze_ruby/rest/email_status.rb +3 -3
  30. data/lib/braze_ruby/rest/email_unsubscribes.rb +1 -1
  31. data/lib/braze_ruby/rest/export_users.rb +7 -7
  32. data/lib/braze_ruby/rest/identify_users.rb +2 -2
  33. data/lib/braze_ruby/rest/list_segments.rb +1 -1
  34. data/lib/braze_ruby/rest/remove_email_addresses_from_spam.rb +13 -0
  35. data/lib/braze_ruby/rest/remove_external_ids.rb +13 -0
  36. data/lib/braze_ruby/rest/rename_external_ids.rb +13 -0
  37. data/lib/braze_ruby/rest/schedule_messages.rb +6 -6
  38. data/lib/braze_ruby/rest/send_messages.rb +3 -3
  39. data/lib/braze_ruby/rest/subscription_status_get.rb +1 -1
  40. data/lib/braze_ruby/rest/subscription_status_set.rb +1 -1
  41. data/lib/braze_ruby/rest/subscription_user_status.rb +1 -1
  42. data/lib/braze_ruby/rest/track_users.rb +4 -4
  43. data/lib/braze_ruby/rest/trigger_campaign_send.rb +1 -1
  44. data/lib/braze_ruby/rest/trigger_canvas_send.rb +1 -1
  45. data/lib/braze_ruby/version.rb +1 -1
  46. metadata +52 -166
  47. data/.github/workflows/ci.yml +0 -30
  48. data/Gemfile.lock +0 -78
  49. data/spec/braze_ruby/api_spec.rb +0 -6
  50. data/spec/braze_ruby/endpoints/delete_users_spec.rb +0 -31
  51. data/spec/braze_ruby/endpoints/track_users_spec.rb +0 -74
  52. data/spec/braze_ruby/http_spec.rb +0 -48
  53. data/spec/braze_ruby/rest/delete_users_spec.rb +0 -22
  54. data/spec/braze_ruby/rest/email_status_spec.rb +0 -20
  55. data/spec/braze_ruby/rest/export_users_spec.rb +0 -21
  56. data/spec/braze_ruby/rest/identify_users_spec.rb +0 -23
  57. data/spec/braze_ruby/rest/schedule_messages_spec.rb +0 -37
  58. data/spec/braze_ruby/rest/send_messages_spec.rb +0 -30
  59. data/spec/braze_ruby/rest/track_users_spec.rb +0 -27
  60. data/spec/factories.rb +0 -38
  61. data/spec/fixtures/responses/campaigns/trigger_send/sends_an_email.yml +0 -71
  62. data/spec/fixtures/responses/canvas/details/returns_error_when_no_canvas.yml +0 -69
  63. data/spec/fixtures/responses/canvas/trigger_send/sends_a_canvas.yml +0 -71
  64. data/spec/fixtures/responses/delete_users/unauthorized/responds_with_unauthorized.yml +0 -68
  65. data/spec/fixtures/responses/delete_users/with_success/responds_with_created.yml +0 -71
  66. data/spec/fixtures/responses/delete_users/with_success/responds_with_success_message.yml +0 -71
  67. data/spec/fixtures/responses/email_status/existing_email/responds_with_created.yml +0 -71
  68. data/spec/fixtures/responses/email_status/existing_email/responds_with_success_message.yml +0 -71
  69. data/spec/fixtures/responses/email_status/unknown_email/responds_with_bad_request.yml +0 -71
  70. data/spec/fixtures/responses/email_status/unknown_email/responds_with_success_message.yml +0 -71
  71. data/spec/fixtures/responses/email_sync/hard_bounces/responds_with_empty_array_when_no_hard_bounces.yml +0 -75
  72. data/spec/fixtures/responses/email_sync/unsubscribes/responds_with_empty_array_when_no_unsubscribes.yml +0 -75
  73. data/spec/fixtures/responses/email_sync/unsubscribes/responds_with_unsubscribed_emails.yml +0 -75
  74. data/spec/fixtures/responses/export_users/by_ids/with_success/responds_with_created.yml +0 -72
  75. data/spec/fixtures/responses/export_users/by_segment/with_success/responds_with_created.yml +0 -71
  76. data/spec/fixtures/responses/identify_users/unauthorized/responds_with_unauthorized.yml +0 -68
  77. data/spec/fixtures/responses/identify_users/with_success/responds_with_created.yml +0 -71
  78. data/spec/fixtures/responses/identify_users/with_success/responds_with_success_message.yml +0 -71
  79. data/spec/fixtures/responses/list_segments/with_success/responds_with_a_list_of_segments.yml +0 -81
  80. data/spec/fixtures/responses/list_segments/with_success/responds_with_success.yml +0 -81
  81. data/spec/fixtures/responses/schedule_messages/unauthorized/responds_with_unauthorize.yml +0 -68
  82. data/spec/fixtures/responses/schedule_messages/with_success/responds_with_created.yml +0 -71
  83. data/spec/fixtures/responses/schedule_messages/with_success/responds_with_success_message.yml +0 -71
  84. data/spec/fixtures/responses/send_messages/unauthorized/responds_with_unauthorized.yml +0 -68
  85. data/spec/fixtures/responses/send_messages/with_success/responds_with_created.yml +0 -71
  86. data/spec/fixtures/responses/send_messages/with_success/responds_with_success_message.yml +0 -71
  87. data/spec/fixtures/responses/subscription/subscription_status_set/when_subscribing/subscribes_the_user.yml +0 -71
  88. data/spec/fixtures/responses/subscription/subscription_status_set/when_subscription_group_does_not_exist/returns_an_error_status.yml +0 -68
  89. data/spec/fixtures/responses/subscription/subscription_status_set/when_unsubscribing/unsubscribes_the_user.yml +0 -139
  90. 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 +0 -211
  91. data/spec/fixtures/responses/subscription/when_getting_subscription_group_statuses/subscription_status_get/when_group_does_not_exist/returns_an_error.yml +0 -199
  92. data/spec/fixtures/responses/subscription/when_getting_subscription_group_statuses/subscription_user_status/returns_subscription_groups_and_status_for_every_group.yml +0 -211
  93. data/spec/fixtures/responses/track_users/unauthorized/responds_with_unauthorized.yml +0 -70
  94. data/spec/fixtures/responses/track_users/with_success/responds_with_created.yml +0 -73
  95. data/spec/fixtures/responses/track_users/with_success/responds_with_success_message.yml +0 -73
  96. data/spec/integrations/campaigns_spec.rb +0 -19
  97. data/spec/integrations/canvas_spec.rb +0 -28
  98. data/spec/integrations/delete_users_spec.rb +0 -32
  99. data/spec/integrations/email_status_spec.rb +0 -38
  100. data/spec/integrations/email_sync_spec.rb +0 -31
  101. data/spec/integrations/export_users_spec.rb +0 -29
  102. data/spec/integrations/identify_users_spec.rb +0 -32
  103. data/spec/integrations/list_segments_spec.rb +0 -21
  104. data/spec/integrations/schedule_messages_spec.rb +0 -34
  105. data/spec/integrations/send_messages_spec.rb +0 -33
  106. data/spec/integrations/subscription_spec.rb +0 -149
  107. data/spec/integrations/track_users_spec.rb +0 -38
  108. data/spec/spec_helper.rb +0 -25
  109. data/spec/support/factory_bot.rb +0 -12
  110. data/spec/support/integrations.rb +0 -27
  111. data/spec/support/vcr.rb +0 -20
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe BrazeRuby::API do
6
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- class API
6
- include BrazeRuby::Endpoints::DeleteUsers
7
-
8
- def api_key
9
- :api_key
10
- end
11
- end
12
-
13
- describe BrazeRuby::Endpoints::DeleteUsers do
14
- let(:api) { API.new }
15
- let(:delete_users_service) { double(:delete_users_service) }
16
-
17
- before { api.delete_users_service = delete_users_service }
18
-
19
- describe '#delete_users' do
20
- let(:payload) { [1, 2, 3] }
21
-
22
- subject(:delete_users!) { api.delete_users(payload) }
23
-
24
- it 'deletes users' do
25
- expect(delete_users_service).to receive(:perform)
26
- .with(external_ids: payload)
27
-
28
- delete_users!
29
- end
30
- end
31
- end
@@ -1,74 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- class API
6
- include BrazeRuby::Endpoints::TrackUsers
7
-
8
- def api_key
9
- :api_key
10
- end
11
- end
12
-
13
- describe BrazeRuby::Endpoints::TrackUsers do
14
- let(:api) { API.new }
15
- let(:track_users_service) { double(:track_users_service) }
16
-
17
- before { api.track_users_service = track_users_service }
18
-
19
- describe '#track_users' do
20
- let(:payload) {{
21
- attributes: [build(:attribute)],
22
- events: [build(:event)],
23
- purchases: [build(:purchase)]
24
- }}
25
-
26
- subject(:track_users!) { api.track_users(**payload) }
27
-
28
- it 'tracks attributes, events and purchases' do
29
- expect(track_users_service).to receive(:perform)
30
- .with(payload)
31
-
32
- track_users!
33
- end
34
- end
35
-
36
- describe '#track_purchase' do
37
- let(:payload) { build(:purchase) }
38
-
39
- subject(:track_purchase!) { api.track_purchase(**payload) }
40
-
41
- it 'tracks a single purchase' do
42
- expect(track_users_service).to receive(:perform)
43
- .with(purchases: [payload])
44
-
45
- track_purchase!
46
- end
47
- end
48
-
49
- describe '#track_event' do
50
- let(:payload) { build(:event) }
51
-
52
- subject(:track_event!) { api.track_event(**payload) }
53
-
54
- it 'tracks a single purchase' do
55
- expect(track_users_service).to receive(:perform)
56
- .with(events: [payload])
57
-
58
- track_event!
59
- end
60
- end
61
-
62
- describe '#track_attribute' do
63
- let(:payload) { build(:attribute) }
64
-
65
- subject(:track_attribute!) { api.track_attribute(**payload) }
66
-
67
- it 'tracks a single purchase' do
68
- expect(track_users_service).to receive(:perform)
69
- .with(attributes: [payload])
70
-
71
- track_attribute!
72
- end
73
- end
74
- end
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'braze_ruby/http'
5
-
6
- describe BrazeRuby::HTTP do
7
- describe "#connection" do
8
- let(:options) { double("options", :"[]=" => nil) }
9
- let(:headers) { double("headers", :"[]=" => nil) }
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" }
13
-
14
- before :each do
15
- allow(Faraday).to receive(:new).and_yield(conn)
16
- allow(Faraday).to receive(:default_adapter).and_return(:default_adapter)
17
- end
18
-
19
- it "it defaults to the timeout option" do
20
- described_class.new(api_key, braze_url).connection
21
-
22
- expect(options).to have_received(:"[]=").with(:timeout, described_class::DEFAULT_TIMEOUT)
23
- end
24
-
25
- it "it sets the default timeout option when given" do
26
- timeout = 5
27
- described_class.new(api_key, braze_url, {timeout: timeout}).connection
28
-
29
- expect(options).to have_received(:"[]=").with(:timeout, timeout)
30
- end
31
-
32
- it "sets the headers" do
33
- described_class.new(api_key, braze_url).connection
34
-
35
-
36
- expect(headers).to have_received(:"[]=").with("Content-Type", "application/json")
37
- expect(headers).to have_received(:"[]=").with("Accept", "application/json")
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")
40
- end
41
-
42
- it "it sets the default adapter" do
43
- described_class.new(api_key, braze_url).connection
44
-
45
- expect(conn).to have_received(:adapter).with(:default_adapter)
46
- end
47
- end
48
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe BrazeRuby::REST::DeleteUsers do
6
- let(:http) { double(:http) }
7
-
8
- let(:payload) { {external_ids: [1, 2, 3]} }
9
-
10
- let(:api_key) { :api_key }
11
-
12
- subject { described_class.new :api_key, :rest_url, {}}
13
-
14
- before { subject.http = http }
15
-
16
- it 'makes an http call to the delete user endpoint' do
17
- expect(http).to receive(:post).with '/users/delete',
18
- payload
19
-
20
- subject.perform(**payload)
21
- end
22
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe BrazeRuby::REST::EmailStatus do
6
- let(:http) { double(:http) }
7
-
8
- before { subject.http = http }
9
-
10
- subject { described_class.new(:api_key, :rest_url, {}, email: :email, status: :status) }
11
-
12
- it 'makes an http call to the email status endpoint' do
13
- expect(http).to receive(:post).with '/email/status', {
14
- email: :email,
15
- subscription_state: :status
16
- }
17
-
18
- subject.perform
19
- end
20
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe BrazeRuby::REST::ExportUsers do
6
- let(:http) { double(:http) }
7
-
8
- let(:payload) {{ external_ids: external_ids }}
9
- let(:external_ids) { [1] }
10
-
11
- subject { described_class.new :api_key, :rest_url, {} }
12
-
13
- before { subject.http = http }
14
-
15
- it 'makes an http call to the track user endpoint' do
16
- expect(http).to receive(:post).with '/users/export/ids',
17
- payload
18
-
19
- subject.perform(**payload)
20
- end
21
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe BrazeRuby::REST::IdentifyUsers do
6
- let(:http) { double(:http) }
7
-
8
- let(:payload) { {aliases_to_identify: [user]} }
9
- let(:user) { { external_id: 123, user_alias: { alias_name: 'abc', alias_label: 'foo' } } }
10
-
11
- let(:api_key) { :api_key }
12
-
13
- subject { described_class.new :api_key, :rest_url, {}}
14
-
15
- before { subject.http = http }
16
-
17
- it 'makes an http call to the identify users endpoint' do
18
- expect(http).to receive(:post).with '/users/identify',
19
- payload
20
-
21
- subject.perform(**payload)
22
- end
23
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe BrazeRuby::REST::ScheduleMessages do
6
- let(:http) { double(:http) }
7
-
8
- let(:payload) {{
9
- external_user_ids: :external_user_ids,
10
- time: :time,
11
- in_local_time: :in_local_time,
12
- messages: :messages
13
- }}
14
-
15
- let(:api_key) { :api_key }
16
-
17
- subject { described_class.new(api_key, :rest_url, {}, **payload) }
18
-
19
- before { subject.http = http }
20
-
21
- it 'makes an http call to the schedule messages endpoint' do
22
- expect_schedule_messages_http_call
23
-
24
- subject.perform
25
- end
26
-
27
- def expect_schedule_messages_http_call
28
- expect(http).to receive(:post).with '/messages/schedule/create', {
29
- external_user_ids: :external_user_ids,
30
- schedule: {
31
- time: :time,
32
- in_local_time: :in_local_time
33
- },
34
- messages: :messages
35
- }
36
- end
37
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe BrazeRuby::REST::SendMessages do
6
- let(:http) { double(:http) }
7
-
8
- subject { described_class.new(
9
- :api_key,
10
- :rest_url,
11
- {},
12
- messages: ["message"],
13
- external_user_ids: ["1", "2"]
14
- ) }
15
-
16
- before { subject.http = http }
17
-
18
- it 'makes an http call to the send messages endpoint' do
19
- expect_send_messages_http_call
20
-
21
- subject.perform
22
- end
23
-
24
- def expect_send_messages_http_call
25
- expect(http).to receive(:post).with '/messages/send', {
26
- messages: ["message"],
27
- external_user_ids: ["1", "2"],
28
- }
29
- end
30
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe BrazeRuby::REST::TrackUsers do
6
- let(:http) { double(:http) }
7
-
8
- let(:payload) do
9
- {
10
- attributes: :attributes,
11
- events: :events,
12
- purchases: :purchases
13
- }
14
- end
15
-
16
- let(:api_key) { :api_key }
17
-
18
- subject { described_class.new :api_key, :rest_url, {}}
19
-
20
- before { subject.http = http }
21
-
22
- it 'makes an http call to the track user endpoint' do
23
- expect(http).to receive(:post).with '/users/track', payload
24
-
25
- subject.perform(**payload)
26
- end
27
- end
data/spec/factories.rb DELETED
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- FactoryBot.define do
4
- factory :attribute, class: Hash do
5
- skip_create
6
- external_id { 1 }
7
- foo { :bar }
8
-
9
- initialize_with { attributes }
10
- end
11
-
12
- factory :event, class: Hash do
13
- skip_create
14
- external_id { 1 }
15
- name { :baz }
16
- time { Time.now }
17
-
18
- initialize_with { attributes }
19
- end
20
-
21
- factory :purchase, class: Hash do
22
- skip_create
23
- external_id { 1 }
24
- product_id { 1 }
25
- time { Time.now }
26
- currency { 'CAD' }
27
- price { 1.0 }
28
-
29
- initialize_with { attributes }
30
- end
31
-
32
- factory :messages, class: Hash do
33
- skip_create
34
- apple_push { {alert: :hello} }
35
-
36
- initialize_with { attributes }
37
- end
38
- end
@@ -1,71 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: post
5
- uri: "<BRAZE_REST_URL>/campaigns/trigger/send"
6
- body:
7
- encoding: UTF-8
8
- string: '{"campaign_id":"d8b73da7-0b7c-fc72-1d80-e59c7f20f0d3","recipients":[{"external_user_id":12345,"trigger_properties":{"first_name":"John"}}]}'
9
- headers:
10
- Content-Type:
11
- - application/json
12
- Accept:
13
- - application/json
14
- User-Agent:
15
- - Braze Ruby gem v0.3.3
16
- Authorization:
17
- - Bearer <BRAZE_REST_API_KEY>
18
- Accept-Encoding:
19
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
20
- response:
21
- status:
22
- code: 201
23
- message: Created
24
- headers:
25
- Connection:
26
- - keep-alive
27
- Content-Length:
28
- - '94'
29
- Cache-Control:
30
- - max-age=0, private, must-revalidate
31
- Content-Type:
32
- - application/json
33
- Etag:
34
- - W/"b02a5788c87daf846d9cf451bf7f4e6d"
35
- Server:
36
- - nginx
37
- Strict-Transport-Security:
38
- - max-age=0; includeSubDomains
39
- - max-age=31536000; includeSubDomains
40
- X-Ratelimit-Limit:
41
- - '250000'
42
- X-Ratelimit-Remaining:
43
- - '249998'
44
- X-Ratelimit-Reset:
45
- - '1592427600'
46
- X-Request-Id:
47
- - ab80a33e-db36-4fe9-af89-6ce274df5edc
48
- X-Runtime:
49
- - '0.016803'
50
- Accept-Ranges:
51
- - bytes
52
- Date:
53
- - Wed, 17 Jun 2020 20:04:46 GMT
54
- Via:
55
- - 1.1 varnish
56
- X-Served-By:
57
- - cache-hhn4039-HHN
58
- X-Cache:
59
- - MISS
60
- X-Cache-Hits:
61
- - '0'
62
- X-Timer:
63
- - S1592424287.720589,VS0,VE19
64
- Vary:
65
- - Origin,Accept-Encoding
66
- body:
67
- encoding: ASCII-8BIT
68
- string: '{"dispatch_id":"14497aa4b013bf150881547fb3076fd6","message":"success"}'
69
- http_version:
70
- recorded_at: Wed, 17 Jun 2020 20:04:46 GMT
71
- recorded_with: VCR 5.0.0