hubspot-api-ruby 0.8.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 (73) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/Gemfile +3 -0
  4. data/Guardfile +9 -0
  5. data/LICENSE.txt +18 -0
  6. data/README.md +295 -0
  7. data/RELEASING.md +6 -0
  8. data/Rakefile +32 -0
  9. data/hubspot-api-ruby.gemspec +42 -0
  10. data/lib/hubspot-api-ruby.rb +39 -0
  11. data/lib/hubspot/blog.rb +98 -0
  12. data/lib/hubspot/collection.rb +41 -0
  13. data/lib/hubspot/company.rb +160 -0
  14. data/lib/hubspot/company_properties.rb +59 -0
  15. data/lib/hubspot/config.rb +63 -0
  16. data/lib/hubspot/connection.rb +152 -0
  17. data/lib/hubspot/contact.rb +110 -0
  18. data/lib/hubspot/contact_list.rb +129 -0
  19. data/lib/hubspot/contact_properties.rb +59 -0
  20. data/lib/hubspot/deal.rb +173 -0
  21. data/lib/hubspot/deal_pipeline.rb +58 -0
  22. data/lib/hubspot/deal_properties.rb +59 -0
  23. data/lib/hubspot/deprecator.rb +7 -0
  24. data/lib/hubspot/engagement.rb +222 -0
  25. data/lib/hubspot/event.rb +21 -0
  26. data/lib/hubspot/exceptions.rb +18 -0
  27. data/lib/hubspot/file.rb +38 -0
  28. data/lib/hubspot/form.rb +95 -0
  29. data/lib/hubspot/oauth.rb +50 -0
  30. data/lib/hubspot/owner.rb +57 -0
  31. data/lib/hubspot/paged_collection.rb +35 -0
  32. data/lib/hubspot/properties.rb +123 -0
  33. data/lib/hubspot/railtie.rb +10 -0
  34. data/lib/hubspot/resource.rb +270 -0
  35. data/lib/hubspot/subscription.rb +37 -0
  36. data/lib/hubspot/topic.rb +37 -0
  37. data/lib/hubspot/utils.rb +127 -0
  38. data/lib/tasks/hubspot.rake +53 -0
  39. data/spec/factories/companies.rb +9 -0
  40. data/spec/factories/contacts.rb +10 -0
  41. data/spec/lib/hubspot-ruby_spec.rb +12 -0
  42. data/spec/lib/hubspot/blog_spec.rb +150 -0
  43. data/spec/lib/hubspot/company_properties_spec.rb +410 -0
  44. data/spec/lib/hubspot/company_spec.rb +340 -0
  45. data/spec/lib/hubspot/config_spec.rb +87 -0
  46. data/spec/lib/hubspot/connection_spec.rb +214 -0
  47. data/spec/lib/hubspot/contact_list_spec.rb +301 -0
  48. data/spec/lib/hubspot/contact_properties_spec.rb +245 -0
  49. data/spec/lib/hubspot/contact_spec.rb +223 -0
  50. data/spec/lib/hubspot/deal_pipeline_spec.rb +85 -0
  51. data/spec/lib/hubspot/deal_properties_spec.rb +262 -0
  52. data/spec/lib/hubspot/deal_spec.rb +185 -0
  53. data/spec/lib/hubspot/deprecator_spec.rb +15 -0
  54. data/spec/lib/hubspot/engagement_spec.rb +177 -0
  55. data/spec/lib/hubspot/event_spec.rb +33 -0
  56. data/spec/lib/hubspot/file_spec.rb +38 -0
  57. data/spec/lib/hubspot/form_spec.rb +189 -0
  58. data/spec/lib/hubspot/owner_spec.rb +56 -0
  59. data/spec/lib/hubspot/properties_spec.rb +45 -0
  60. data/spec/lib/hubspot/resource_spec.rb +54 -0
  61. data/spec/lib/hubspot/topic_spec.rb +23 -0
  62. data/spec/lib/hubspot/utils_spec.rb +164 -0
  63. data/spec/lib/tasks/hubspot_spec.rb +119 -0
  64. data/spec/shared_examples/saveable_resource.rb +45 -0
  65. data/spec/shared_examples/updateable_resource.rb +87 -0
  66. data/spec/spec_helper.rb +44 -0
  67. data/spec/support/capture_output.rb +21 -0
  68. data/spec/support/cassette_helper.rb +19 -0
  69. data/spec/support/hubspot_api_helpers.rb +13 -0
  70. data/spec/support/rake.rb +46 -0
  71. data/spec/support/tests_helper.rb +17 -0
  72. data/spec/support/vcr.rb +16 -0
  73. metadata +369 -0
