hubspot-ruby 0.1.8 → 0.2.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 (108) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -22
  3. data/Gemfile.lock +14 -11
  4. data/LICENSE.txt +0 -2
  5. data/README.md +8 -6
  6. data/RELEASING.md +4 -5
  7. data/Rakefile +2 -17
  8. data/hubspot-ruby.gemspec +20 -157
  9. data/lib/hubspot-ruby.rb +10 -0
  10. data/lib/hubspot/blog.rb +1 -2
  11. data/lib/hubspot/company.rb +149 -0
  12. data/lib/hubspot/company_properties.rb +59 -0
  13. data/lib/hubspot/config.rb +10 -4
  14. data/lib/hubspot/connection.rb +12 -4
  15. data/lib/hubspot/contact.rb +52 -31
  16. data/lib/hubspot/contact_list.rb +16 -16
  17. data/lib/hubspot/contact_properties.rb +53 -6
  18. data/lib/hubspot/deal.rb +2 -2
  19. data/lib/hubspot/deal_pipeline.rb +43 -0
  20. data/lib/hubspot/deal_properties.rb +59 -0
  21. data/lib/hubspot/engagement.rb +133 -0
  22. data/lib/hubspot/exceptions.rb +1 -1
  23. data/lib/hubspot/form.rb +20 -20
  24. data/lib/hubspot/owner.rb +49 -0
  25. data/lib/hubspot/properties.rb +119 -0
  26. data/lib/hubspot/railtie.rb +10 -0
  27. data/lib/hubspot/topic.rb +2 -2
  28. data/lib/hubspot/utils.rb +106 -3
  29. data/spec/lib/hubspot/blog_spec.rb +2 -0
  30. data/spec/lib/hubspot/company_properties_spec.rb +239 -0
  31. data/spec/lib/hubspot/company_spec.rb +190 -0
  32. data/spec/lib/hubspot/config_spec.rb +1 -1
  33. data/spec/lib/hubspot/connection_spec.rb +33 -27
  34. data/spec/lib/hubspot/contact_list_spec.rb +61 -61
  35. data/spec/lib/hubspot/contact_properties_spec.rb +234 -3
  36. data/spec/lib/hubspot/contact_spec.rb +140 -71
  37. data/spec/lib/hubspot/deal_properties_spec.rb +254 -0
  38. data/spec/lib/hubspot/engagement_spec.rb +87 -0
  39. data/spec/lib/hubspot/form_spec.rb +72 -60
  40. data/spec/lib/hubspot/owner_spec.rb +56 -0
  41. data/spec/lib/hubspot/properties_spec.rb +45 -0
  42. data/spec/lib/hubspot/topic_spec.rb +0 -1
  43. data/spec/lib/hubspot/utils_spec.rb +113 -15
  44. data/spec/lib/tasks/properties_spec.rb +90 -0
  45. data/spec/live/companies_integration_spec.rb +23 -0
  46. data/spec/live/companies_properties_integration_spec.rb +120 -0
  47. data/spec/live/contacts_integration_spec.rb +1 -1
  48. data/spec/live/contacts_properties_integration_spec.rb +120 -0
  49. data/spec/live/deal_properties_integration_spec.rb +123 -0
  50. data/spec/live/deals_integration_spec.rb +1 -1
  51. data/spec/support/cassette_helper.rb +1 -1
  52. data/spec/support/tests_helper.rb +3 -3
  53. metadata +39 -78
  54. data/.document +0 -5
  55. data/lib/hubspot/version.rb +0 -9
  56. data/spec/fixtures/vcr_cassettes/add_contacts_to_lists.yml +0 -281
  57. data/spec/fixtures/vcr_cassettes/blog_list.yml +0 -180
  58. data/spec/fixtures/vcr_cassettes/blog_posts.yml +0 -107
  59. data/spec/fixtures/vcr_cassettes/blog_posts_list.yml +0 -6463
  60. data/spec/fixtures/vcr_cassettes/contact_create.yml +0 -64
  61. data/spec/fixtures/vcr_cassettes/contact_create_existing_email.yml +0 -62
  62. data/spec/fixtures/vcr_cassettes/contact_create_invalid_email.yml +0 -63
  63. data/spec/fixtures/vcr_cassettes/contact_create_with_params.yml +0 -64
  64. data/spec/fixtures/vcr_cassettes/contact_destroy.yml +0 -131
  65. data/spec/fixtures/vcr_cassettes/contact_example.yml +0 -32
  66. data/spec/fixtures/vcr_cassettes/contact_find_by_email.yml +0 -59
  67. data/spec/fixtures/vcr_cassettes/contact_find_by_email_batch_mode.yml +0 -509
  68. data/spec/fixtures/vcr_cassettes/contact_find_by_id.yml +0 -59
  69. data/spec/fixtures/vcr_cassettes/contact_find_by_id_batch_mode.yml +0 -33
  70. data/spec/fixtures/vcr_cassettes/contact_find_by_utk.yml +0 -83
  71. data/spec/fixtures/vcr_cassettes/contact_find_by_utk_batch_mode.yml +0 -33
  72. data/spec/fixtures/vcr_cassettes/contact_list_batch_find.yml +0 -65
  73. data/spec/fixtures/vcr_cassettes/contact_list_destroy.yml +0 -63
  74. data/spec/fixtures/vcr_cassettes/contact_list_example.yml +0 -33
  75. data/spec/fixtures/vcr_cassettes/contact_list_find.yml +0 -96
  76. data/spec/fixtures/vcr_cassettes/contact_list_refresh.yml +0 -33
  77. data/spec/fixtures/vcr_cassettes/contact_list_update.yml +0 -36
  78. data/spec/fixtures/vcr_cassettes/contact_update.yml +0 -66
  79. data/spec/fixtures/vcr_cassettes/contacts_among_list.yml +0 -189
  80. data/spec/fixtures/vcr_cassettes/create_form.yml +0 -39
  81. data/spec/fixtures/vcr_cassettes/create_list.yml +0 -36
  82. data/spec/fixtures/vcr_cassettes/create_list_with_filters.yml +0 -36
  83. data/spec/fixtures/vcr_cassettes/deal_create.yml +0 -61
  84. data/spec/fixtures/vcr_cassettes/deal_example.yml +0 -166
  85. data/spec/fixtures/vcr_cassettes/deal_find.yml +0 -115
  86. data/spec/fixtures/vcr_cassettes/destroy_deal.yml +0 -221
  87. data/spec/fixtures/vcr_cassettes/fail_to_create_form.yml +0 -35
  88. data/spec/fixtures/vcr_cassettes/fail_to_create_list.yml +0 -35
  89. data/spec/fixtures/vcr_cassettes/field_among_form.yml +0 -34
  90. data/spec/fixtures/vcr_cassettes/fields_among_form.yml +0 -35
  91. data/spec/fixtures/vcr_cassettes/find_all_contacts.yml +0 -297
  92. data/spec/fixtures/vcr_cassettes/find_all_dynamic_lists.yml +0 -104
  93. data/spec/fixtures/vcr_cassettes/find_all_forms.yml +0 -15378
  94. data/spec/fixtures/vcr_cassettes/find_all_lists.yml +0 -138
  95. data/spec/fixtures/vcr_cassettes/find_all_recent_contacts.yml +0 -33
  96. data/spec/fixtures/vcr_cassettes/find_all_recent_updated_deals.yml +0 -130
  97. data/spec/fixtures/vcr_cassettes/find_all_stastic_lists.yml +0 -21876
  98. data/spec/fixtures/vcr_cassettes/form_destroy.yml +0 -64
  99. data/spec/fixtures/vcr_cassettes/form_example.yml +0 -39
  100. data/spec/fixtures/vcr_cassettes/form_find.yml +0 -69
  101. data/spec/fixtures/vcr_cassettes/form_post.yml +0 -31
  102. data/spec/fixtures/vcr_cassettes/form_submit_data.yml +0 -130
  103. data/spec/fixtures/vcr_cassettes/form_update.yml +0 -77
  104. data/spec/fixtures/vcr_cassettes/one_month_blog_posts_filter_state.yml +0 -19127
  105. data/spec/fixtures/vcr_cassettes/one_month_blog_posts_list.yml +0 -34963
  106. data/spec/fixtures/vcr_cassettes/remove_contacts_from_lists.yml +0 -315
  107. data/spec/fixtures/vcr_cassettes/topic_list.yml +0 -48
  108. data/spec/fixtures/vcr_cassettes/topics_list.yml +0 -86
