capsule_crm 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -0
  3. data/lib/capsule_crm/address.rb +4 -3
  4. data/lib/capsule_crm/associations/belongs_to.rb +2 -1
  5. data/lib/capsule_crm/associations/belongs_to_association.rb +19 -2
  6. data/lib/capsule_crm/associations/belongs_to_finder.rb +46 -0
  7. data/lib/capsule_crm/associations/has_many_association.rb +23 -9
  8. data/lib/capsule_crm/associations/has_many_proxy.rb +38 -4
  9. data/lib/capsule_crm/case.rb +33 -236
  10. data/lib/capsule_crm/configuration.rb +1 -1
  11. data/lib/capsule_crm/connection.rb +3 -0
  12. data/lib/capsule_crm/contactable.rb +1 -1
  13. data/lib/capsule_crm/country.rb +7 -13
  14. data/lib/capsule_crm/currency.rb +7 -13
  15. data/lib/capsule_crm/custom_field.rb +14 -54
  16. data/lib/capsule_crm/custom_field_definition.rb +36 -0
  17. data/lib/capsule_crm/email.rb +4 -3
  18. data/lib/capsule_crm/gettable.rb +11 -0
  19. data/lib/capsule_crm/hash_helper.rb +5 -0
  20. data/lib/capsule_crm/history.rb +37 -252
  21. data/lib/capsule_crm/milestone.rb +9 -9
  22. data/lib/capsule_crm/normalizer.rb +85 -0
  23. data/lib/capsule_crm/opportunity.rb +30 -271
  24. data/lib/capsule_crm/organization.rb +19 -197
  25. data/lib/capsule_crm/party.rb +13 -26
  26. data/lib/capsule_crm/persistence/configuration.rb +25 -0
  27. data/lib/capsule_crm/persistence/deletable.rb +14 -0
  28. data/lib/capsule_crm/persistence/persistable.rb +76 -0
  29. data/lib/capsule_crm/persistence.rb +3 -0
  30. data/lib/capsule_crm/person.rb +19 -194
  31. data/lib/capsule_crm/phone.rb +4 -3
  32. data/lib/capsule_crm/querying/configuration.rb +21 -0
  33. data/lib/capsule_crm/querying/find_all.rb +16 -0
  34. data/lib/capsule_crm/querying/find_one.rb +14 -0
  35. data/lib/capsule_crm/querying/findable.rb +14 -0
  36. data/lib/capsule_crm/querying.rb +4 -0
  37. data/lib/capsule_crm/serializable.rb +38 -0
  38. data/lib/capsule_crm/serializer.rb +54 -7
  39. data/lib/capsule_crm/task.rb +16 -96
  40. data/lib/capsule_crm/track.rb +5 -10
  41. data/lib/capsule_crm/user.rb +3 -15
  42. data/lib/capsule_crm/version.rb +1 -1
  43. data/lib/capsule_crm/website.rb +4 -2
  44. data/lib/capsule_crm.rb +15 -5
  45. data/spec/fabricators/case_fabricator.rb +1 -0
  46. data/spec/fabricators/history_fabricator.rb +1 -0
  47. data/spec/fabricators/opportunity_fabricator.rb +1 -0
  48. data/spec/lib/capsule_crm/associations/belongs_to_finder_spec.rb +48 -0
  49. data/spec/lib/capsule_crm/associations/belongs_to_spec.rb +34 -0
  50. data/spec/lib/capsule_crm/associations/has_many_proxy_spec.rb +54 -14
  51. data/spec/lib/capsule_crm/associations/has_many_spec.rb +15 -2
  52. data/spec/lib/capsule_crm/case_spec.rb +20 -330
  53. data/spec/lib/capsule_crm/country_spec.rb +1 -16
  54. data/spec/lib/capsule_crm/currency_spec.rb +1 -18
  55. data/spec/lib/capsule_crm/custom_field_definition_spec.rb +59 -0
  56. data/spec/lib/capsule_crm/custom_field_spec.rb +2 -27
  57. data/spec/lib/capsule_crm/history_spec.rb +14 -389
  58. data/spec/lib/capsule_crm/milestone_spec.rb +1 -23
  59. data/spec/lib/capsule_crm/normalizer_spec.rb +11 -0
  60. data/spec/lib/capsule_crm/opportunity_spec.rb +22 -341
  61. data/spec/lib/capsule_crm/organization_spec.rb +39 -60
  62. data/spec/lib/capsule_crm/party_spec.rb +37 -59
  63. data/spec/lib/capsule_crm/person_spec.rb +49 -247
  64. data/spec/lib/capsule_crm/serializer_spec.rb +25 -4
  65. data/spec/lib/capsule_crm/task_spec.rb +21 -250
  66. data/spec/lib/capsule_crm/track_spec.rb +1 -15
  67. data/spec/lib/capsule_crm/user_spec.rb +1 -14
  68. data/spec/support/{countries.json → all_countries.json} +0 -0
  69. data/spec/support/{currencies.json → all_currencies.json} +0 -0
  70. data/spec/support/{milestones.json → all_milestones.json} +0 -0
  71. data/spec/support/{tracks.json → all_tracks.json} +0 -0
  72. data/spec/support/custom_field_definitions.json +19 -0
  73. data/spec/support/helpers.rb +3 -2
  74. data/spec/support/no_cases.json +5 -0
  75. data/spec/support/no_countries.json +5 -0
  76. data/spec/support/no_currencies.json +5 -0
  77. data/spec/support/no_milestones.json +5 -0
  78. data/spec/support/no_opportunities.json +5 -0
  79. data/spec/support/no_tasks.json +5 -0
  80. data/spec/support/no_tracks.json +5 -0
  81. data/spec/support/no_users.json +5 -0
  82. data/spec/support/shared_examples/deletable.rb +15 -0
  83. data/spec/support/shared_examples/find_all.rb +34 -0
  84. data/spec/support/shared_examples/find_one.rb +23 -0
  85. data/spec/support/shared_examples/persistable.rb +318 -0
  86. data/spec/support/single_person.json +16 -0
  87. metadata +60 -15
  88. data/lib/capsule_crm/attributes.rb +0 -11
  89. data/lib/capsule_crm/capsule_jsonable.rb +0 -13
  90. data/lib/capsule_crm/collection.rb +0 -9
  91. data/spec/support/single_user.json +0 -25
