capsule_crm 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGELOG.md +19 -0
  4. data/README.md +1 -1
  5. data/lib/capsule_crm/associations/belongs_to.rb +12 -10
  6. data/lib/capsule_crm/associations/belongs_to_association.rb +80 -0
  7. data/lib/capsule_crm/associations/has_many.rb +8 -18
  8. data/lib/capsule_crm/associations/has_many_association.rb +80 -0
  9. data/lib/capsule_crm/associations.rb +26 -0
  10. data/lib/capsule_crm/capsule_jsonable.rb +5 -1
  11. data/lib/capsule_crm/case.rb +7 -9
  12. data/lib/capsule_crm/contacts.rb +1 -1
  13. data/lib/capsule_crm/custom_field.rb +5 -8
  14. data/lib/capsule_crm/history.rb +11 -11
  15. data/lib/capsule_crm/opportunity.rb +5 -7
  16. data/lib/capsule_crm/organization.rb +6 -7
  17. data/lib/capsule_crm/participant.rb +0 -4
  18. data/lib/capsule_crm/party.rb +1 -1
  19. data/lib/capsule_crm/person.rb +6 -7
  20. data/lib/capsule_crm/serializer.rb +56 -0
  21. data/lib/capsule_crm/task.rb +7 -5
  22. data/lib/capsule_crm/track.rb +1 -1
  23. data/lib/capsule_crm/user.rb +5 -1
  24. data/lib/capsule_crm/version.rb +1 -1
  25. data/lib/capsule_crm.rb +1 -0
  26. data/spec/fabricators/custom_field_fabricator.rb +7 -0
  27. data/spec/lib/capsule_crm/associations/belongs_to_association_spec.rb +78 -0
  28. data/spec/lib/capsule_crm/associations/has_many_association_spec.rb +84 -0
  29. data/spec/lib/capsule_crm/associations/has_many_proxy_spec.rb +2 -2
  30. data/spec/lib/capsule_crm/associations_spec.rb +46 -0
  31. data/spec/lib/capsule_crm/custom_field_spec.rb +20 -597
  32. data/spec/lib/capsule_crm/history_spec.rb +8 -9
  33. data/spec/lib/capsule_crm/person_spec.rb +0 -16
  34. data/spec/lib/capsule_crm/serializer_spec.rb +103 -0
  35. data/spec/lib/capsule_crm/task_spec.rb +6 -14
  36. metadata +15 -2
@@ -17,7 +17,6 @@ describe CapsuleCRM::CustomField do
17
17
 
18
18
  describe '._for_party' do
19
19
  let(:party) { Fabricate.build(:organization, id: 1) }
20
-
21
20
  subject { CapsuleCRM::CustomField._for_party(party.id) }
22
21
 
23
22
  context 'when there are some custom fields' do
@@ -27,7 +26,6 @@ describe CapsuleCRM::CustomField do
27
26
  end
28
27
 
29
28
  it { should be_an(Array) }
30
-
31
29
  it do
32
30
  subject.all? { |item| item.is_a?(CapsuleCRM::CustomField) }.should be_true
33
31
  end
@@ -46,613 +44,38 @@ describe CapsuleCRM::CustomField do
46
44
  describe '.create' do
47
45
  context 'when it belongs to a party' do
48
46
  let(:organization) { Fabricate.build(:organization, id: 1) }
49
- let(:location) { "https://sample.capsulecrm.com/api/party/#{organization.id}/customfields" }
50
-
47
+ let(:location) do
48
+ 'https://sample.capsulecrm.com/api/party/#{organization.id}/customfields'
49
+ end
51
50
  subject do
52
51
  CapsuleCRM::CustomField.create(
53
- id: 100,
54
- tag: 'The tag',
55
- label: 'A field',
56
- text: 'Some text',
57
- date: Date.today,
58
- boolean: true,
59
- party: organization
52
+ id: 100, tag: 'The tag', label: 'A field', text: 'Some text',
53
+ date: Date.today, boolean: true, party: organization
60
54
  )
61
55
  end
62
-
63
56
  before do
