contactually-ruby 0.0.2

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 (53) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +22 -0
  3. data/README.md +80 -0
  4. data/Rakefile +7 -0
  5. data/lib/contactually-ruby.rb +38 -0
  6. data/lib/contactually/accounts.rb +22 -0
  7. data/lib/contactually/api.rb +87 -0
  8. data/lib/contactually/buckets.rb +49 -0
  9. data/lib/contactually/contact_groupings.rb +16 -0
  10. data/lib/contactually/contacts.rb +54 -0
  11. data/lib/contactually/contents.rb +30 -0
  12. data/lib/contactually/errors.rb +21 -0
  13. data/lib/contactually/groupings.rb +36 -0
  14. data/lib/contactually/middleware/error_detector.rb +31 -0
  15. data/lib/contactually/notes.rb +31 -0
  16. data/lib/contactually/representer/account_representer.rb +15 -0
  17. data/lib/contactually/representer/bucket_representer.rb +16 -0
  18. data/lib/contactually/representer/contact_representer.rb +48 -0
  19. data/lib/contactually/representer/content_representer.rb +18 -0
  20. data/lib/contactually/representer/grouping_representer.rb +30 -0
  21. data/lib/contactually/representer/grouping_statistic_representer.rb +14 -0
  22. data/lib/contactually/representer/note_representer.rb +15 -0
  23. data/lib/contactually/representer/task_representer.rb +21 -0
  24. data/lib/contactually/tasks.rb +49 -0
  25. data/lib/contactually/utils.rb +44 -0
  26. data/lib/contactually/version.rb +3 -0
  27. data/spec/accounts_spec.rb +58 -0
  28. data/spec/api_spec.rb +125 -0
  29. data/spec/buckets_spec.rb +97 -0
  30. data/spec/contact_groupings_spec.rb +44 -0
  31. data/spec/contacts_spec.rb +133 -0
  32. data/spec/contents_spec.rb +80 -0
  33. data/spec/error_detector_spec.rb +24 -0
  34. data/spec/fixtures/account.json +10 -0
  35. data/spec/fixtures/accounts_index.json +19 -0
  36. data/spec/fixtures/bucket.json +8 -0
  37. data/spec/fixtures/buckets_index.json +41 -0
  38. data/spec/fixtures/contact.json +38 -0
  39. data/spec/fixtures/contacts_index.json +172 -0
  40. data/spec/fixtures/content.json +10 -0
  41. data/spec/fixtures/contents_index.json +29 -0
  42. data/spec/fixtures/grouping.json +19 -0
  43. data/spec/fixtures/groupings_index.json +28 -0
  44. data/spec/fixtures/note.json +7 -0
  45. data/spec/fixtures/note_destroy.json +4 -0
  46. data/spec/fixtures/notes_index.json +30 -0
  47. data/spec/fixtures/task.json +27 -0
  48. data/spec/fixtures/tasks_index.json +41 -0
  49. data/spec/groupings_spec.rb +85 -0
  50. data/spec/notes_spec.rb +85 -0
  51. data/spec/spec_helper.rb +14 -0
  52. data/spec/tasks_spec.rb +127 -0
  53. metadata +205 -0