@@ -6,6 +6,36 @@ describe CapsuleCRM::Person do
6
6
 
7
7
  it_should_behave_like 'contactable'
8
8
 
9
+ it_behaves_like 'persistable', 'https://sample.capsulecrm.com/api/person/34', 34 do
10
+ let(:attributes) { Fabricate.attributes_for(:person) }
11
+ end
12
+
13
+ it_behaves_like 'deletable'
14
+
15
+ it_behaves_like 'listable', '/party', 'parties', 2
16
+
17
+ it_behaves_like 'findable', '/api/party/12', 12, 'person' do
18
+ let(:attributes) do
19
+ {
20
+ first_name: 'Eric', last_name: 'Schmidt', job_title: 'Chairman',
21
+ about: 'A comment here'
22
+ }
23
+ end
24
+
25
+ it 'should get the email address' do
26
+ expect(subject.emails.first.email_address).
27
+ to eql('e.schmidt@google.com')
28
+ end
29
+
30
+ it 'should get the phone number' do
31
+ expect(subject.phones.first.phone_number).to eql('+1 888 555555')
32
+ end
33
+
34
+ it 'should get the website' do
35
+ expect(subject.websites.first.web_address).to eql('www.google.com')
36
+ end
37
+ end
38
+
9
39
  before do
10
40
  stub_request(:get, /\/api\/users$/).
11
41
  to_return(body: File.read('spec/support/all_users.json'))
@@ -64,276 +94,48 @@ describe CapsuleCRM::Person do
64
94
 
65
95
  describe '._for_organization' do
66
96
  context 'when there are many people for the organization' do
67
- pending
68
- end
69
-
70
- context 'when there is 1 person for the organization' do
71
97
  before do
72
- stub_request(:get, /\/api\/party\/1\/people$/).
73
- to_return(body: File.read('spec/support/single_user.json'))
98
+ stub_request(:get, /.*/).
99
+ to_return(body: File.read('spec/support/all_people.json'))
74
100
  end
75
101
  subject { CapsuleCRM::Person._for_organization(1) }
76
102
 