64
57
  stub_request(:post, /\/api\/party\/#{organization.id}\/customfields$/).
65
58
  to_return(headers: { 'Location' => location})
66
59
  end
67
60
 
68
- it { subject.id.should eql(100) }
61
+ it { expect(subject.id).to eql(100) }
69
62
  end
70
63
  end
71
- end
72
-
73
-
74
-
75
-
76
- # describe '.create' do
77
- # context 'when it belongs to a party' do
78
- # let(:person) { Fabricate.build(:person, id: 1) }
79
-
80
- # subject do
81
- # CapsuleCRM::History.create(
82
- # note: Faker::Lorem.paragraph, party: person
83
- # )
84
- # end
85
-
86
- # let(:location) do
87
- # "https://sample.capsulecrm.com/api/party/#{person.id}/history/101"
88
- # end
89
-
90
- # before do
91
- # stub_request(:post, /\/api\/party\/#{person.id}\/history$/).
92
- # to_return(headers: { 'Location' => location})
93
- # end
94
-
95
- # it { subject.id.should eql(101) }
96
- # end
97
-
98
-
99
-
100
- ####
101
-
102
-
103
- # describe 'find' do
104
- # before do
105
- # stub_request(:get, /\/api\/history\/100$/).
106
- # to_return(body: File.read('spec/support/history.json'))
107
- # stub_request(:get, /\/api\/users$/).
108
- # to_return(body: File.read('spec/support/all_users.json'))
109
- # end
110
-
111
- # subject { CapsuleCRM::History.find(100) }
112
-
113
- # it { subject.type.should eql('Note') }
114
-
115
- # it { subject.creator.should be_a(CapsuleCRM::User) }
116
-
117
- # it { subject.entry_date.should_not be_blank }
118
-
119
- # it { subject.subject.should_not be_blank }
120
-
121
- # it { subject.note.should_not be_blank }
122
-
123
- # it { subject.attachments.should be_a(Array) }
124
-
125
- # it { subject.attachments.first.should be_a(CapsuleCRM::Attachment) }
126
-
127
- # it { subject.attachments.first.filename.should eql('latin.doc') }
128
-
129
- # it { subject.participants.should be_a(Array) }
130
-
131
- # it { subject.participants.first.should be_a(CapsuleCRM::Participant) }
132
-
133
- # it { subject.participants.first.name.should eql('Matt Beedle') }
134
-
135
- # context 'when it belongs to a party' do
136
- # before do
137
- # stub_request(:get, /\/api\/party\/1$/).
138
- # to_return(body: File.read('spec/support/person.json'))
139
- # end
140
-
141
- # it { subject.party_id.should_not be_blank }
142
-
143
- # it { subject.party.should_not be_blank }
144
- # end
145
-
146
- # context 'when it belongs to a case' do
147
- # before do
148
- # stub_request(:get, /\/api\/kase\/5$/).
149
- # to_return(body: File.read('spec/support/case.json'))
150
- # end
151
-
152
- # it { subject.case_id.should_not be_blank }
153
-
154
- # it { subject.kase.should_not be_blank }
155
- # end
156
-
157
- # context 'when it belongs to an opportunity' do
158
- # before do
159
- # stub_request(:get, /\/api\/opportunity\/2$/).
160
- # to_return(body: File.read('spec/support/opportunity.json'))
161
- # end
162
-
163
- # it { subject.opportunity_id.should_not be_blank }
164
-
165
- # it { subject.opportunity.should_not be_blank }
166
- # end
167
- # end
168
-
169
- # describe '#creator=' do
170
- # let(:history) { CapsuleCRM::History.new }
171
-
172
- # context 'when a String is supplied' do
173
- # before do
174
- # stub_request(:get, /\/api\/users$/).
175
- # to_return(body: File.read('spec/support/all_users.json'))
176
- # end
177
-
178
- # context 'when the user exists' do
179
- # before { history.creator = 'a.user' }
180
-
181
- # it { history.creator.should be_a(CapsuleCRM::User) }
182
- # end
183
-
184
- # context 'when the user does not exist' do
185
- # before { history.creator = 'asdfadsfdsaf' }
186
-
187
- # it { history.creator.should be_blank }
188
- # end
189
- # end
190
-
191
- # context 'when a CapsuleCRM::Person is supplied' do
192
- # let(:user) { CapsuleCRM::User.new }
193
-
194
- # before { history.creator = user }
195
-
196
- # it { history.creator.should eql(user) }
197
- # end
198
- # end
199
-
200
- # describe '.create' do
201
- # context 'when it belongs to a party' do
202
- # let(:person) { Fabricate.build(:person, id: 1) }
203
-
204
- # subject do
205
- # CapsuleCRM::History.create(
206
- # note: Faker::Lorem.paragraph, party: person
207
- # )
208
- # end
209
-
210
- # let(:location) do
211
- # "https://sample.capsulecrm.com/api/party/#{person.id}/history/101"
212
- # end
213
-
214
- # before do
215
- # stub_request(:post, /\/api\/party\/#{person.id}\/history$/).
216
- # to_return(headers: { 'Location' => location})
217
- # end
218
-
219
- # it { subject.id.should eql(101) }
220
- # end
221
-
222
- # context 'when it belongs to a kase' do
223
- # let(:kase) { Fabricate.build(:case, id: 2) }
224
-
225
- # let(:location) do
226
- # "https://sample.capsulecrm.com/api/kase/#{kase.id}/history/10"
227
- # end
228
-
229
- # subject do
230
- # CapsuleCRM::History.create(note: Faker::Lorem.paragraph, kase: kase)
231
- # end
232
-
233
- # before do
234
- # stub_request(:post, /\/api\/kase\/#{kase.id}\/history$/).
235
- # to_return(headers: { 'Location' => location })
236
- # end
237
-
238
- # it { subject.id.should eql(10) }
239
- # end
240
-
241
- # context 'when it belongs to an opportunity' do
242
- # let(:opportunity) { Fabricate.build(:opportunity, id: 1) }
243
-
244
- # subject do
245
- # CapsuleCRM::History.create(
246
- # note: Faker::Lorem.paragraph, opportunity: opportunity
247
- # )
248
- # end
249
-
250
- # let(:location) do
251
- # [
252
- # 'https://sample.capsulecrm.com/api/opportunity/',
253
- # opportunity.id, '/history/9'
254
- # ].join
255
- # end
256
-
257
- # before do
258
- # stub_request(:post, /\/api\/opportunity\/#{opportunity.id}\/history$/).
259
- # to_return(headers: { 'Location' => location })
260
- # end
261
-
262
- # it { subject.id.should eql(9) }
263
- # end
264
-
265
- # context 'when it is invalid' do
266
- # subject { CapsuleCRM::History.create }
267
-
268
- # it { should_not be_valid }
269
- # end
270
- # end
271
-
272
- # describe '.create!' do
273
- # context 'when it belongs to a party' do
274
- # let(:person) { Fabricate.build(:person, id: 1) }
275
-
276
- # subject do
277
- # CapsuleCRM::History.create!(
278
- # note: Faker::Lorem.paragraph, party: person
279
- # )
280
- # end
281
-
282
- # let(:location) do
283
- # "https://sample.capsulecrm.com/api/party/#{person.id}/history/101"
284
- # end
285
-
286
- # before do
287
- # stub_request(:post, /\/api\/party\/#{person.id}\/history$/).
288
- # to_return(headers: { 'Location' => location})
289
- # end
290
-
291
- # it { subject.id.should eql(101) }
292
- # end
293
-
294
- # context 'when it belongs to a kase' do
295
- # let(:kase) { Fabricate.build(:case, id: 2) }
296
-
297
- # let(:location) do
298
- # "https://sample.capsulecrm.com/api/kase/#{kase.id}/history/10"
299
- # end
300
-
301
- # subject do
302
- # CapsuleCRM::History.create!(note: Faker::Lorem.paragraph, kase: kase)
303
- # end
304
-
305
- # before do
306
- # stub_request(:post, /\/api\/kase\/#{kase.id}\/history$/).
307
- # to_return(headers: { 'Location' => location })
308
- # end
309
-
310
- # it { subject.id.should eql(10) }
311
- # end
312
-
313
- # context 'when it belongs to an opportunity' do
314
- # let(:opportunity) { Fabricate.build(:opportunity, id: 1) }
315
-
316
- # subject do
317
- # CapsuleCRM::History.create!(
318
- # note: Faker::Lorem.paragraph, opportunity: opportunity
319
- # )
320
- # end
321
-
322
- # let(:location) do
323
- # [
324
- # 'https://sample.capsulecrm.com/api/opportunity/',
325
- # opportunity.id, '/history/9'
326
- # ].join
327
- # end
328
-
329
- # before do
330
- # stub_request(:post, /\/api\/opportunity\/#{opportunity.id}\/history$/).
331
- # to_return(headers: { 'Location' => location })
332
- # end
333
-
334
- # it { subject.id.should eql(9) }
335
- # end
336
-
337
- # context 'when it is invalid' do
338
- # it do
339
- # expect { CapsuleCRM::History.create! }.
340
- # to raise_error(CapsuleCRM::Errors::RecordInvalid)
341
- # end
342
- # end
343
- # end
344
64
 
345
- # describe '#update_attributes' do
346
- # context 'when the history is valid' do
347
- # subject { Fabricate(:history, id: 2, party: Fabricate.build(:person)) }
65
+ describe '#to_capsule_json' do
66
+ let(:custom_field) { Fabricate.build(:custom_field) }
67
+ subject { custom_field.to_capsule_json }
348
68
 
349
- # before do
350
- # stub_request(:put, /api\/history\/2$/).to_return(status: 200)
351
- # subject.update_attributes note: 'changed note text'
352
- # end
353
-
354
- # it { subject.note.should eql('changed note text') }
355
-
356
- # it { should be_persisted }
357
- # end
358
-
359
- # context 'when the history is not valid' do
360
- # subject do
361
- # CapsuleCRM::History.new(id: 2)
362
- # end
363
-
364
- # before { subject.update_attributes subject: Faker::Lorem.sentence }
365
-
366
- # it { subject.should_not be_valid }
367
- # end
368
- # end
369
-
370
- # describe '#update_attributes!' do
371
- # context 'when it is valid' do
372
- # subject { Fabricate(:history, id: 3, party: Fabricate.build(:case)) }
373
-
374
- # before do
375
- # stub_request(:put, /api\/history\/3$/).to_return(status: 200)
376
- # subject.update_attributes! note: 'some new note'
377
- # end
378
-
379
- # it { subject.note.should eql('some new note') }
380
-
381
- # it { should be_persisted }
382
- # end
383
-
384
- # context 'when it is not valid' do
385
- # subject { CapsuleCRM::History.new(id: 3) }
386
-
387
- # it do
388
- # expect { subject.update_attributes! subject: 'test' }.
389
- # to raise_error(CapsuleCRM::Errors::RecordInvalid)
390
- # end
391
- # end
392
- # end
393
-
394
- # describe '#save' do
395
- # context 'when it is a new record' do
396
- # let(:history) { Fabricate.build(:history) }
397
-
398
- # context 'when it belongs to a party' do
399
- # let(:party) { Fabricate.build(:organization, id: 2) }
400
-
401
- # let(:location) do
402
- # "https://sample.capsulecrm.com/api/party/#{party.id}/history/101"
403
- # end
404
-
405
- # before do
406
- # history.party = party
407
- # stub_request(:post, /\/api\/party\/#{party.id}\/history$/).
408
- # to_return(headers: { 'Location' => location })
409
- # history.save
410
- # end
411
-
412
- # it { history.id.should eql(101) }
413
-
414
- # it { history.should be_persisted }
415
- # end
416
-
417
- # context 'when it belongs to a kase' do
418
- # let(:kase) { Fabricate.build(:case, id: 5) }
419
-
420
- # let(:location) do
421
- # "https://sample.capsulecrm.com/api/kase/#{kase.id}/history/10005"
422
- # end
423
-
424
- # before do
425
- # history.kase = kase
426
- # stub_request(:post, /\/api\/kase\/#{kase.id}\/history$/).
427
- # to_return(headers: { 'Location' => location })
428
- # history.save
429
- # end
430
-
431
- # it { history.id.should eql(10005) }
432
-
433
- # it { history.should be_persisted }
434
- # end
435
-
436
- # context 'when it belongs to an opportunity' do
437
- # let(:opportunity) { Fabricate.build(:opportunity, id: 3) }
438
-
439
- # let(:location) do
440
- # [
441
- # 'https://sample.capsulecrm.com/api/opportunity/',
442
- # opportunity.id, '/history/101'
443
- # ].join
444
- # end
445
-
446
- # before do
447
- # history.opportunity = opportunity
448
- # stub_request(
449
- # :post, /\/api\/opportunity\/#{opportunity.id}\/history$/
450
- # ).to_return(headers: { 'Location' => location })
451
- # history.save
452
- # end
453
-
454
- # it { history.id.should eql(101) }
455
-
456
- # it { history.should be_persisted }
457
- # end
458
- # end
459
-
460
- # context 'when it is an existing record' do
461
- # let(:history) do
462
- # Fabricate.build(:history, party: Fabricate.build(:person), id: 10)
463
- # end
464
-
465
- # before do
466
- # stub_request(:put, /\/api\/history\/#{history.id}$/).
467
- # to_return(status: 200)
468
- # history.save
469
- # end
470
-
471
- # it { history.should be_persisted }
472
- # end
473
- # end
474
-
475
- # describe '#save!' do
476
- # context 'when it is a new record' do
477
- # context 'when it is invalid' do
478
- # let(:history) { CapsuleCRM::History.new(id: 5) }
479
-
480
- # it 'should raise an error' do
481
- # expect { history.save! }.
482
- # to raise_error(CapsuleCRM::Errors::RecordInvalid)
483
- # end
484
- # end
485
-
486
- # let(:history) { Fabricate.build(:history) }
487
-
488
- # context 'when it belongs to a party' do
489
- # let(:party) { Fabricate.build(:organization, id: 2) }
490
-
491
- # let(:location) do
492
- # "https://sample.capsulecrm.com/api/party/#{party.id}/history/101"
493
- # end
494
-
495
- # before do
496
- # history.party = party
497
- # stub_request(:post, /\/api\/party\/#{party.id}\/history$/).
498
- # to_return(headers: { 'Location' => location })
499
- # history.save!
500
- # end
501
-
502
- # it { history.id.should eql(101) }
503
-
504
- # it { history.should be_persisted }
505
- # end
506
-
507
- # context 'when it belongs to a kase' do
508
- # let(:kase) { Fabricate.build(:case, id: 5) }
509
-
510
- # let(:location) do
511
- # "https://sample.capsulecrm.com/api/kase/#{kase.id}/history/10005"
512
- # end
513
-
514
- # before do
515
- # history.kase = kase
516
- # stub_request(:post, /\/api\/kase\/#{kase.id}\/history$/).
517
- # to_return(headers: { 'Location' => location })
518
- # history.save!
519
- # end
520
-
521
- # it { history.id.should eql(10005) }
522
-
523
- # it { history.should be_persisted }
524
- # end
525
-
526
- # context 'when it belongs to an opportunity' do
527
- # let(:opportunity) { Fabricate.build(:opportunity, id: 3) }
528
-
529
- # let(:location) do
530
- # [
531
- # 'https://sample.capsulecrm.com/api/opportunity/',
532
- # opportunity.id, '/history/101'
533
- # ].join
534
- # end
535
-
536
- # before do
537
- # history.opportunity = opportunity
538
- # stub_request(
539
- # :post, /\/api\/opportunity\/#{opportunity.id}\/history$/
540
- # ).to_return(headers: { 'Location' => location })
541
- # history.save!
542
- # end
543
-
544
- # it { history.id.should eql(101) }
545
-
546
- # it { history.should be_persisted }
547
- # end
548
- # end
549
-
550
- # context 'when it is an existing record' do
551
- # context 'when it is valid' do
552
- # let(:history) do
553
- # Fabricate.build(:history, party: Fabricate.build(:person), id: 10)
554
- # end
555
-
556
- # before do
557
- # stub_request(:put, /\/api\/history\/#{history.id}$/).
558
- # to_return(status: 200)
559
- # history.save!
560
- # end
561
-
562
- # it { history.should be_persisted }
563
- # end
564
-
565
- # context 'when it is not valid' do
566
- # let(:history) { CapsuleCRM::History.new(id: 1) }
567
-
568
- # it 'should raise an error' do
569
- # expect { history.save! }.
570
- # to raise_error(CapsuleCRM::Errors::RecordInvalid)
571
- # end
572
- # end
573
- # end
574
- # end
575
-
576
- # describe '#destroy' do
577
- # let(:history) { Fabricate.build(:history, id: 19) }
578
-
579
- # before do
580
- # stub_request(:delete, /\/api\/history\/#{history.id}$/).
581
- # to_return(status: 200)
582
- # history.destroy
583
- # end
584
-
585
- # subject { history }
586
-
587
- # it { should_not be_persisted }
588
- # end
589
-
590
- # describe '#new_record?' do
591
- # context 'when the history item is a new record' do
592
- # let(:history) { CapsuleCRM::History.new }
593
-
594
- # subject { history.new_record? }
595
-
596
- # it { should be_true }
597
- # end
598
-
599
- # context 'when the history item is not a new record' do
600
- # let(:history) { CapsuleCRM::History.new(id: 1) }
601
-
602
- # subject { history.new_record? }
603
-
604
- # it { should be_false }
605
- # end
606
- # end
607
-
608
- # describe '#persisted?' do
609
- # context 'when the history item is persisted' do
610
- # let(:history) { CapsuleCRM::History.new(id: 1) }
611
-
612
- # subject { history.persisted? }
613
-
614
- # it { should be_true }
615
- # end
616
-
617
- # context 'when the hitory item is not persisted' do
618
- # let(:history) { CapsuleCRM::History.new }
619
-
620
- # subject { history.persisted? }
621
-
622
- # it { should be_false }
623
- # end
624
- # end
625
-
626
- # describe '#to_capsule_json' do
627
- # let(:creator) { CapsuleCRM::User.new(username: Faker::Name.name) }
628
-
629
- # let(:history) do
630
- # CapsuleCRM::History.new(
631
- # type: 'Note', entry_date: Time.now, creator: creator,
632
- # subject: Faker::Lorem.sentence, note: Faker::Lorem.paragraph,
633
- # participants: [participant]
634
- # )
635
- # end
636
-
637
- # let(:participant) do
638
- # CapsuleCRM::Participant.new(
639
- # name: Faker::Name.name, email_address: Faker::Internet.email,
640
- # role: 'TO'
641
- # )
642
- # end
643
-
644
- # subject { history.to_capsule_json }
645
-
646
- # let(:participants_json) { subject[:historyItem]['participants'] }
647
-
648
- # it { subject.keys.first.should eql(:historyItem) }
649
-
650
- # it { subject[:historyItem]['entryDate'].should eql(history.entry_date) }
651
-
652
- # it { subject[:historyItem]['creator'].should eql(creator.username) }
69
+ it 'should be a hash' do
70
+ expect(subject).to be_a(Hash)
71
+ end
653
72
 
654
- # it { subject[:historyItem]['note'].should eql(history.note) }
73
+ it 'should have a root element of "customField"' do
74
+ expect(subject.keys.first).to eql('customFields')
75
+ end
655
76
 
656
- # it { subject[:historyItem].should have_key('note') }
657
- # end
658
- # end
77
+ it 'should have an element named "customField"' do
78
+ expect(subject['customFields'].keys.first).to eql('customField')
79
+ end
80
+ end
81
+ end
@@ -616,14 +616,13 @@ describe CapsuleCRM::History do
616
616
  let(:participants_json) { subject[:historyItem]['participants'] }
617
617
  subject { history.to_capsule_json }
618
618
 
619
- it { expect(subject.keys.first).to eql(:historyItem) }
620
-
621
- it { expect(subject[:historyItem]['entryDate']).to eql(history.entry_date) }
622
-
623
- it { expect(subject[:historyItem]['creator']).to eql(creator.username) }
624
-
625
- it { expect(subject[:historyItem]['note']).to eql(history.note) }
626
-
627
- it { expect(subject[:historyItem]).to have_key('note') }
619
+ it { expect(subject.keys.first).to eql('historyItem') }
620
+ it do
621
+ expect(subject['historyItem']['entryDate']).
622
+ to eql(history.entry_date.strftime("%Y-%m-%dT%H:%M:%SZ"))
623
+ end
624
+ it { expect(subject['historyItem']['creator']).to eql(creator.username) }
625
+ it { expect(subject['historyItem']['note']).to eql(history.note) }
626
+ it { expect(subject['historyItem']).to have_key('note') }
628
627
  end
629
628
  end