@@ -1,76 +1,109 @@
1
1
  describe Hubspot::Contact do
2
2
  let(:example_contact_hash) do
3
- VCR.use_cassette("contact_example", record: :none) do
4
- HTTParty.get("https://api.hubapi.com/contacts/v1/contact/email/testingapis@hubspot.com/profile?hapikey=demo").parsed_response
3
+ VCR.use_cassette('contact_example', record: :none) do
4
+ HTTParty.get('https://api.hubapi.com/contacts/v1/contact/email/testingapis@hubspot.com/profile?hapikey=demo').parsed_response
5
5
  end
6
6
  end
7
7
 
8
- before{ Hubspot.configure(hapikey: "demo") }
8
+ before{ Hubspot.configure(hapikey: 'demo') }
9
9
 
10
- describe "#initialize" do
10
+ describe '#initialize' do
11
11
  subject{ Hubspot::Contact.new(example_contact_hash) }
12
12
  it{ should be_an_instance_of Hubspot::Contact }
13
- its(["email"]){ should == "testingapis@hubspot.com" }
14
- its(["firstname"]){ should == "Clint" }
15
- its(["lastname"]){ should == "Eastwood" }
16
- its(["phone"]){ should == "555-555-5432" }
17
- its(:utk){ should == "1234567890" }
13
+ its(['email']){ should == 'testingapis@hubspot.com' }
14
+ its(['firstname']){ should == 'Clint' }
15
+ its(['lastname']){ should == 'Eastwood' }
16
+ its(['phone']){ should == '555-555-5432' }
17
+ its(:utk){ should == '1234567890' }
18
18
  its(:vid){ should == 82325 }