77
- it { should be_a(Array) }
78
- end
79
-
80
- context 'when there are no people for the organization' do
81
- pending
82
- end
83
- end
84
-
85
- describe '.all' do
86
- before do
87
- stub_request(:get, /\/api\/party$/).
88
- to_return(body: File.read('spec/support/all_parties.json'))
89
- end
90
-
91
- subject { CapsuleCRM::Person.all }
92
-
93
- it { should be_a(Array) }
94
-
95
- it { subject.length.should eql(2) }
96
-
97
- it 'should only contain people' do
98
- subject.all? { |item| item.is_a?(CapsuleCRM::Person) }.should be_true
99
- end
100
- end
101
-
102
- describe '.find' do
103
- before do
104
- stub_request(:get, /.*/).
105
- to_return(body: File.read('spec/support/person.json'))
106
- end
107
-
108
- subject { CapsuleCRM::Person.find(1) }
109
-
110
- it { should be_a(CapsuleCRM::Person) }
111
-
112
- it { subject.first_name.should eql('Eric') }
113
-
114
- it { subject.last_name.should eql('Schmidt') }
115
- end
116
-
117
- describe '#attributes=' do
118
- let(:person) { CapsuleCRM::Person.new }
119
-
120
- before do
121
- person.attributes= { firstName: 'Matt', lastName: 'Beedle' }
122
- end
123
-
124
- it { person.first_name.should eql('Matt') }
125
-
126
- it { person.last_name.should eql('Beedle') }
127
- end
128
-
129
- describe '.create' do
130
- context 'when the person is valid' do
131
- before do
132
- stub_request(:post, /.*/).to_return(headers: {
133
- 'Location' => 'https://sample.capsulecrm.com/api/party/100'
134
- })
103
+ it 'should be an array' do
104
+ expect(subject).to be_a(Array)
135
105
  end
136
106
 
137
- subject { CapsuleCRM::Person.create(first_name: 'Eric') }
138
-
139
- it { should be_a(CapsuleCRM::Person) }
140
-
141
- it { subject.id.should eql(100) }
142
- end
143
-
144
- context 'when the person is not valid' do
145
- subject { CapsuleCRM::Person.create }
146
-
147
- it { subject.errors.should_not be_blank }
148
- end
149
- end
150
-
151
- describe '.create!' do
152
- context 'when the person is valid' do
153
- before do
154
- stub_request(:post, /.*/).to_return(headers: {
155
- 'Location' => 'https://sample.capsulecrm.com/api/party/101'
156
- })
157
- end
158
-
159
- subject { CapsuleCRM::Person.create(first_name: 'Eric') }
160
-
161
- it { should be_a(CapsuleCRM::Person) }
162
-
163
- it { should be_persisted }
164
-
165
- it { subject.id.should eql(101) }
166
- end
167
-
168
- context 'when the person is not valid' do
169
- it do
170
- expect { CapsuleCRM::Person.create! }.
171
- to raise_error(CapsuleCRM::Errors::RecordInvalid)
172
- end
173
- end
174
- end
175
-
176
- describe '#update_attributes' do
177
- context 'when the person is valid' do
178
- before do
179
- stub_request(:put, /.*/).to_return(status: 200)
107
+ it 'should contain 2 items' do
108
+ expect(subject.length).to eql(2)
180
109
  end
181
-
182
- let(:person) { CapsuleCRM::Person.new(id: 1) }
183
-
184
- before { person.update_attributes first_name: 'James' }
185
-
186
- it { person.first_name.should eql('James') }
187
-
188
- it { person.id.should eql(1) }
189
- end
190
-
191
- context 'when the person is not valid' do
192
- let(:person) { CapsuleCRM::Person.new(id: 1) }
193
-
194
- before { person.update_attributes }
195
-
196
- it { person.should_not be_valid }
197
-
198
- it { person.errors.should_not be_blank }
199
110
  end
200
- end
201
-
202
- describe '#update_attributes!' do
203
111
 
204
- let(:person) { CapsuleCRM::Person.new(id: 1) }
205
-
206
- context 'when the person is valid' do
112
+ context 'when there is 1 person for the organization' do
207
113
  before do
208
- stub_request(:put, /.*/).to_return(status: 200)
114
+ stub_request(:get, /\/api\/party\/1\/people$/).
115
+ to_return(body: File.read('spec/support/single_person.json'))
209
116
  end
117
+ subject { CapsuleCRM::Person._for_organization(1) }
210
118
 
