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,301 @@
1
+ describe Hubspot::ContactList do
2
+ let(:example_contact_list_hash) do
3
+ VCR.use_cassette("contact_list_example") do
4
+ HTTParty.get("https://api.hubapi.com/contacts/v1/lists/1?hapikey=demo").parsed_response
5
+ end
6
+ end
7
+
8
+ let(:static_list) { Hubspot::ContactList.all(static: true, count: 3).last }
9
+ let(:dynamic_list) { Hubspot::ContactList.all(dynamic: true, count: 1).first }
10
+
11
+ let(:example_contact_hash) do
12
+ VCR.use_cassette("contact_example") do
13
+ HTTParty.get("https://api.hubapi.com/contacts/v1/contact/email/testingapis@hubspot.com/profile?hapikey=demo").parsed_response
14
+ end
15
+ end
16
+
17
+ describe '#initialize' do
18
+ subject { Hubspot::ContactList.new(example_contact_list_hash) }
19
+
20
+ it { should be_an_instance_of Hubspot::ContactList }
21
+ its(:id) { should be_an(Integer) }
22
+ its(:portal_id) { should be_a(Integer) }
23
+ its(:name) { should_not be_empty }
24
+ its(:dynamic) { should be true }
25
+ its(:properties) { should be_a(Hash) }
26
+ end
27
+
28
+ before { Hubspot.configure(hapikey: "demo") }
29
+
30
+ describe '#contacts' do
31
+ cassette 'contacts_among_list'
32
+
33
+ let(:list) { Hubspot::ContactList.new(example_contact_list_hash) }
34
+
35
+ it 'returns by default 20 contact lists' do
36
+ expect(list.contacts.count).to eql 20
37
+ contact = list.contacts.first
38
+ expect(contact).to be_a(Hubspot::Contact)
39
+ end
40
+
41
+ it 'returns by default 20 contact lists with paging data' do
42
+ contact_data = list.contacts({paged: true})
43
+ contacts = contact_data['contacts']
44
+
45
+ expect(contact_data).to have_key 'vid-offset'
46
+ expect(contact_data).to have_key 'has-more'
47
+
48
+ expect(contacts.count).to eql 20
49
+ contact = contacts.first
50
+ expect(contact).to be_a(Hubspot::Contact)
51
+ end
52
+
53
+ it 'add default properties to the contacts returned' do
54
+ contact = list.contacts.first
55
+ expect(contact.email).to_not be_empty
56
+ end
57
+
58
+ expect_count_and_offset do |params|
59
+ Hubspot::ContactList.find(1).contacts(params)
60
+ end
61
+ end
62
+
63
+ describe '.create' do
64
+ subject{ Hubspot::ContactList.create!({ name: name }) }
65
+
66
+ context 'with all required parameters' do
67
+ cassette 'create_list'
68
+
69
+ let(:name) { 'testing list' }
70
+ it { should be_an_instance_of Hubspot::ContactList }
71
+ its(:id) { should be_an(Integer) }
72
+ its(:portal_id) { should be_an(Integer) }
73
+ its(:dynamic) { should be false }
74
+
75
+ context 'adding filters parameters' do
76
+ cassette 'create_list_with_filters'
77
+
78
+ it 'returns a ContactList object with filters set' do
79
+ name = 'list with filters'
80
+ filters_param = [[{ operator: "EQ", value: "@hubspot", property: "twitterhandle", type: "string"}]]
81
+ list_with_filters = Hubspot::ContactList.create!({ name: name, filters: filters_param })
82
+ expect(list_with_filters).to be_a(Hubspot::ContactList)
83
+ expect(list_with_filters.properties['filters']).to_not be_empty
84
+ end
85
+ end
86
+ end
87
+
88
+ context 'without all required parameters' do
89
+ cassette 'fail_to_create_list'
90
+
91
+ it 'raises an error' do
92
+ expect { Hubspot::ContactList.create!({ name: nil }) }.to raise_error(Hubspot::RequestError)
93
+ end
94
+ end
95
+ end
96
+
97
+ describe '.all' do
98
+ context 'all list types' do
99
+ cassette 'find_all_lists'
100
+
101
+ it 'returns by default 20 contact lists' do
102
+ lists = Hubspot::ContactList.all
103
+ expect(lists.count).to eql 20
104
+
105
+ list = lists.first
106
+ expect(list).to be_a(Hubspot::ContactList)
107
+ expect(list.id).to be_an(Integer)
108
+ end
109
+
110
+ expect_count_and_offset { |params| Hubspot::ContactList.all(params) }
111
+ end
112
+
113
+ context 'static lists' do
114
+ cassette 'find_all_stastic_lists'
115
+
116
+ it 'returns by defaut all the static contact lists' do
117
+ lists = Hubspot::ContactList.all(static: true)
118
+ expect(lists.count).to be > 20
119
+
120
+ list = lists.first
121
+ expect(list).to be_a(Hubspot::ContactList)
122
+ expect(list.dynamic).to be false
123
+ end
124
+ end
125
+
126
+ context 'dynamic lists' do
127
+ cassette 'find_all_dynamic_lists'
128
+
129
+ it 'returns by defaut all the static contact lists' do
130
+ lists = Hubspot::ContactList.all(dynamic: true)
131
+ expect(lists.count).to be > 20
132
+
133
+ list = lists.first
134
+ expect(list).to be_a(Hubspot::ContactList)
135
+ expect(list.dynamic).to be true
136
+ end
137
+ end
138
+ end
139
+
140
+ describe '.find' do
141
+ context 'given an id' do
142
+ cassette "contact_list_find"
143
+ subject { Hubspot::ContactList.find(id) }
144
+
145
+ context 'when the contact list is found' do
146
+ let(:id) { 1 }
147
+ it { should be_an_instance_of Hubspot::ContactList }
148
+ its(:name) { should == 'twitterers' }
149
+
150
+ let(:id) { '1' }
151
+ it { should be_an_instance_of Hubspot::ContactList }
152
+ end
153
+
154
+ context 'Wrong parameter type given' do
155
+ it 'raises an error' do
156
+ expect { Hubspot::ContactList.find(static_list) }.to raise_error(Hubspot::InvalidParams)
157
+ end
158
+ end
159
+
160
+ context 'when the contact list is not found' do
161
+ it 'raises an error' do
162
+ expect { Hubspot::ContactList.find(-1) }.to raise_error(Hubspot::RequestError)
163
+ end
164
+ end
165
+ end
166
+
167
+ context 'given a list of ids' do
168
+ cassette "contact_list_batch_find"
169
+
170
+ it 'find lists of contacts' do
171
+ lists = Hubspot::ContactList.find([2,3,4])
172
+ list = lists.first
173
+ expect(list).to be_a(Hubspot::ContactList)
174
+ expect(list.id).to be == 2
175
+ expect(lists.second.id).to be == 3
176
+ expect(lists.last.id).to be == 4
177
+ end
178
+ end
179
+ end
180
+
181
+ describe "#add" do
182
+ context "for a static list" do
183
+ it "adds the contact to the contact list" do
184
+ VCR.use_cassette("contact_lists/add_contact") do
185
+ contact = Hubspot::Contact.create("email@example.com")
186
+ contact_list_params = { name: "my-contacts-list" }
187
+ contact_list = Hubspot::ContactList.create!(contact_list_params)
188
+
189
+ result = contact_list.add([contact])
190
+
191
+ expect(result).to be true
192
+
193
+ contact.delete
194
+ contact_list.destroy!
195
+ end
196
+ end
197
+
198
+ context "when the contact already exists in the contact list" do
199
+ it "returns false" do
200
+ VCR.use_cassette("contact_lists/add_existing_contact") do
201
+ contact = Hubspot::Contact.create("email@example.com")
202
+
203
+ contact_list_params = { name: "my-contacts-list" }
204
+ contact_list = Hubspot::ContactList.create!(contact_list_params)
205
+ contact_list.add([contact])
206
+
207
+ result = contact_list.add([contact])
208
+
209
+ expect(result).to be false
210
+
211
+ contact.delete
212
+ contact_list.destroy!
213
+ end
214
+ end
215
+ end
216
+ end
217
+
218
+ context "for a dynamic list" do
219
+ it "raises an error as dynamic lists add contacts via on filters" do
220
+ VCR.use_cassette("contact_list/add_contact_to_dynamic_list") do
221
+ contact = Hubspot::Contact.create("email@example.com")
222
+ contact_list_params = {
223
+ name: "my-contacts-list",
224
+ dynamic: true,
225
+ "filters": [
226
+ [
227
+ {
228
+ "operator": "EQ",
229
+ "property": "email",
230
+ "type": "string",
231
+ "value": "@hubspot.com"
232
+ },
233
+ ],
234
+ ],
235
+ }
236
+ contact_list = Hubspot::ContactList.create!(contact_list_params)
237
+
238
+ expect {
239
+ contact_list.add(contact)
240
+ }.to raise_error(Hubspot::RequestError)
241
+ end
242
+ end
243
+ end
244
+ end
245
+
246
+ describe '#remove' do
247
+ cassette "remove_contacts_from_lists"
248
+
249
+ context 'static list' do
250
+ it 'returns true if removes all contacts in batch mode' do
251
+ contacts = static_list.contacts(count: 2)
252
+ expect(static_list.remove([contacts.first, contacts.last])).to be true
253
+ end
254
+
255
+ it 'returns false if the contact cannot be removed' do
256
+ contact_not_present_in_list = Hubspot::Contact.new(example_contact_hash)
257
+ expect(static_list.remove(contact_not_present_in_list)).to be false
258
+ end
259
+ end
260
+
261
+ context 'dynamic list' do
262
+ it 'raises error if try to remove a contact from a dynamic list' do
263
+ contact = dynamic_list.contacts(recent: true, count: 1).first
264
+ expect { dynamic_list.remove(contact) }.to raise_error(Hubspot::RequestError)
265
+ end
266
+ end
267
+ end
268
+
269
+ describe '#update!' do
270
+ cassette "contact_list_update"
271
+
272
+ let(:contact_list) { Hubspot::ContactList.new(example_contact_list_hash) }
273
+ let(:params) { { name: "update list name" } }
274
+ subject { contact_list.update!(params) }
275
+
276
+ it { should be_an_instance_of Hubspot::ContactList }
277
+ its(:name){ should == "update list name" }
278
+ end
279
+
280
+ describe '#destroy!' do
281
+ cassette "contact_list_destroy"
282
+
283
+ let(:contact_list) { Hubspot::ContactList.create!({ name: "newcontactlist_#{Time.now.to_i}"}) }
284
+ subject{ contact_list.destroy! }
285
+ it { should be true }
286
+
287
+ it "should be destroyed" do
288
+ subject
289
+ expect(contact_list).to be_destroyed
290
+ end
291
+ end
292
+
293
+ describe '#refresh' do
294
+ cassette "contact_list_refresh"
295
+
296
+ let(:contact_list) { Hubspot::ContactList.new(example_contact_list_hash) }
297
+ subject { contact_list.refresh }
298
+
299
+ it { should be true }
300
+ end
301
+ end
@@ -0,0 +1,245 @@
1
+ describe Hubspot::ContactProperties do
2
+ describe '.add_default_parameters' do
3
+ let(:opts) { {} }
4
+ subject { Hubspot::ContactProperties.add_default_parameters(opts) }
5
+ context 'default parameters' do
6
+ context 'without property parameter' do
7
+ its([:property]) { should == 'email' }
8
+ end
9
+
10
+ context 'with property parameter' do
11
+ let(:opts) { {property: 'firstname' } }
12
+ its([:property]) { should == 'firstname'}
13
+ end
14
+ end
15
+ end
16
+
17
+ let(:example_groups) do
18
+ VCR.use_cassette('contact_properties/groups_example') do
19
+ HTTParty.get('https://api.hubapi.com/contacts/v2/groups?hapikey=demo').parsed_response
20
+ end
21
+ end
22
+
23
+ let(:example_properties) do
24
+ VCR.use_cassette('contact_properties/properties_example') do
25
+ HTTParty.get('https://api.hubapi.com/contacts/v2/properties?hapikey=demo').parsed_response
26
+ end
27
+ end
28
+
29
+ before { Hubspot.configure(hapikey: 'demo') }
30
+
31
+ describe 'Properties' do
32
+ describe '.all' do
33
+ context 'with no filter' do
34
+ cassette 'contact_properties/all_properties'
35
+
36
+ it 'should return all properties' do
37
+ expect(Hubspot::ContactProperties.all).to eql(example_properties)
38
+ end
39
+ end
40
+
41
+ let(:groups) { %w(calltrackinginfo emailinformation) }
42
+
43
+ context 'with included groups' do
44
+ cassette 'contact_properties/properties_in_groups'
45
+
46
+ it 'should return properties for the specified group[s]' do
47
+ response = Hubspot::ContactProperties.all({}, { include: groups })
48
+ response.each { |p| expect(groups.include?(p['groupName'])).to be true }
49
+ end
50
+ end
51
+
52
+ context 'with excluded groups' do
53
+ cassette 'contact_properties/properties_not_in_groups'
54
+
55
+ it 'should return properties for the non-specified group[s]' do
56
+ response = Hubspot::ContactProperties.all({}, { exclude: groups })
57
+ response.each { |p| expect(groups.include?(p['groupName'])).to be false }
58
+ end
59
+ end
60
+ end
61
+
62
+ let(:params) { {
63
+ 'name' => 'my_new_property',
64
+ 'label' => 'This is my new property',
65
+ 'description' => 'What kind of x would you like?',
66
+ 'groupName' => 'contactinformation',
67
+ 'type' => 'string',
68
+ 'fieldType' => 'text',
69
+ 'hidden' => false,
70
+ 'options' => [],
71
+ 'deleted' => false,
72
+ 'displayOrder' => 0,
73
+ 'formField' => true,
74
+ 'readOnlyValue' => false,
75
+ 'readOnlyDefinition' => false,
76
+ 'mutableDefinitionNotDeletable' => false,
77
+ 'calculated' => false,
78
+ 'externalOptions' => false,
79
+ 'displayMode' => 'current_value'
80
+ } }
81
+ let(:valid_params) { params.select { |k, _| Hubspot::ContactProperties::PROPERTY_SPECS[:field_names].include?(k) } }
82
+
83
+ describe '.create!' do
84
+ context 'with no valid parameters' do
85
+ it 'should return nil' do
86
+ expect(Hubspot::ContactProperties.create!({})).to be(nil)
87
+ end
88
+ end
89
+
90
+ context 'with all valid parameters' do
91
+ cassette 'contact_properties/create_property'
92
+
93
+ it 'should return the valid parameters' do
94
+ response = Hubspot::ContactProperties.create!(params)
95
+ valid_params.each { |k, v| expect(response[k]).to eq(v) }
96
+ end
97
+ end
98
+ end
99
+
100
+ describe '.update!' do
101
+ context 'with no valid parameters' do
102
+
103
+ it 'should return nil ' do
104
+ expect(Hubspot::ContactProperties.update!(params['name'], {})).to be(nil)
105
+ end
106
+ end
107
+
108
+ context 'with mixed parameters' do
109
+ cassette 'contact_properties/update_property'
110
+
111
+ it 'should return the valid parameters' do
112
+ params['description'] = 'What is their favorite flavor?'
113
+ valid_params['description'] = params['description']
114
+
115
+ response = Hubspot::ContactProperties.update!(params['name'], params)
116
+ valid_params.each { |k, v| expect(response[k]).to eq(v) }
117
+ end
118
+ end
119
+ end
120
+
121
+ describe '.delete!' do
122
+ let(:name) { params['name'] }
123
+
124
+ context 'with existing property' do
125
+ cassette 'contact_properties/delete_property'
126
+
127
+ it 'should return nil' do
128
+ expect(Hubspot::ContactProperties.delete!(name)).to eq(nil)
129
+ end
130
+ end
131
+
132
+ context 'with non-existent property' do
133
+ cassette 'contact_properties/delete_non_property'
134
+
135
+ it 'should raise an error' do
136
+ expect { Hubspot::ContactProperties.delete!(name) }.to raise_error(Hubspot::RequestError)
137
+ end
138
+ end
139
+ end
140
+ end
141
+
142
+ describe 'Groups' do
143
+ describe '.groups' do
144
+ context 'with no filter' do
145
+ cassette 'contact_properties/all_groups'
146
+
147
+ it 'should return all groups' do
148
+ expect(Hubspot::ContactProperties.groups).to eql(example_groups)
149
+ end
150
+ end
151
+
152
+ let(:groups) { %w(calltrackinginfo emailinformation) }
153
+
154
+ context 'with included groups' do
155
+ cassette 'contact_properties/groups_included'
156
+
157
+ it 'should return the specified groups' do
158
+ response = Hubspot::ContactProperties.groups({}, { include: groups })
159
+ response.each { |p| expect(groups.include?(p['name'])).to be true }
160
+ end
161
+ end
162
+
163
+ context 'with excluded groups' do
164
+ cassette 'contact_properties/groups_not_excluded'
165
+
166
+ it 'should return groups that were not excluded' do
167
+ response = Hubspot::ContactProperties.groups({}, { exclude: groups })
168
+ response.each { |p| expect(groups.include?(p['name'])).to be false }
169
+ end
170
+ end
171
+ end
172
+
173
+ let(:params) { { 'name' => 'ff_group1', 'displayName' => 'Test Group One', 'displayOrder' => 100, 'badParam' => 99 } }
174
+
175
+ describe '.create_group!' do
176
+ context 'with no valid parameters' do
177
+ it 'should return nil' do
178
+ expect(Hubspot::ContactProperties.create_group!({})).to be(nil)
179
+ end
180
+ end
181
+
182
+ context 'with mixed parameters' do
183
+ cassette 'contact_properties/create_group'
184
+
185
+ it 'should return the valid parameters' do
186
+ response = Hubspot::ContactProperties.create_group!(params)
187
+ expect(Hubspot::ContactProperties.same?(response, params)).to be true
188
+ end
189
+ end
190
+
191
+ context 'with some valid parameters' do
192
+ cassette 'contact_properties/create_group_some_params'
193
+
194
+ let(:sub_params) { params.select { |k, _| k != 'displayName' } }
195
+
196
+ it 'should return the valid parameters' do
197
+ params['name'] = 'ff_group234'
198
+ response = Hubspot::ContactProperties.create_group!(sub_params)
199
+ expect(Hubspot::ContactProperties.same?(response, sub_params)).to be true
200
+ end
201
+ end
202
+ end
203
+
204
+ describe '.update_group!' do
205
+ context 'with no valid parameters' do
206
+
207
+ it 'should return nil ' do
208
+ expect(Hubspot::ContactProperties.update_group!(params['name'], {})).to be(nil)
209
+ end
210
+ end
211
+
212
+ context 'with mixed parameters' do
213
+ cassette 'contact_properties/update_group'
214
+
215
+ it 'should return the valid parameters' do
216
+ params['displayName'] = 'Test Group OneA'
217
+
218
+ response = Hubspot::ContactProperties.update_group!(params['name'], params)
219
+ expect(Hubspot::ContactProperties.same?(response, params)).to be true
220
+ end
221
+ end
222
+
223
+ end
224
+
225
+ describe '.delete_group!' do
226
+ let(:name) { params['name'] }
227
+
228
+ context 'with existing group' do
229
+ cassette 'contact_properties/delete_group'
230
+
231
+ it 'should return nil' do
232
+ expect(Hubspot::ContactProperties.delete_group!(name)).to eq(nil)
233
+ end
234
+ end
235
+
236
+ context 'with non-existent group' do
237
+ cassette 'contact_properties/delete_non_group'
238
+
239
+ it 'should raise an error' do
240
+ expect { Hubspot::ContactProperties.delete_group!(name) }.to raise_error(Hubspot::RequestError)
241
+ end
242
+ end
243
+ end
244
+ end
245
+ end