19
19
  end
20
20
 
21
- describe ".create!" do
22
- cassette "contact_create"
21
+ describe '.create!' do
22
+ cassette 'contact_create'
23
23
  let(:params){{}}
24
24
  subject{ Hubspot::Contact.create!(email, params) }
25
- context "with a new email" do
25
+ context 'with a new email' do
26
26
  let(:email){ "newcontact#{Time.now.to_i}@hsgem.com" }
27
27
  it{ should be_an_instance_of Hubspot::Contact }
28
28
  its(:email){ should match /newcontact.*@hsgem.com/ } # Due to VCR the email may not match exactly
29
29
 
30
- context "and some params" do
31
- cassette "contact_create_with_params"
30
+ context 'and some params' do
31
+ cassette 'contact_create_with_params'
32
32
  let(:email){ "newcontact_x_#{Time.now.to_i}@hsgem.com" }
33
- let(:params){ {firstname: "Hugh", lastname: "Jackman" } }
34
- its(["firstname"]){ should == "Hugh"}
35
- its(["lastname"]){ should == "Jackman"}
33
+ let(:params){ {firstname: 'Hugh', lastname: 'Jackman' } }
34
+ its(['firstname']){ should == 'Hugh'}
35
+ its(['lastname']){ should == 'Jackman'}
36
36
  end
37
37
  end
38
- context "with an existing email" do
39
- cassette "contact_create_existing_email"
40
- let(:email){ "testingapis@hubspot.com" }
41
- it "raises a RequestError" do
38
+ context 'with an existing email' do
39
+ cassette 'contact_create_existing_email'
40
+ let(:email){ 'testingapis@hubspot.com' }
41
+ it 'raises a RequestError' do
42
42
  expect{ subject }.to raise_error Hubspot::RequestError
43
43
  end
44
44
  end
45
- context "with an invalid email" do
46
- cassette "contact_create_invalid_email"
47
- let(:email){ "not_an_email" }
48
- it "raises a RequestError" do
45
+ context 'with an invalid email' do
46
+ cassette 'contact_create_invalid_email'
47
+ let(:email){ 'not_an_email' }
48
+ it 'raises a RequestError' do
49
49
  expect{ subject }.to raise_error Hubspot::RequestError