211
- before { person.update_attributes first_name: 'James' }
212
-
213
- it { person.first_name.should eql('James') }
214
-
215
- it { person.id.should eql(1) }
216
- end
217
-
218
- context 'when the person is not valid' do
219
- it do
220
- expect { person.update_attributes! }.
221
- to raise_error(CapsuleCRM::Errors::RecordInvalid)
222
- end
119
+ it { should be_a(Array) }
223
120
  end
224
- end
225
121
 
226
- describe '#save' do
227
- context 'when the person is a new record' do
122
+ context 'when there are no people for the organization' do
228
123
  before do
229
- stub_request(:post, /.*/).to_return(headers: {
230
- 'Location' => 'https://sample.capsulecrm.com/api/party/100'
231
- }, status: 200)
232
- end
233
-
234
- let(:person) { CapsuleCRM::Person.new(first_name: 'Eric') }
235
-
236
- before { person.save }
237
-
238
- it { person.first_name.should eql('Eric') }
239
-
240
- it { person.should be_persisted }
241
- end
242
- end
243
-
244
- describe '#save!' do
245
- context 'when the person is a new record' do
246
- context 'when the person is valid' do
247
- before do
248
- stub_request(:post, /.*/).to_return(headers: {
249
- 'Location' => 'https://sample.capsulecrm.com/api/party/100',
250
- }, status: 200)
251
- end
252
-
253
- let(:person) { CapsuleCRM::Person.new(first_name: 'Eric') }
254
-
255
- before { person.save! }
256
-
257
- it { person.should be_persisted }
124
+ stub_request(:get, /.*/).
125
+ to_return(body: File.read('spec/support/no_parties.json'))
258
126
  end
127
+ subject { CapsuleCRM::Person._for_organization(1) }
259
128
 
260
- context 'when the person is not valid' do
261
- let(:person) { CapsuleCRM::Person.new }
262
-
263
- it do
264
- expect { person.save! }.
265
- to raise_error(CapsuleCRM::Errors::RecordInvalid)
266
- end
129
+ it 'should be an array' do
130
+ expect(subject).to be_a(Array)
267
131
  end
268
- end
269
-
270
- context 'when the person is not a new record' do
271
- context 'when the person is not valid' do
272
132
 
273
- let(:person) { CapsuleCRM::Person.new(id: 1) }
274
-
275
- it do
276
- expect { person.save! }.
277
- to raise_exception(CapsuleCRM::Errors::RecordInvalid)
278
- end
133
+ it 'should be empty' do
134
+ expect(subject).to be_empty
279
135
  end
280
136
  end
281
137
  end
282
138
 
283
- describe '#new_record?' do
284
- context 'when the person is a new record' do
285
- let(:person) { CapsuleCRM::Person.new }
286
-
287
- subject { person.new_record? }
288
-
289
- it { should be_true }
290
- end
291
-
292
- context 'when the person is not a new record' do
293
- let(:person) { CapsuleCRM::Person.new(id: 1) }
294
-
295
- subject { person.new_record? }
296
-
297
- it { should be_false }
298
- end
299
- end
300
-
301
- describe '#persisted?' do
302
- context 'when the person is persisted' do
303
- let(:person) { CapsuleCRM::Person.new(id: 1) }
304
-
305
- subject { person.persisted? }
306
-
307
- it { should be_true }
308
- end
309
-
310
- context 'when the person is not persisted' do
311
- let(:person) { CapsuleCRM::Person.new }
312
-
313
- subject { person.persisted? }
314
-
315
- it { should be_false }
316
- end
317
- end
318
-
319
- describe '.init_collection' do
320
- subject do
321
- CapsuleCRM::Person.init_collection(
322
- JSON.parse(
323
- File.read('spec/support/all_parties.json')
324
- )['parties']['person']
325
- )
326
- end
327
-
328
- it { should be_a(Array) }
329
-
330
- it { subject.length.should eql(2) }
331
-
332
- it do
333
- subject.all? { |item| item.is_a?(CapsuleCRM::Person) }.should be_true
334
- end
335
- end
336
-
337
139
  describe '#first_name_required?' do
338
140
  let(:person) { CapsuleCRM::Person.new }
339
141
 
@@ -10,19 +10,24 @@ class SerializableTest
10
10
  attribute :something, Date
11
11
  end
12
12
 
13
+ class SerializableInverse
14
+ include Virtus
15
+ include CapsuleCRM::Associations
16
+ end
17
+
13
18
  describe CapsuleCRM::Serializer do