@@ -0,0 +1,340 @@
1
+ RSpec.describe Hubspot::Company do
2
+ # let(:example_company_hash) do
3
+ # VCR.use_cassette("company_example") do
4
+ # HTTParty.get("https://api.hubapi.com/companies/v2/companies/21827084?hapikey=demo").parsed_response
5
+ # end
6
+ # end
7
+ # let(:company_with_contacts_hash) do
8
+ # VCR.use_cassette("company_with_contacts") do
9
+ # HTTParty.get("https://api.hubapi.com/companies/v2/companies/115200636?hapikey=demo").parsed_response
10
+ # end
11
+ # end
12
+
13
+ before{ Hubspot.configure(hapikey: "demo") }
14
+
15
+ it_behaves_like "a saveable resource", :company do
16
+ def set_property(company)
17
+ company.name = "Foobar"
18
+ end
19
+ end
20
+
21
+ it_behaves_like "an updateable resource", :company do
22
+ let(:changed_properties) { { name: "Foobar" } }
23
+ let(:overlapping_properties) { { name: "My Corp", description: "My Corporation" } }
24
+ end
25
+
26
+ describe '.find' do
27
+ context 'with a valid ID' do
28
+ cassette
29
+ let(:company) { create :company }
30
+ subject { described_class.find company.id }
31
+
32
+ it 'finds the company' do
33
+ expect(subject).to be_a(described_class)
34
+ expect(subject.id).to eq(company.id)
35
+ end
36
+ end
37
+
38
+ context 'with an invalid ID' do
39
+ cassette
40
+ subject { described_class.find 0 }
41
+
42
+ it 'raises an error' do
43
+ expect {
44
+ subject
45
+ }.to raise_error(Hubspot::RequestError, /resource not found/)
46
+ end
47
+ end
48
+ end
49
+
50
+ describe '.create' do
51
+ context 'with no properties' do
52
+ cassette
53
+ subject { described_class.create }
54
+
55
+ it 'creates a new company' do
56
+ expect(subject).to be_a(described_class)
57
+ expect(subject.id).not_to be_nil
58
+ end
59
+ end
60
+
61
+ context 'with properties' do
62
+ cassette
63
+
64
+ let(:name) { "Foo Bar Inc." }
65
+ let(:properties) { { name: name } }
66
+ subject { described_class.create properties }
67
+
68
+ it 'creates a new company' do
69
+ expect(subject).to be_a(described_class)
70
+ expect(subject.id).not_to be_nil
71
+ end
72
+
73
+ it 'has the property set' do
74
+ expect(subject.name).to eq name
75
+ end
76
+
77
+ it 'is persisted' do
78
+ expect(subject).to be_persisted
79
+ end
80
+ end
81
+ end
82
+
83
+ describe '.new' do
84
+ context 'with no properties' do
85
+ it 'returns a company' do
86
+ expect(subject).to be_a(described_class)
87
+ end
88
+
89
+ it 'has no changes' do
90
+ expect(subject.changes).to be_empty
91
+ end
92
+
93
+ it 'is not persisted' do
94
+ expect(subject).not_to be_persisted
95
+ end
96
+ end
97
+
98
+ context 'with properties' do
99
+ subject { described_class.new name: Faker::Company.name }
100
+
101
+ it 'has changes' do
102
+ expect(subject.changed?).to be_truthy
103
+ end
104
+
105
+ it 'is not persisted' do
106
+ expect(subject).not_to be_persisted
107
+ end
108
+ end
109
+
110
+ context 'with an ID property' do
111
+ subject { described_class.new id: 1 }
112
+
113
+ it 'has changes' do
114
+ pending "tracking ID property changes"
115
+ expect(subject.changed?).to be_truthy
116
+ end
117
+
118
+ it 'is not persisted' do
119
+ pending "persisted flag rework"
120
+ expect(subject).not_to be_persisted
121
+ end
122
+ end
123
+ end
124
+
125
+ describe '#reload' do
126
+ context 'with a valid ID' do
127
+ cassette
128
+
129
+ let(:company) { create :company }
130
+ subject { inst = described_class.new(company.id); inst.reload }
131
+
132
+ it 'loads the company details' do
133
+ expect(subject.id).to eq(company.id)
134
+ expect(subject.name).to eq(company.name)
135
+ end
136
+ end
137
+
138
+ context 'without an ID' do
139
+ cassette
140
+
141
+ it 'raises an error' do
142
+ expect {
143
+ subject.reload
144
+ }.to raise_error(Hubspot::InvalidParams)
145
+ end
146
+ end
147
+ end
148
+
149
+ describe '#delete' do
150
+ context 'when not persisted' do
151
+ cassette
152
+
153
+ subject { build :company }
154
+
155
+ it 'raises an error' do
156
+ expect {
157
+ subject.delete
158
+ }.to raise_error(Hubspot::InvalidParams)
159
+ end
160
+ end
161
+
162
+ context 'when persisted' do
163
+ cassette
164
+
165
+ subject { create :company }
166
+
167
+ it 'sets the deleted flag' do
168
+ expect {
169
+ subject.delete
170
+ }.to change { subject.deleted? }.from(false).to(true)
171
+ end
172
+
173
+ it 'deletes the resource' do
174
+ subject.delete
175
+
176
+ expect {
177
+ described_class.find subject.id
178
+ }.to raise_error(Hubspot::RequestError)
179
+ end
180
+ end
181
+ end
182
+
183
+ describe '.all' do
184
+ context 'with no options' do
185
+ cassette
186
+
187
+ subject { described_class.all }
188
+
189
+ it 'returns a collection' do
190
+ expect(subject).to be_a(Hubspot::PagedCollection)
191
+ expect(subject.first).to be_a(Hubspot::Company)
192
+ end
193
+
194
+ it 'has an offset' do
195
+ expect(subject.next_offset).not_to be_blank
196
+ end
197
+
198
+ it 'identifies if there are more resources' do
199
+ expect(subject.more?).not_to be_nil
200
+ end
201
+ end
202
+
203
+ context 'with an offset' do
204
+ cassette
205
+
206
+ let!(:company) { create :company }
207
+ subject { described_class.all offset: company.id }
208
+
209
+ it 'returns a collection' do
210
+ expect(subject).to be_a(Hubspot::PagedCollection)
211
+ end
212
+
213
+ it 'has an offset' do
214
+ expect(subject.next_offset).not_to be_blank
215
+ end
216
+
217
+ it 'identifies if there are more resources' do
218
+ expect(subject.more?).not_to be_nil
219
+ end
220
+ end
221
+
222
+ context 'with a limit' do
223
+ cassette
224
+
225
+ let(:limit) { 1 }
226
+ subject { described_class.all limit: limit }
227
+
228
+ it 'returns a collection' do
229
+ expect(subject).to be_a(Hubspot::PagedCollection)
230
+ expect(subject.first).to be_a(Hubspot::Company)
231
+ end
232
+
233
+ it 'respects the limit' do
234
+ expect(subject.size).to eq(limit)
235
+ end
236
+ end
237
+ end
238
+
239
+ describe '.search_domain' do
240
+ cassette
241
+
242
+ let!(:company) { create :company }
243
+
244
+ subject { described_class.search_domain company.domain }
245
+
246
+ it 'returns a collection' do
247
+ expect(subject).to be_a(Hubspot::PagedCollection)
248
+ expect(subject.first).to be_a(Hubspot::Company)
249
+ end
250
+ end
251
+
252
+ describe '.recently_created' do
253
+ cassette
254
+
255
+ subject { described_class.recently_created }
256
+
257
+ it 'returns a collection' do
258
+ expect(subject).to be_a(Hubspot::PagedCollection)
259
+ end
260
+ end
261
+
262
+ describe '.recently_modified' do
263
+ cassette
264
+
265
+ subject { described_class.recently_modified }
266
+
267
+ it 'returns a collection' do
268
+ expect(subject).to be_a(Hubspot::PagedCollection)
269
+ end
270
+ end
271
+
272
+ describe '.add_contact' do
273
+ context 'with a valid company ID and contact ID' do
274
+ cassette
275
+
276
+ let(:company) { create :company }
277
+ let(:contact) { create :contact }
278
+
279
+ subject { described_class.add_contact company.id, contact.id }
280
+
281
+ it 'returns success' do
282
+ expect(subject).to be_truthy
283
+ end
284
+
285
+ it 'adds the contact to the company' do
286
+ expect {
287
+ subject
288
+ }.to change { company.contact_ids }.by([contact.id])
289
+ end
290
+ end
291
+
292
+ context 'with a valid company ID and invalid contact ID' do
293
+ cassette
294
+
295
+ let(:company) { create :company }
296
+
297
+ subject { described_class.add_contact company.id, 1 }
298
+
299
+ it 'raises an error' do
300
+ expect {
301
+ subject
302
+ }.to raise_error(Hubspot::RequestError, /Contact with the vid/)
303
+ end
304
+ end
305
+
306
+ context 'with an invalid company ID' do
307
+ cassette
308
+
309
+ subject { described_class.add_contact 1, 1 }
310
+
311
+ it 'raises an error' do
312
+ expect {
313
+ subject
314
+ }.to raise_error(Hubspot::RequestError, /company with the ID/)
315
+ end
316
+ end
317
+ end
318
+
319
+ describe '.remove_contact' do
320
+ context 'with a valid company ID and contact ID' do
321
+ cassette allow_playback_repeats: true
322
+
323
+ let!(:company) { create :company }
324
+ let!(:contact) { create :contact, associatedCompanyId: company.id }
325
+
326
+ subject { described_class.remove_contact company.id, contact.id }
327
+
328
+ it 'returns success' do
329
+ expect(subject).to be_truthy
330
+ end
331
+
332
+ # Testing this turns out to be hard since using associatedCompanyId doesn't immediately add
333
+ # the contact to the company but triggers some background job to perform the update. Since
334
+ # we're testing the gem interface and not the API (that's Hubspot's job) this should be OK to
335
+ # leave out.
336
+ #
337
+ # it 'removes the contact from the company'
338
+ end
339
+ end
340
+ end
@@ -0,0 +1,87 @@
1
+ describe Hubspot::Config do
2
+ describe ".configure" do
3
+ it "sets the hapikey config" do
4
+ hapikey = "demo"
5
+
6
+ config = Hubspot::Config.configure(hapikey: hapikey)
7
+
8
+ expect(config.hapikey).to eq(hapikey)
9
+ end
10
+
11
+ it "changes the base_url" do
12
+ base_url = "https://api.hubapi.com/v2"
13
+
14
+ config = Hubspot::Config.configure(
15
+ hapikey: "123abc",
16
+ base_url: base_url
17
+ )
18
+
19
+ expect(config.base_url).to eq(base_url)
20
+ end
21
+
22
+ it "sets a default value for base_url" do
23
+ config = Hubspot::Config.configure(hapikey: "123abc")
24
+
25
+ expect(config.base_url).to eq("https://api.hubapi.com")
26
+ end
27
+
28
+ it "sets a value for portal_id" do
29
+ portal_id = "62515"
30
+
31
+ config = Hubspot::Config.configure(
32
+ hapikey: "123abc",
33
+ portal_id: portal_id
34
+ )
35
+
36
+ expect(config.portal_id).to eq(portal_id)
37
+ end
38
+
39
+ it "raises when an authentication approach is not provided" do
40
+ expect {
41
+ Hubspot::Config.configure({})
42
+ }.to raise_error(Hubspot::ConfigurationError)
43
+ end
44
+
45
+ it "raises when two authentication approaches are provided" do
46
+ expect {
47
+ Hubspot::Config.configure({
48
+ hapikey: "123abc",
49
+ access_token: "456def",
50
+ })
51
+ }.to raise_error(Hubspot::ConfigurationError)
52
+ end
53
+ end
54
+
55
+ describe ".reset!" do
56
+ it "resets the config values" do
57
+ Hubspot::Config.configure(hapikey: "123abc", portal_id: "456def")
58
+
59
+ Hubspot::Config.reset!
60
+
61
+ expect(Hubspot::Config.hapikey).to be nil
62
+ expect(Hubspot::Config.portal_id).to be nil
63
+ end
64
+ end
65
+
66
+ describe ".ensure!" do
67
+ context "when a specified parameter is missing" do
68
+ it "raises an error" do
69
+ Hubspot::Config.configure(hapikey: "123abc")
70
+
71
+ expect {
72
+ Hubspot::Config.ensure!(:portal_id)
73
+ }.to raise_error(Hubspot::ConfigurationError)
74
+ end
75
+ end
76
+
77
+ context "when all specified parameters are present" do
78
+ it "does not raise an error" do
79
+ Hubspot::Config.configure(hapikey: "123abc", portal_id: "456def")
80
+
81
+ expect {
82
+ Hubspot::Config.ensure!(:portal_id)
83
+ }.not_to raise_error
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,214 @@
1
+ describe Hubspot::Connection do
2
+ before do
3
+ Hubspot.configure hapikey: 'fake'
4
+ end
5
+
6
+ describe ".get_json" do
7
+ it "returns the parsed response from the GET request" do
8
+ path = "/some/path"
9
+ body = { key: "value" }
10
+
11
+ stub_request(:get, "https://api.hubapi.com/some/path?hapikey=fake").
12
+ to_return(status: 200, body: JSON.generate(body))
13
+
14
+ result = Hubspot::Connection.get_json(path, {})
15
+
16
+ expect(result).to eq({ "key" => "value" })
17
+ end
18
+ end
19
+
20
+ describe ".post_json" do
21
+ it "returns the parsed response from the POST request" do
22
+ path = "/some/path"
23
+ body = { id: 1, name: "ABC" }
24
+
25
+ stub_request(:post, "https://api.hubapi.com/some/path?hapikey=fake&name=ABC").
26
+ to_return(status: 200, body: JSON.generate(body))
27
+
28
+ result = Hubspot::Connection.post_json(path, params: { name: "ABC" })
29
+
30
+ expect(result).to eq({ "id" => 1, "name" => "ABC" })
31
+ end
32
+ end
33
+
34
+ describe ".delete_json" do
35
+ it "returns the response from the DELETE request" do
36
+ path = "/some/path"
37
+
38
+ stub_request(:delete, "https://api.hubapi.com/some/path?hapikey=fake").
39
+ to_return(status: 204, body: JSON.generate({}))
40
+
41
+ result = Hubspot::Connection.delete_json(path, {})
42
+
43
+ expect(result.code).to eq(204)
44
+ end
45
+ end
46
+
47
+ describe ".put_json" do
48
+ it "issues a PUT request and returns the parsed body" do
49
+ path = "/some/path"
50
+ update_options = { params: {}, body: {} }
51
+
52
+ stub_request(:put, "https://api.hubapi.com/some/path?hapikey=fake").
53
+ to_return(status: 200, body: JSON.generate(vid: 123))
54
+
55
+ response = Hubspot::Connection.put_json(path, update_options)
56
+
57
+ assert_requested(
58
+ :put,
59
+ "https://api.hubapi.com/some/path?hapikey=fake",
60
+ {
61
+ body: "{}",
62
+ headers: { "Content-Type" => "application/json" },
63
+ }
64
+ )
65
+
66
+ expect(response).to eq({ "vid" => 123 })
67
+ end
68
+
69
+ it "logs information about the request and response" do
70
+ path = "/some/path"
71
+ update_options = { params: {}, body: {} }
72
+
73
+ logger = stub_logger
74
+
75
+ stub_request(:put, "https://api.hubapi.com/some/path?hapikey=fake").
76
+ to_return(status: 200, body: JSON.generate("response body"))
77
+
78
+ Hubspot::Connection.put_json(path, update_options)
79
+
80
+ expect(logger).to have_received(:info).with(<<~MSG)
81
+ Hubspot: https://api.hubapi.com/some/path?hapikey=fake.
82
+ Body: {}.
83
+ Response: 200 "response body"
84
+ MSG
85
+ end
86
+
87
+ it "raises when the request fails" do
88
+ path = "/some/path"
89
+ update_options = { params: {}, body: {} }
90
+
91
+ stub_request(:put, "https://api.hubapi.com/some/path?hapikey=fake").
92
+ to_return(status: 401)
93
+
94
+ expect {
95
+ Hubspot::Connection.put_json(path, update_options)
96
+ }.to raise_error(Hubspot::RequestError)
97
+ end
98
+ end
99
+
100
+ context 'private methods' do
101
+ describe ".generate_url" do
102
+ let(:path){ "/test/:email/profile" }
103
+ let(:params){{email: "test"}}
104
+ let(:options){{}}
105
+ subject{ Hubspot::Connection.send(:generate_url, path, params, options) }
106
+ before{ Hubspot.configure(hapikey: "demo", portal_id: "62515") }
107
+
108
+ it "doesn't modify params" do
109
+ expect{ subject }.to_not change{params}
110
+ end
111
+
112
+ context "with a portal_id param" do
113
+ let(:path){ "/test/:portal_id/profile" }
114
+ let(:params){{}}
115
+ it{ should == "https://api.hubapi.com/test/62515/profile?hapikey=demo" }
116
+ end
117
+
118
+ context "when configure hasn't been called" do
119
+ before{ Hubspot::Config.reset! }
120
+ it "raises a config exception" do
121
+ expect{ subject }.to raise_error Hubspot::ConfigurationError
122
+ end
123
+ end
124
+
125
+ context "with interpolations but no params" do
126
+ let(:params){{}}
127
+ it "raises an interpolation exception" do
128
+ expect{ subject }.to raise_error Hubspot::MissingInterpolation
129
+ end
130
+ end
131
+
132
+ context "with an interpolated param" do
133
+ let(:params){ {email: "email@address.com"} }
134
+ it{ should == "https://api.hubapi.com/test/email%40address.com/profile?hapikey=demo" }
135
+ end
136
+
137
+ context "with multiple interpolated params" do
138
+ let(:path){ "/test/:email/:id/profile" }
139
+ let(:params){{email: "email@address.com", id: 1234}}
140
+ it{ should == "https://api.hubapi.com/test/email%40address.com/1234/profile?hapikey=demo" }
141
+ end
142
+
143
+ context "with query params" do
144
+ let(:params){{email: "email@address.com", id: 1234}}
145
+ it{ should == "https://api.hubapi.com/test/email%40address.com/profile?id=1234&hapikey=demo" }
146
+
147
+ context "containing a time" do
148
+ let(:start_time) { Time.now }
149
+ let(:params){{email: "email@address.com", id: 1234, start: start_time}}
150
+ it{ should == "https://api.hubapi.com/test/email%40address.com/profile?id=1234&start=#{start_time.to_i * 1000}&hapikey=demo" }
151
+ end
152
+
153
+ context "containing a range" do
154
+ let(:start_time) { Time.now }
155
+ let(:end_time) { Time.now + 1.year }
156
+ let(:params){{email: "email@address.com", id: 1234, created__range: start_time..end_time }}
157
+ it{ should == "https://api.hubapi.com/test/email%40address.com/profile?id=1234&created__range=#{start_time.to_i * 1000}&created__range=#{end_time.to_i * 1000}&hapikey=demo" }
158
+ end
159
+
160
+ context "containing an array of strings" do
161
+ let(:path){ "/test/emails" }
162
+ let(:params){{batch_email: %w(email1@example.com email2@example.com)}}
163
+ it{ should == "https://api.hubapi.com/test/emails?email=email1%40example.com&email=email2%40example.com&hapikey=demo" }
164
+ end
165
+ end
166
+
167
+ context "with options" do
168
+ let(:options){ {base_url: "https://cool.com", hapikey: false} }
169
+ it{ should == "https://cool.com/test/test/profile"}
170
+ end
171
+
172
+ context "passing Array as parameters for batch mode, key is prefixed with batch_" do
173
+ let(:path) { Hubspot::ContactList::LIST_BATCH_PATH }
174
+ let(:params) { { batch_list_id: [1,2,3] } }
175
+ it{ should == "https://api.hubapi.com/contacts/v1/lists/batch?listId=1&listId=2&listId=3&hapikey=demo" }
176
+ end
177
+ end
178
+ end
179
+
180
+ def stub_logger
181
+ instance_double(Logger, info: true).tap do |logger|
182
+ allow(Hubspot::Config).to receive(:logger).and_return(logger)
183
+ end
184
+ end
185
+ end
186
+
187
+ describe Hubspot::EventConnection do
188
+ describe '.trigger' do
189
+ let(:path) { '/path' }
190
+ let(:options) { { params: {} } }
191
+ let(:headers) { nil }
192
+
193
+ subject { described_class.trigger(path, options) }
194
+ before do
195
+ Hubspot.configure(hapikey: 'demo', portal_id: '62515')
196
+ allow(described_class).to receive(:get).and_return(true)
197
+ end
198
+
199
+ it 'calls get with a custom url' do
200
+ subject
201
+ expect(described_class).to have_received(:get).with('https://track.hubspot.com/path', body: nil, headers: nil)
202
+ end
203
+
204
+ context 'with more options' do
205
+ let(:headers) { { 'User-Agent' => 'something' } }
206
+ let(:options) { { params: {}, headers: headers } }
207
+
208
+ it 'supports headers' do
209
+ subject
210
+ expect(described_class).to have_received(:get).with('https://track.hubspot.com/path', body: nil, headers: headers)
211
+ end
212
+ end
213
+ end
214
+ end