@@ -0,0 +1,125 @@
1
+ require 'spec_helper'
2
+
3
+ describe Contactually::API do
4
+
5
+ describe 'missing configuration' do
6
+ before(:all) { Contactually.configure { |c| c.access_token = nil } }
7
+ specify do
8
+ expect{ subject }.to raise_error Contactually::ConfigMissingApiKeyError
9
+ end
10
+
11
+ it 'allows to supply api key via initialize' do
12
+ expect{ described_class.new('asdf') }.not_to raise_error
13
+ end
14
+
15
+ it 'sets access_token from parameters' do
16
+ expect(described_class.new('asdf').instance_variable_get(:@access_token)).to eq 'asdf'
17
+ end
18
+ end
19
+
20
+ describe 'valid configuration' do
21
+ before(:all) { Contactually.configure { |c| c.access_token = 'VALID_ACCESS_TOKEN' } }
22
+
23
+ describe '#initialize' do
24
+ it 'initializes correctly' do
25
+ expect{ subject }.not_to raise_error
26
+ expect(subject).to be_kind_of Contactually::API
27
+ end
28
+
29
+ it 'sets instance variables' do
30
+ expect(subject.instance_variable_get(:@access_token)).to eq 'VALID_ACCESS_TOKEN'
31
+ expect(subject.instance_variable_get(:@base_url)).to eq Contactually.contactually_url
32
+ end
33
+ end
34
+
35
+ describe '#call' do
36
+ it 'redirects get request to get' do
37
+ allow(subject).to receive(:get).and_return(Struct.new(:status, :body).new(200, {}))
38
+ subject.call('bla', :get, {})
39
+ expect(subject).to have_received(:get).with('bla', {})
40
+ end
41
+
42
+ it 'redirects post request to post' do
43
+ allow(subject).to receive(:post).and_return(Struct.new(:status, :body).new(200, {}))
44
+ subject.call('bla', :post, {})
45
+ expect(subject).to have_received(:post).with('bla', {})
46
+ end
47
+ end
48
+
49
+ describe '#call_params' do
50
+ specify do
51
+ expect(subject.send(:call_params, { foo: :bar })).to eql({ access_token: 'VALID_ACCESS_TOKEN', foo: :bar })
52
+ end
53
+ end
54
+
55
+ describe '#base_url' do
56
+ specify do
57
+ expect(subject.send(:base_url, 'foo/bar')).to eql("#{Contactually.contactually_url}foo/bar")
58
+ end
59
+ end
60
+
61
+ describe '#accounts' do
62
+ specify do
63
+ expect(subject.accounts).to be_kind_of Contactually::Accounts
64
+ end
65
+ end
66
+
67
+ describe '#contact_groupings' do
68
+ specify do
69
+ expect(subject.contact_groupings).to be_kind_of Contactually::ContactGroupings
70
+ end
71
+ end
72
+
73
+ describe '#contacts' do
74
+ specify do
75
+ expect(subject.contacts).to be_kind_of Contactually::Contacts
76
+ end
77
+ end
78
+
79
+ describe '#contents' do
80
+ specify do
81
+ expect(subject.contents).to be_kind_of Contactually::Contents
82
+ end
83
+ end
84
+
85
+ describe '#groupings' do
86
+ specify do
87
+ expect(subject.groupings).to be_kind_of Contactually::Groupings
88
+ end
89
+ end
90
+
91
+ describe '#notes' do
92
+ specify do
93
+ expect(subject.notes).to be_kind_of Contactually::Notes
94
+ end
95
+ end
96
+
97
+ describe '#tasks' do
98
+ specify do
99
+ expect(subject.tasks).to be_kind_of Contactually::Tasks
100
+ end
101
+ end
102
+
103
+ describe 'endpoints' do
104
+ %w{ accounts contact_groupings contacts contents groupings notes tasks }.each do |endpoint|
105
+ specify { expect(subject.respond_to?(endpoint)).to eq true }
106
+ end
107
+ end
108
+
109
+ describe '#get' do
110
+ it 'parses from json response' do
111
+ allow(subject.connection).to receive(:get).
112
+ with('https://api.contactually.com/v2/url', { foo: :bar, access_token: 'VALID_ACCESS_TOKEN' }).
113
+ and_return(Struct.new(:status, :body).new(200, "{ \"foo\": \"bar\" }"))
114
+ expect(subject.call('url', :get, { foo: :bar })).to be_kind_of Hash
115
+ end
116
+ end
117
+
118
+ describe '#post' do
119
+ it 'parses from json response' do
120
+ allow(subject.connection).to receive(:post).and_return(Struct.new(:status, :body).new(200, "{ \"foo\": \"bar\" }"))
121
+ expect(subject.call('url', :post, { foo: :bar })).to be_kind_of Hash
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+
3
+ describe Contactually::Buckets do
4
+
5
+ let(:bucket_json) { File.read(File.join(File.dirname(__FILE__),"fixtures/bucket.json")) }
6
+ let(:bucket_index_json) { File.read(File.join(File.dirname(__FILE__),"fixtures/buckets_index.json")) }
7
+
8
+ before(:all) do
9
+ Contactually.configure { |c| c.access_token = 'VALID_ACCESS_TOKEN' }
10
+ @master = Contactually::API.new
11
+ end
12
+
13
+ subject { described_class.new @master }
14
+ describe '#initialize' do
15
+ specify do
16
+ expect(subject).to be_kind_of Contactually::Buckets
17
+ end
18
+
19
+ specify do
20
+ expect(subject.instance_variable_get(:@master)).to be_kind_of Contactually::API
21
+ end
22
+ end
23
+
24
+ describe '#create' do
25
+ it 'calls the api with correct params' do
26
+ allow(@master).to receive(:call).with('buckets.json', :post, { bucket: { foo: :bar }}).and_return(JSON.load(bucket_json))
27
+ subject.create({ bucket: { foo: :bar }})
28
+ expect(@master).to have_received(:call)
29
+ end
30
+
31
+ it 'returns a bucket' do
32
+ allow(@master).to receive(:call).with('buckets.json', :post, { bucket: { foo: :bar }}).and_return(JSON.load(bucket_json))
33
+ expect(subject.create({ bucket: { foo: :bar } })).to be_kind_of Contactually::Bucket
34
+ end
35
+ end
36
+
37
+ describe '#destroy' do
38
+ it 'calls the api with correct params' do
39
+ allow(@master).to receive(:call).with('buckets/1.json', :delete, {})
40
+ subject.destroy(1)
41
+ expect(@master).to have_received(:call)
42
+ end
43
+ end
44
+
45
+ describe '#show' do
46
+ it 'calls the api with correct params' do
47
+ allow(@master).to receive(:call).with('buckets/1.json', :get, { foo: :bar }).and_return({ id: 1 })
48
+ subject.show(1, { foo: :bar })
49
+ expect(@master).to have_received(:call)
50
+ end
51
+
52
+ it 'returns a bucket' do
53
+ allow(@master).to receive(:call).with('buckets/1.json', :get, { foo: :bar }).and_return(JSON.load(bucket_json))
54
+ expect(subject.show(1, { foo: :bar })).to be_kind_of Contactually::Bucket
55
+ end
56
+ end
57
+
58
+ describe '#update' do
59
+ it 'calls the api with correct params' do
60
+ allow(@master).to receive(:call).with('buckets/1.json', :put, { bucket: { foo: :bar }}).and_return(JSON.load(bucket_json))
61
+ subject.update(1, { bucket: { foo: :bar } })
62
+ expect(@master).to have_received(:call)
63
+ end
64
+
65
+ it 'returns a bucket from json response' do
66
+ allow(@master).to receive(:call).with('buckets/1.json', :put, { bucket: { foo: :bar }}).and_return(JSON.load(bucket_json))
67
+ expect(subject.update(1, bucket: { foo: :bar })).to be_kind_of Contactually::Bucket
68
+ end
69
+ end
70
+
71
+ describe '#index' do
72
+ it 'calls the api with correct params' do
73
+ allow(@master).to receive(:call).with('buckets.json', :get, { foo: :bar }).and_return({ 'data' => [] })
74
+ subject.index({ foo: :bar })
75
+ expect(@master).to have_received(:call)
76
+ end
77
+
78
+ it 'returns buckets from json response' do
79
+ allow(@master).to receive(:call).with('buckets.json', :get, {}).and_return(JSON.load(bucket_index_json))
80
+ expect(subject.index({})).to be_kind_of Array
81
+ expect(subject.index({})[0]).to be_kind_of Contactually::Bucket
82
+ end
83
+ end
84
+
85
+ describe '#count' do
86
+ it 'calls the api with correct params' do
87
+ allow(@master).to receive(:call).with('buckets.json', :get, { limit: 1 }).and_return({ 'data' => [], 'meta' => {'total' => 120 }})
88
+ subject.count()
89
+ expect(@master).to have_received(:call)
90
+ end
91
+
92
+ it 'returns total count' do
93
+ allow(@master).to receive(:call).with('buckets.json', :get, { limit: 1 }).and_return({ 'data' => [], 'meta' => {'total' => 120 }})
94
+ expect(subject.count).to be 120
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ describe Contactually::ContactGroupings do
4
+
5
+ let(:grouping_json) { File.read(File.join(File.dirname(__FILE__),"fixtures/grouping.json")) }
6
+
7
+ before(:all) do
8
+ Contactually.configure { |c| c.access_token = 'VALID_ACCESS_TOKEN' }
9
+ @master = Contactually::API.new
10
+ end
11
+
12
+ subject { described_class.new @master }
13
+ describe '#initialize' do
14
+ specify do
15
+ expect(subject).to be_kind_of Contactually::ContactGroupings
16
+ end
17
+
18
+ specify do
19
+ expect(subject.instance_variable_get(:@master)).to be_kind_of Contactually::API
20
+ end
21
+ end
22
+
23
+
24
+ describe '#create' do
25
+ it 'calls the api with correct params' do
26
+ allow(@master).to receive(:call).with('contacts/1/groupings.json', :post, { grouping_id: 512 }).and_return({ 'id' => 1234 })
27
+ subject.create(1, { grouping_id: 512 })
28
+ expect(@master).to have_received(:call)
29
+ end
30
+
31
+ it 'returns grouping from json response' do
32
+ allow(@master).to receive(:call).with('contacts/1/groupings.json', :post, { grouping_id: 512 }).and_return(JSON.load(grouping_json))
33
+ expect(subject.create(1, { grouping_id: 512 })).to be_kind_of Contactually::Grouping
34
+ end
35
+ end
36
+
37
+ describe '#destroy' do
38
+ it 'calls the api with correct params' do
39
+ allow(@master).to receive(:call).with('contacts/1/groupings/15.json', :delete, { foo: :bar }).and_return({ 'success' => true })
40
+ subject.destroy(1, 15, { foo: :bar })
41
+ expect(@master).to have_received(:call)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,133 @@
1
+ require 'spec_helper'
2
+
3
+ describe Contactually::Contacts do
4
+
5
+ let(:contact_json) { File.read(File.join(File.dirname(__FILE__),"fixtures/contact.json")) }
6
+ let(:contacts_index_json) { File.read(File.join(File.dirname(__FILE__),"fixtures/contacts_index.json")) }
7
+
8
+ before(:all) do
9
+ Contactually.configure { |c| c.access_token = 'VALID_ACCESS_TOKEN' }
10
+ @master = Contactually::API.new
11
+ end
12
+
13
+ subject { described_class.new @master }
14
+ describe '#initialize' do
15
+ specify do
16
+ expect(subject).to be_kind_of Contactually::Contacts
17
+ end
18
+
19
+ specify do
20
+ expect(subject.instance_variable_get(:@master)).to be_kind_of Contactually::API
21
+ end
22
+ end
23
+
24
+ describe '#create' do
25
+ it 'calls the api with correct params' do
26
+ allow(@master).to receive(:call).with('contacts.json', :post, { contact: { foo: :bar }}).and_return(JSON.load(contact_json))
27
+ subject.create({ contact: { foo: :bar }})
28
+ expect(@master).to have_received(:call)
29
+ end
30
+
31
+ it 'returns a contact' do
32
+ allow(@master).to receive(:call).with('contacts.json', :post, { contact: { foo: :bar }}).and_return(JSON.load(contact_json))
33
+ expect(subject.create({ contact: { foo: :bar } })).to be_kind_of Contactually::Contact
34
+ end
35
+ end
36
+
37
+ describe '#destroy' do
38
+ it 'calls the api with correct params' do
39
+ allow(@master).to receive(:call).with('contacts/1.json', :delete, {})
40
+ subject.destroy(1)
41
+ expect(@master).to have_received(:call)
42
+ end
43
+ end
44
+
45
+ describe '#destroy_multiple' do
46
+ it 'calls the api with correct params' do
47
+ allow(@master).to receive(:call).with('contacts.json', :delete, { ids: [ 1, 2, 3 ]})
48
+ subject.destroy_multiple({ ids: [ 1, 2, 3 ]})
49
+ expect(@master).to have_received(:call)
50
+ end
51
+ end
52
+
53
+ describe '#show' do
54
+ it 'calls the api with correct params' do
55
+ allow(@master).to receive(:call).with('contacts/1.json', :get, { foo: :bar }).and_return({ id: 1 })
56
+ subject.show(1, { foo: :bar })
57
+ expect(@master).to have_received(:call)
58
+ end
59
+
60
+ it 'returns a contact' do
61
+ allow(@master).to receive(:call).with('contacts/1.json', :get, { foo: :bar }).and_return(JSON.load(contact_json))
62
+ expect(subject.show(1, { foo: :bar })).to be_kind_of Contactually::Contact
63
+ end
64
+ end
65
+
66
+ describe '#tags' do
67
+ it 'calls the api with correct params - Array' do
68
+ allow(@master).to receive(:call).with('contacts/1/tags.json', :post, { tags: 'lol, haha' })
69
+ subject.tags(1, { tags: [ 'lol', 'haha' ]})
70
+ expect(@master).to have_received(:call)
71
+ end
72
+
73
+ it 'calls the api with correct params - String' do
74
+ allow(@master).to receive(:call).with('contacts/1/tags.json', :post, { tags: 'lol, haha' })
75
+ subject.tags(1, { tags: 'lol, haha' })
76
+ expect(@master).to have_received(:call)
77
+ end
78
+ end
79
+
80
+ describe '#update' do
81
+ it 'calls the api with correct params' do
82
+ allow(@master).to receive(:call).with('contacts/1.json', :put, { contact: { foo: :bar }}).and_return(JSON.load(contact_json))
83
+ subject.update(1, { contact: { foo: :bar } })
84
+ expect(@master).to have_received(:call)
85
+ end
86
+
87
+ it 'returns a contact from json response' do
88
+ allow(@master).to receive(:call).with('contacts/1.json', :put, { contact: { foo: :bar }}).and_return(JSON.load(contact_json))
89
+ expect(subject.update(1, { contact: { foo: :bar }})).to be_kind_of Contactually::Contact
90
+ end
91
+ end
92
+
93
+ describe '#index' do
94
+ it 'calls the api with correct params' do
95
+ allow(@master).to receive(:call).with('contacts.json', :get, { foo: :bar }).and_return({ 'data' => [] })
96
+ subject.index({ foo: :bar })
97
+ expect(@master).to have_received(:call)
98
+ end
99
+
100
+ it 'returns contacts from json response' do
101
+ allow(@master).to receive(:call).with('contacts.json', :get, {}).and_return(JSON.load(contacts_index_json))
102
+ expect(subject.index({})).to be_kind_of Array
103
+ expect(subject.index({})[0]).to be_kind_of Contactually::Contact
104
+ end
105
+ end
106
+
107
+ describe '#search' do
108
+ it 'calls the api with correct params' do
109
+ allow(@master).to receive(:call).with('contacts/search.json', :get, { term: :foo_bar }).and_return({ 'data' => [] })
110
+ subject.search({ term: :foo_bar})
111
+ expect(@master).to have_received(:call)
112
+ end
113
+
114
+ it 'returns contacts from json response' do
115
+ allow(@master).to receive(:call).with('contacts/search.json', :get, { term: :foo_bar }).and_return(JSON.load(contacts_index_json))
116
+ expect(subject.search({ term: :foo_bar })).to be_kind_of Array
117
+ expect(subject.search({ term: :foo_bar })[0]).to be_kind_of Contactually::Contact
118
+ end
119
+ end
120
+
121
+ describe '#count' do
122
+ it 'calls the api with correct params' do
123
+ allow(@master).to receive(:call).with('contacts.json', :get, { limit: 1 }).and_return({ 'data' => [], 'total_count' => 120 })
124
+ subject.count()
125
+ expect(@master).to have_received(:call)
126
+ end
127
+
128
+ it 'returns total count' do
129
+ allow(@master).to receive(:call).with('contacts.json', :get, { limit: 1 }).and_return({ 'data' => [], 'total_count' => 120 })
130
+ expect(subject.count).to be 120
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,80 @@
1
+ require 'spec_helper'
2
+
3
+ describe Contactually::Contents do
4
+
5
+ let(:content_json) { File.read(File.join(File.dirname(__FILE__),"fixtures/content.json")) }
6
+ let(:contents_index_json) { File.read(File.join(File.dirname(__FILE__),"fixtures/contents_index.json")) }
7
+
8
+ before(:all) do
9
+ Contactually.configure { |c| c.access_token = 'VALID_ACCESS_TOKEN' }
10
+ @master = Contactually::API.new
11
+ end
12
+
13
+ subject { described_class.new @master }
14
+ describe '#initialize' do
15
+ specify do
16
+ expect(subject).to be_kind_of Contactually::Contents
17
+ end
18
+
19
+ specify do
20
+ expect(subject.instance_variable_get(:@master)).to be_kind_of Contactually::API
21
+ end
22
+ end
23
+
24
+ describe '#create' do
25
+ it 'calls the api with correct params' do
26
+ allow(@master).to receive(:call).with('contents.json', :post, { content: { foo: :bar }}).and_return(JSON.load(content_json))
27
+ subject.create({ content: { foo: :bar }})
28
+ expect(@master).to have_received(:call)
29
+ end
30
+
31
+ it 'returns a content' do
32
+ allow(@master).to receive(:call).with('contents.json', :post, { content: { foo: :bar }}).and_return(JSON.load(content_json))
33
+ expect(subject.create({ content: { foo: :bar }})).to be_kind_of Contactually::Content
34
+ end
35
+ end
36
+
37
+ describe '#index' do
38
+ it 'calls the api with correct params' do
39
+ allow(@master).to receive(:call).with('contents.json', :get, { foo: :bar }).and_return({ 'data' => [] })
40
+ subject.index({ foo: :bar })
41
+ expect(@master).to have_received(:call)
42
+ end
43
+
44
+ it 'returns contents from json response' do
45
+ allow(@master).to receive(:call).with('contents.json', :get, {}).and_return(JSON.load(contents_index_json))
46
+ expect(subject.index({})).to be_kind_of Array
47
+ expect(subject.index({})[0]).to be_kind_of Contactually::Content
48
+ end
49
+ end
50
+
51
+ describe '#destroy' do
52
+ it 'calls the api with correct params' do
53
+ allow(@master).to receive(:call).with('contents/115.json', :delete, { foo: :bar }).and_return({ 'success' => true })
54
+ subject.destroy(115, { foo: :bar })
55
+ expect(@master).to have_received(:call)
56
+ end
57
+ end
58
+
59
+ describe '#show' do
60
+ it 'calls the api with correct params' do
61
+ allow(@master).to receive(:call).with('contents/1.json', :get, { foo: :bar }).and_return({ id: 1 })
62
+ subject.show(1, { foo: :bar })
63
+ expect(@master).to have_received(:call)
64
+ end
65
+
66
+ it 'returns a contact' do
67
+ allow(@master).to receive(:call).with('contents/1.json', :get, { foo: :bar }).and_return(JSON.load(content_json))
68
+ expect(subject.show(1, { foo: :bar })).to be_kind_of Contactually::Content
69
+ end
70
+ end
71
+
72
+ describe '#update' do
73
+ it 'calls the api with correct params' do
74
+ allow(@master).to receive(:call).with('contents/1.json', :put, { content: { foo: :bar }})
75
+ subject.update(1, { content: { foo: :bar } })
76
+ expect(@master).to have_received(:call)
77
+ end
78
+ end
79
+
80
+ end