50
50
  end
51
51
  end
52
52
  end
53
53
 
54
- describe ".find_by_email" do
54
+ describe '.createOrUpdate' do
55
+ cassette 'contact_create_or_update'
56
+ let(:params){{}}
57
+ subject{ Hubspot::Contact.createOrUpdate(email, params) }
58
+ context 'with a new email' do
59
+ let(:email){ "newcontact#{Time.now.to_i}@hsgem.com" }
60
+ it{ should be_an_instance_of Hubspot::Contact }
61
+ its(:email){ should match /newcontact.*@hsgem.com/ } # Due to VCR the email may not match exactly
62
+
63
+ context 'and some params' do
64
+ cassette 'contact_create_or_update_with_params'
65
+ let(:email){ "newcontact_x_#{Time.now.to_i}@hsgem.com" }
66
+ let(:params){ {firstname: 'Hugh', lastname: 'Jackman' } }
67
+ its(['firstname']){ should == 'Hugh'}
68
+ its(['lastname']){ should == 'Jackman'}
69
+ end
70
+ end
71
+ context 'with an existing email' do
72
+ cassette 'contact_create_or_update_existing_email'
73
+ let(:email){ 'testingapis@hubspot.com' }
74
+ let(:params){ { firstname: 'Hugh', lastname: 'Jackman, Jr.' } }
75
+ its(['firstname']){ should == 'Hugh'}
76
+ its(['lastname']){ should == 'Jackman, Jr.'}
77
+ end
78
+ context 'with an invalid email' do
79
+ cassette 'contact_create_or_update_invalid_email'
80
+ let(:email){ 'not_an_email' }
81
+ it 'raises a RequestError' do
82
+ expect{ subject }.to raise_error Hubspot::RequestError
83
+ end
84
+ end
85
+ end
86
+
87
+ describe '.find_by_email' do
55
88
  context 'given an uniq email' do
56
- cassette "contact_find_by_email"
89
+ cassette 'contact_find_by_email'
57
90
  subject{ Hubspot::Contact.find_by_email(email) }
58
91
 
59
- context "when the contact is found" do
60
- let(:email){ "testingapis@hubspot.com" }
92
+ context 'when the contact is found' do
93
+ let(:email){ 'testingapis@hubspot.com' }
61
94
  it{ should be_an_instance_of Hubspot::Contact }
62
95
  its(:vid){ should == 82325 }
63
96
  end
64
97
 
65
- context "when the contact cannot be found" do
66
- it 'raises an error' do
98
+ context 'when the contact cannot be found' do
99
+ it 'raises an error' do
67
100
  expect { Hubspot::Contact.find_by_email('notacontact@test.com') }.to raise_error(Hubspot::RequestError)
68
101
  end
69
102
  end
70
103
  end
71
104
 
72
- context 'batch mode' do
73
- cassette "contact_find_by_email_batch_mode"
105
+ context 'batch mode' do
106
+ cassette 'contact_find_by_email_batch_mode'
74
107
 
75
108
  it 'find lists of contacts' do
76
109
  emails = ['testingapis@hubspot.com', 'testingapisawesomeandstuff@hubspot.com']
@@ -80,54 +113,61 @@ describe Hubspot::Contact do
80
113
  end
81
114
  end
82
115
 
83
- describe ".find_by_id" do
84
- context 'given an uniq id' do
85
- cassette "contact_find_by_id"
116
+ describe '.find_by_id' do
117
+ before do
118
+ @s = StringIO.new
119
+ Hubspot::Config.logger = Logger.new(@s)
120
+ end
121
+
122
+ context 'given an uniq id' do
123
+ cassette 'contact_find_by_id'
86
124
  subject{ Hubspot::Contact.find_by_id(vid) }
87
125
 
88
- context "when the contact is found" do
126
+ context 'when the contact is found' do
89
127
  let(:vid){ 82325 }
90
128
  it{ should be_an_instance_of Hubspot::Contact }
91
- its(:email){ should == "testingapis@hubspot.com" }
129
+ its(:email){ should == 'testingapis@hubspot.com' }
92
130
  end