14
19
  describe '#serialize' do
15
20
  let(:options) do
16
21
  {}
17
22
  end
18
- let(:serializer) { described_class.new(object, options) }
23
+ let(:serializer) { described_class.new(options) }
19
24
  let(:object) do
20
25
  SerializableTest.new(
21
26
  id: Random.rand(1..10), name: Faker::Lorem.word,
22
27
  description: Faker::Lorem.word
23
28
  )
24
29
  end
25
- subject { serializer.serialize }
30
+ subject { serializer.serialize(object) }
26
31
 
27
32
  context 'without an options' do
28
33
  it 'should not include the ID' do
@@ -30,6 +35,18 @@ describe CapsuleCRM::Serializer do
30
35
  end
31
36
  end
32
37
 
38
+ context 'when include_root is false' do
39
+ before do
40
+ options.merge!(include_root: false)
41
+ end
42
+
43
+ it 'should not include the root' do
44
+ expect(subject).to eql({
45
+ 'name' => object.name, 'description' => object.description
46
+ })
47
+ end
48
+ end
49
+
33
50
  context 'when additional methods are supplied' do
34
51
  before do
35
52
  options.merge!(additional_methods: [:test])
@@ -65,7 +82,11 @@ describe CapsuleCRM::Serializer do
65
82
  context 'when there are belongs to associations' do
66
83
  before do
67
84
  SerializableTest.send(
68
- :belongs_to, :person, class_name: CapsuleCRM::Person
85
+ :belongs_to, :person, class_name: 'SerializableTest'
86
+ )
87
+ SerializableTest.send(
88
+ :has_many, :things, class_name: 'SerializableTest',
89
+ source: :person
69
90
  )
70
91
  object.person = person
71
92
  end
@@ -80,7 +101,7 @@ describe CapsuleCRM::Serializer do
80
101
  context 'with a serializable key' do
81
102
  before do
82
103
  SerializableTest.send(
83
- :belongs_to, :person, class_name: CapsuleCRM::Person,
104
+ :belongs_to, :person, class_name: 'CapsuleCRM::Person',
84
105
  serializable_key: 'monkeys'
85
106
  )
86
107
  end
@@ -9,265 +9,40 @@ describe CapsuleCRM::Task do
9
9
  to_return(body: File.read('spec/support/person.json'))
10
10
  end
11
11
 
12
- describe 'validations' do
13
- it { should validate_numericality_of(:id) }
14
- it { should validate_presence_of(:description) }
15
- it { should validate_presence_of(:due_date) }
16
- it { should validate_presence_of(:due_date_time) }
17
- end
18
-
19
- describe '.find' do
20
- before do
21
- stub_request(:get, /\/api\/task\/2$/).
22
- to_return(body: File.read('spec/support/task.json'))
23
- end
24
-
25
- subject { CapsuleCRM::Task.find(2) }
26
-
27
- it { should be_a(CapsuleCRM::Task) }
28
- it { subject.due_date.should_not be_blank }
29
- it { subject.category.should eql('Meeting') }
30
- it { subject.description.should eql('Meet with customer') }
31
- it { subject.detail.should eql('Meeting at Coffee shop') }
32
- it { subject.owner.should be_a(CapsuleCRM::User) }
33
- it { subject.party.should be_a(CapsuleCRM::Person) }
34
- end
35
-
36
- describe '.all' do
37
- before do
38
- stub_request(:get, /\/api\/tasks$/).
39
- to_return(body: File.read('spec/support/all_tasks.json'))
40
- end
41
-
42
- subject { CapsuleCRM::Task.all }
43
-
44
- it { should be_a(Array) }
45
-
46
- it do
47
- subject.all? { |item| item.is_a?(CapsuleCRM::Task) }.should be_true
48
- end
49
-
50
- it { subject.length.should eql(4) }
51
-
52
- it { subject.first.description.should eql('Meet with customer') }
12
+ it_behaves_like 'persistable', 'https://sample.capsulecrm.com/api/task/91', 91 do
13
+ let(:attributes) { Fabricate.attributes_for(:task) }
53
14
  end
54
15
 