93
131
 
94
- context "when the contact cannot be found" do
132
+ context 'when the contact cannot be found' do
95
133
  it 'raises an error' do
96
- expect { Hubspot::Contact.find_by_id(9999999) }.to raise_error(Hubspot::RequestError)
134
+ expect { Hubspot::Contact.find_by_id(9999999) }.to raise_error(Hubspot::RequestError)
135
+ expect(@s.string).to include 'Response: 404'
97
136
  end
98
137
  end
99
138
  end
100
139
 
101
- context 'batch mode' do
102
- cassette "contact_find_by_id_batch_mode"
140
+ context 'batch mode' do
141
+ cassette 'contact_find_by_id_batch_mode'
103
142
 
104
143
  # NOTE: error currently appends on API endpoint
105
144
  it 'find lists of contacts' do
106
145
  expect { Hubspot::Contact.find_by_id([82325]) }.to raise_error(Hubspot::ApiError)
146
+ expect(@s.string).to include('Response: 200')
107
147
  end
108
148
  end
109
149
  end
110
150
 
111
- describe ".find_by_utk" do
112
- context 'given an uniq utk' do
113
- cassette "contact_find_by_utk"
151
+ describe '.find_by_utk' do
152
+ context 'given an uniq utk' do
153
+ cassette 'contact_find_by_utk'
114
154
  subject{ Hubspot::Contact.find_by_utk(utk) }
115
155
 
116
- context "when the contact is found" do
117
- let(:utk){ "f844d2217850188692f2610c717c2e9b" }
156
+ context 'when the contact is found' do
157
+ let(:utk){ 'f844d2217850188692f2610c717c2e9b' }
118
158
  it{ should be_an_instance_of Hubspot::Contact }
119
- its(:utk){ should == "f844d2217850188692f2610c717c2e9b" }
159
+ its(:utk){ should == 'f844d2217850188692f2610c717c2e9b' }
120
160
  end
121
161
 
122
- context "when the contact cannot be found" do
123
- it 'raises an error' do
124
- expect { Hubspot::Contact.find_by_utk("invalid") }.to raise_error(Hubspot::RequestError)
162
+ context 'when the contact cannot be found' do
163
+ it 'raises an error' do
164
+ expect { Hubspot::Contact.find_by_utk('invalid') }.to raise_error(Hubspot::RequestError)
125
165
  end
126
166
  end
127
167
  end
128
168
 
129
- context 'batch mode' do
130
- cassette "contact_find_by_utk_batch_mode"
169
+ context 'batch mode' do
170
+ cassette 'contact_find_by_utk_batch_mode'
131
171
 
132
172
  it 'find lists of contacts' do
133
173
  utks = ['f844d2217850188692f2610c717c2e9b', 'j94344d22178501692f2610c717c2e9b']
@@ -136,9 +176,38 @@ describe Hubspot::Contact do
136
176
  end
137
177
  end
138
178
 
179
+ describe '.search' do
180
+ subject { Hubspot::Contact.search(query, options) }
181
+
182
+ cassette 'contact_search'
183
+
184
+ let(:options) { {} }
185
+
186
+ context 'when query returns contacts' do
187
+ let(:query) { '@hubspot.com' }
188
+
189
+ it { expect(subject['has-more']).to eq(true) }
190
+ it { subject['contacts'].each { |contact| expect(contact).to be_an_instance_of(Hubspot::Contact) } }
191
+
192
+ context 'when query finds more than count, but is limited' do
193
+ let(:options) { { count: 1 } }
194
+
195
+ it { expect(subject['has-more']).to eq(true) }
196
+ it { expect(subject['total'] > 1).to eq(true) }
197
+ end
198
+ end
199
+
200
+ context 'when the query returns no results' do
201
+ let(:query) { 'something_that_does_not_exist' }
202
+
203
+ it { expect(subject['total']).to eq(0) }
204
+ it { expect(subject['has-more']).to eq(false) }
205
+ it { expect(subject['contacts']).to be_empty }
206
+ end
207
+ end
139
208
 
140
209
  describe '.all' do
141
- context 'all contacts' do
210
+ context 'all contacts' do
142
211
  cassette 'find_all_contacts'
143
212
 
144
213
  it 'must get the contacts list' do
@@ -177,7 +246,7 @@ describe Hubspot::Contact do
177
246
  end
178
247
  end
179
248
 
180
- context 'recent contacts' do
249
+ context 'recent contacts' do
181
250
  cassette 'find_all_recent_contacts'
182
251
 
183
252
  it 'must get the contacts list' do
@@ -194,45 +263,45 @@ describe Hubspot::Contact do
194
263
  end
195
264
  end
196
265
 
197
- describe "#update!" do
198
- cassette "contact_update"
266
+ describe '#update!' do
267
+ cassette 'contact_update'
199
268
  let(:contact){ Hubspot::Contact.new(example_contact_hash) }
200
- let(:params){ {firstname: "Steve", lastname: "Cunningham"} }
269
+ let(:params){ {firstname: 'Steve', lastname: 'Cunningham'} }
201
270
  subject{ contact.update!(params) }
202
271
 
203
272
  it{ should be_an_instance_of Hubspot::Contact }
204
- its(["firstname"]){ should == "Steve" }
205
- its(["lastname"]){ should == "Cunningham" }
273
+ its(['firstname']){ should == 'Steve' }
274
+ its(['lastname']){ should == 'Cunningham' }
206
275
 
207
- context "when the request is not successful" do
208
- let(:contact){ Hubspot::Contact.new({"vid" => "invalid", "properties" => {}})}
209
- it "raises an error" do
276
+ context 'when the request is not successful' do
277
+ let(:contact){ Hubspot::Contact.new({'vid' => 'invalid', 'properties' => {}})}
278
+ it 'raises an error' do
210
279
  expect{ subject }.to raise_error Hubspot::RequestError
211
280
  end
212
281
  end
213
282
  end
214
283
 
215
- describe "#destroy!" do
216
- cassette "contact_destroy"
284
+ describe '#destroy!' do
285
+ cassette 'contact_destroy'
217
286
  let(:contact){ Hubspot::Contact.create!("newcontact_y_#{Time.now.to_i}@hsgem.com") }
218
287
  subject{ contact.destroy! }
219
288
  it { should be_true }
220
- it "should be destroyed" do
289
+ it 'should be destroyed' do
221
290
  subject
222
291
  contact.destroyed?.should be_true
223
292
  end
224
- context "when the request is not successful" do
225
- let(:contact){ Hubspot::Contact.new({"vid" => "invalid", "properties" => {}})}
226
- it "raises an error" do
293
+ context 'when the request is not successful' do
294
+ let(:contact){ Hubspot::Contact.new({'vid' => 'invalid', 'properties' => {}})}
295
+ it 'raises an error' do
227
296
  expect{ subject }.to raise_error Hubspot::RequestError
228
297
  contact.destroyed?.should be_false
229
298
  end
230
299
  end
231
300
  end
232
301
 
233
- describe "#destroyed?" do
302
+ describe '#destroyed?' do
234
303
  let(:contact){ Hubspot::Contact.new(example_contact_hash) }
235
304
  subject{ contact }
236
305
  its(:destroyed?){ should be_false }
237
306
  end