55
- describe '.create' do
56
- let(:location) { 'https://sample.capsulecrm.com/api/task/59' }
57
-
58
- context 'when it is valid' do
59
- before do
60
- stub_request(:post, /\/api\/task$/).
61
- to_return(headers: { 'Location' => location })
62
- end
63
-
64
- subject { CapsuleCRM::Task.create Fabricate.attributes_for(:task) }
65
-
66
- it { should be_a(CapsuleCRM::Task) }
67
-
68
- it { should be_persisted }
69
- end
70
-
71
- context 'when it belongs to a party' do
72
- before do
73
- stub_request(:post, /\/api\/party\/#{party.id}\/task$/).
74
- to_return(headers: { 'Location' => location })
75
- end
76
-
77
- let(:party) { Fabricate.build(:person, id: 1) }
78
-
79
- subject do
80
- CapsuleCRM::Task.create(
81
- Fabricate.attributes_for(:task, party: party)
82
- )
83
- end
16
+ it_behaves_like 'deletable'
84
17
 
85
- it { should be_a(CapsuleCRM::Task) }
18
+ it_behaves_like 'listable', '/tasks', 'tasks', 4
86
19
 
87
- it { should be_persisted }
20
+ it_behaves_like 'findable', '/api/task/2', 2, 'task' do
21
+ let(:attributes) do
22
+ {
23
+ category: 'Meeting', description: 'Meet with customer',
24
+ detail: 'Meeting at Coffee shop'
25
+ }
88
26
  end
89
27
 
90
- context 'when it belongs to a opportunity' do
91
- before do
92
- stub_request(:post, /\/api\/opportunity\/#{opportunity.id}\/task$/).
93
- to_return(headers: { 'Location' => location })
94
- end
95
- let(:opportunity) { Fabricate.build(:opportunity, id: 2) }
96
- let(:task_attributes) do
97
- Fabricate.attributes_for(:task).merge(opportunity: opportunity)
98
- end
99
- subject { CapsuleCRM::Task.create task_attributes }
100
-
101
- it { should be_a(CapsuleCRM::Task) }
102
- it { should be_persisted }
28
+ it 'should populate the due date' do
29
+ expect(subject.due_date).not_to be_blank
103
30
  end
104
31
 
105
- context 'when it belongs to a case' do
106
- before do
107
- stub_request(:post, /\/api\/kase\/#{kase.id}\/task$/).
108
- to_return(headers: { 'Location' => location })
109
- end
110
- let(:kase) { Fabricate.build(:case, id: 5) }
111
- let(:task_attributes) do
112
- Fabricate.attributes_for(:task).merge(case: kase)
113
- end
114
- subject { CapsuleCRM::Task.create(task_attributes) }
115
-
116
- it { should be_a(CapsuleCRM::Task) }
117
- it { should be_persisted }
118
- end
119
-
120
- context 'when it is not valid' do
121
- subject { CapsuleCRM::Task.create }
122
-
123
- it { should_not be_persisted }
124
- end
125
- end
126
-
127
- describe '.create!' do
128
- context 'when it is valid' do
129
- before do
130
- location = 'https://sample.capsulecrm.com/api/task/59'
131
- stub_request(:post, /\/api\/task$/).
132
- to_return(headers: { 'Location' => location })
133
- end
134
-
135
- subject { CapsuleCRM::Task.create! Fabricate.attributes_for(:task) }
136
-
137
- it { should be_a(CapsuleCRM::Task) }
138
-
139
- it { should be_persisted }
32
+ it 'should populate the owner' do
33
+ expect(subject.owner).to be_a(CapsuleCRM::User)
140
34
  end
141
35
 
142
- context 'when it is not valid' do
143
- subject { CapsuleCRM::Task.create! }
144
-
145
- it do
146
- expect { subject }.to raise_error(CapsuleCRM::Errors::RecordInvalid)
147
- end
36
+ it 'should populate the party' do
37
+ expect(subject.party).to be_a(CapsuleCRM::Person)
148
38
  end
149
39
  end
150
40
 
151
- describe '#save' do
152
- let(:task) { Fabricate.build(:task) }
153
-
154
- context 'when it is a new record' do
155
- before do
156
- location = 'https://sample.capsulecrm.com/api/task/59'
157
- stub_request(:post, /\/api\/task$/).
158
- to_return(headers: { 'Location' => location })
159
- end
160
-
161
- subject { task.save }
162
-
163
- it { subject.id.should eql(59) }
164
-
165
- it { should be_persisted }
166
- end
167
-
168
- context 'when it is an existing record' do
169
- before do
170
- task.id = 12
171
- stub_request(:put, /\/api\/task\/12$/).to_return(status: 200)
172
- end
173
-
174
- subject { task.save }
175
-
176
- it { should be_persisted }
177
- end
178
-
179
- context 'when it is invalid' do
180
- it { subject.save.should be_false }
181
- end
182
- end
183
-
184
- describe '#save!' do
185
- let(:task) { Fabricate.build(:task) }
186
-
187
- context 'when it is a new record' do
188
- before do
189
- location = 'https://sample.capsulecrm.com/api/task/59'
190
- stub_request(:post, /\/api\/task$/).
191
- to_return(headers: { 'Location' => location })
192
- end
193
-
194
- subject { task.save! }
195
-
196
- it { subject.id.should eql(59) }
197
-
198
- it { should be_persisted }
199
- end
200
-
201
- context 'when it is an existing record' do
202
- before do
203
- task.id = 12
204
- stub_request(:put, /\/api\/task\/12$/).to_return(status: 200)
205
- end
206
-
207
- subject { task.save! }
208
-
209
- it { should be_persisted }
210
- end
211
-
212
- context 'when it is invalid' do
213
- it do
214
- expect { subject.save! }.
215
- to raise_error(CapsuleCRM::Errors::RecordInvalid)
216
- end
217
- end
218
- end
219
-
220
- describe '#update_attributes' do
221
- context 'when it is valid' do
222
- let(:task) { Fabricate.build(:task, id: 1) }
223
-
224
- subject { task.update_attributes description: Faker::Lorem.sentence }
225
-
226
- before { stub_request(:put, /\/api\/task\/1$/).to_return(status: 200) }
227
-
228
- it { should be_persisted }
229
- end
230
-
231
- context 'when it is not valid' do
232
- let(:task) { CapsuleCRM::Task.new(id: 1) }
233
-
234
- subject { task.update_attributes }
235
-
236
- it { should be_false }
237
- end
238
- end
239
-
240
- describe '#update_attributes!' do
241
- context 'when it is valid' do
242
- let(:task) { Fabricate.build(:task, id: 1) }
243
-
244
- subject { task.update_attributes! description: Faker::Lorem.sentence }
245
-
246
- before { stub_request(:put, /\/api\/task\/1$/).to_return(status: 200) }
247
-
248
- it { should be_persisted }
249
- end
250
-
251
- context 'when it is not valid' do
252
- let(:task) { CapsuleCRM::Task.new(id: 1) }
253
-
254
- subject { task.update_attributes! }
255
-
256
- it do
257
- expect { subject }.to raise_error(CapsuleCRM::Errors::RecordInvalid)
258
- end
259
- end
260
- end
261
-
262
- describe '#destroy' do
263
- subject { Fabricate.build(:task, id: 1) }
264
-
265
- before do
266
- stub_request(:delete, /\/api\/task\/1$/).to_return(status: 200)
267
- subject.destroy
268
- end
269
-
270
- it { should_not be_persisted }
41
+ describe 'validations' do
42
+ it { should validate_numericality_of(:id) }
43
+ it { should validate_presence_of(:description) }
44
+ it { should validate_presence_of(:due_date) }
45
+ it { should validate_presence_of(:due_date_time) }
271
46
  end
272
47
 
273
48
  # Not really sure what to test here. CapsuleCRM API doesn't actually tell you
@@ -301,7 +76,6 @@ describe CapsuleCRM::Task do
301
76
 
302
77
  describe '.categories' do
303
78
  subject { CapsuleCRM::Task.categories }
304
-
305
79
  before do
306
80
  stub_request(:get, /\/api\/task\/categories$/).
307
81
  to_return(body: File.read('spec/support/task_categories.json'))
@@ -318,14 +92,11 @@ describe CapsuleCRM::Task do
318
92
  subject { task.to_capsule_json }
319
93
 
320
94
  it { expect(subject.keys).to include('task') }
321
-
322
95
  it { expect(subject['task']['description']).to eql(task.description) }
323
-
324
96
  it { expect(subject['task']['dueDate']).to eql(task.due_date.to_s) }
325
97
 
326
98
  context 'when it has an owner' do
327
99
  let(:owner) { CapsuleCRM::User.new(username: 'matt.beedle') }
328
-
329
100
  before { task.owner = owner }
330
101
 
331
102
  it { expect(subject['task']['owner']).to eql(task.owner.username) }