238
- end
307
+ end
@@ -0,0 +1,254 @@
1
+ describe Hubspot::DealProperties do
2
+ describe '.add_default_parameters' do
3
+ subject { Hubspot::DealProperties.add_default_parameters({}) }
4
+ context 'default parameters' do
5
+ its([:property]) { should == 'email' }
6
+ end
7
+ end
8
+
9
+ let(:example_groups) do
10
+ VCR.use_cassette('deal_groups_example', record: :once) do
11
+ HTTParty.get('https://api.hubapi.com/deals/v1/groups?hapikey=demo').parsed_response
12
+ end
13
+ end
14
+
15
+ let(:example_properties) do
16
+ VCR.use_cassette('deal_properties_example', record: :once) do
17
+ HTTParty.get('https://api.hubapi.com/deals/v1/properties?hapikey=demo').parsed_response
18
+ end
19
+ end
20
+
21
+ before { Hubspot.configure(hapikey: 'demo') }
22
+
23
+ describe 'Properties' do
24
+ describe '.all' do
25
+ context 'with no filter' do
26
+ cassette 'deal_all_properties'
27
+
28
+ it 'should return all properties' do
29
+ expect(Hubspot::DealProperties.all).to eql(example_properties)
30
+ end
31
+ end
32
+
33
+ let(:groups) { %w(calltrackinginfo emailinformation) }
34
+
35
+ context 'with included groups' do
36
+ cassette 'deal_properties_in_groups'
37
+
38
+ it 'should return properties for the specified group[s]' do
39
+ response = Hubspot::DealProperties.all({}, { include: groups })
40
+ response.each { |p| expect(groups.include?(p['groupName'])).to be_true }
41
+ end
42
+ end
43
+
44
+ context 'with excluded groups' do
45
+ cassette 'deal_properties_not_in_groups'
46
+
47
+ it 'should return properties for the non-specified group[s]' do
48
+ response = Hubspot::DealProperties.all({}, { exclude: groups })
49
+ response.each { |p| expect(groups.include?(p['groupName'])).to be_false }
50
+ end
51
+ end
52
+ end
53
+
54
+ let(:params) { {
55
+ 'name' => 'my_new_property',
56
+ 'label' => 'This is my new property',
57
+ 'description' => 'How much money do you have?',
58
+ 'groupName' => 'dealinformation',
59
+ 'type' => 'string',
60
+ 'fieldType' => 'text',
61
+ 'hidden' => false,
62
+ 'options' => [{
63
+ 'description' => '',
64
+ 'value' => 'Over $50K',
65
+ 'readOnly' => false,
66
+ 'label' => 'Over $50K',
67
+ 'displayOrder' => 0,
68
+ 'hidden' => false,
69
+ 'doubleData' => 0.0
70
+ },
71
+ {
72
+ 'description' => '',
73
+ 'value' => 'Under $50K',
74
+ 'readOnly' => false,
75
+ 'label' => 'Under $50K',
76
+ 'displayOrder' => 1,
77
+ 'hidden' => false,
78
+ 'doubleData' => 0.0
79
+ }],
80
+ 'deleted' => false,
81
+ 'displayOrder' => 0,
82
+ 'formField' => true,
83
+ 'readOnlyValue' => false,
84
+ 'readOnlyDefinition' => false,
85
+ 'mutableDefinitionNotDeletable' => false,
86
+ 'calculated' => false,
87
+ 'externalOptions' => false,
88
+ 'displayMode' => 'current_value'
89
+ } }
90
+
91
+ describe '.create!' do
92
+ context 'with no valid parameters' do
93
+ cassette 'deal_fail_to_create_property'
94
+
95
+ it 'should return nil' do
96
+ expect(Hubspot::DealProperties.create!({})).to be(nil)
97
+ end
98
+ end
99
+
100
+ context 'with all valid parameters' do
101
+ cassette 'deal_create_property'
102
+
103
+ it 'should return the valid parameters' do
104
+ response = Hubspot::DealProperties.create!(params)
105
+ expect(Hubspot::DealProperties.same?(params, response)).to be_true
106
+ end
107
+ end
108
+ end
109
+
110
+ describe '.update!' do
111
+ context 'with no valid parameters' do
112
+
113
+ it 'should return nil ' do
114
+ expect(Hubspot::DealProperties.update!(params['name'], {})).to be(nil)
115
+ end
116
+ end
117
+
118
+ context 'with mixed parameters' do
119
+ cassette 'deal_update_property'
120
+
121
+ it 'should return the valid parameters' do
122
+ params['description'] = 'What is their favorite flavor?'
123
+
124
+ response = Hubspot::DealProperties.update!(params['name'], params)
125
+ expect(Hubspot::DealProperties.same?(response, params)).to be_true
126
+ end
127
+ end
128
+ end
129
+
130
+ describe '.delete!' do
131
+ let(:name) { params['name'] }
132
+
133
+ context 'with existing property' do
134
+ cassette 'deal_delete_property'
135
+
136
+ it 'should return nil' do
137
+ expect(Hubspot::DealProperties.delete!(name)).to eq(nil)
138
+ end
139
+ end
140
+
141
+ context 'with non-existent property' do
142
+ cassette 'deal_delete_non_property'
143
+
144
+ it 'should raise an error' do
145
+ expect { Hubspot::DealProperties.delete!(name) }.to raise_error(Hubspot::RequestError)
146
+ end
147
+ end
148
+ end
149
+ end
150
+
151
+ describe 'Groups' do
152
+ describe '.groups' do
153
+ context 'with no filter' do
154
+ cassette 'deal_all_groups'
155
+
156
+ it 'should return all groups' do
157
+ expect(Hubspot::DealProperties.groups).to eql(example_groups)
158
+ end
159
+ end
160
+
161
+ let(:groups) { %w(calltrackinginfo emailinformation) }
162
+
163
+ context 'with included groups' do
164
+ cassette 'deal_groups_included'
165
+
166
+ it 'should return the specified groups' do
167
+ response = Hubspot::DealProperties.groups({}, { include: groups })
168
+ response.each { |p| expect(groups.include?(p['name'])).to be_true }
169
+ end
170
+ end
171
+
172
+ context 'with excluded groups' do
173
+ cassette 'deal_groups_not_excluded'
174
+
175
+ it 'should return groups that were not excluded' do
176
+ response = Hubspot::DealProperties.groups({}, { exclude: groups })
177
+ response.each { |p| expect(groups.include?(p['name'])).to be_false }
178
+ end
179
+ end
180
+ end
181
+
182
+ let(:params) { { 'name' => 'ff_group1', 'displayName' => 'Test Group One', 'displayOrder' => 100, 'badParam' => 99 } }
183
+
184
+ describe '.create_group!' do
185
+ context 'with no valid parameters' do
186
+ it 'should return nil' do
187
+ expect(Hubspot::DealProperties.create_group!({})).to be(nil)
188
+ end
189
+ end
190
+
191
+ context 'with mixed parameters' do
192
+ cassette 'deal_create_group'
193
+
194
+ it 'should return the valid parameters' do
195
+ response = Hubspot::DealProperties.create_group!(params)
196
+ expect(Hubspot::DealProperties.same?(response, params)).to be_true
197
+ end
198
+ end
199
+
200
+ context 'with some valid parameters' do
201
+ cassette 'deal_create_group_some_params'
202
+
203
+ let(:sub_params) { params.select { |k, _| k != 'displayName' } }
204
+
205
+ it 'should return the valid parameters' do
206
+ params['name'] = 'ff_group234'
207
+ response = Hubspot::DealProperties.create_group!(sub_params)
208
+ expect(Hubspot::DealProperties.same?(response, sub_params)).to be_true
209
+ end
210
+ end
211
+ end
212
+
213
+ describe '.update_group!' do
214
+ context 'with no valid parameters' do
215
+
216
+ it 'should return nil ' do
217
+ expect(Hubspot::DealProperties.update_group!(params['name'], {})).to be(nil)
218
+ end
219
+ end
220
+
221
+ context 'with mixed parameters' do
222
+ cassette 'deal_update_group'
223
+
224
+ it 'should return the valid parameters' do
225
+ params['displayName'] = 'Test Group OneA'
226
+
227
+ response = Hubspot::DealProperties.update_group!(params['name'], params)
228
+ expect(Hubspot::DealProperties.same?(response, params)).to be_true
229
+ end
230
+ end
231
+
232
+ end
233
+
234
+ describe '.delete_group!' do
235
+ let(:name) { params['name'] }
236
+
237
+ context 'with existing group' do
238
+ cassette 'deal_delete_group'
239
+
240
+ it 'should return nil' do
241
+ expect(Hubspot::DealProperties.delete_group!(name)).to eq(nil)
242
+ end
243
+ end
244
+
245
+ context 'with non-existent group' do
246
+ cassette 'deal_delete_non_group'
247
+
248
+ it 'should raise an error' do
249
+ expect { Hubspot::DealProperties.delete_group!(name) }.to raise_error(Hubspot::RequestError)
250
+ end
251
+ end
252
+ end
253
+ end
254
+ end