intercom 3.5.10 → 4.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +35 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +5 -0
  4. data/Gemfile +1 -4
  5. data/README.md +418 -216
  6. data/RELEASING.md +9 -0
  7. data/Rakefile +1 -1
  8. data/changes.txt +141 -0
  9. data/intercom.gemspec +1 -2
  10. data/lib/intercom.rb +34 -19
  11. data/lib/intercom/api_operations/archive.rb +16 -0
  12. data/lib/intercom/api_operations/delete.rb +4 -1
  13. data/lib/intercom/api_operations/find.rb +5 -2
  14. data/lib/intercom/api_operations/find_all.rb +4 -3
  15. data/lib/intercom/api_operations/list.rb +4 -1
  16. data/lib/intercom/api_operations/load.rb +4 -2
  17. data/lib/intercom/api_operations/nested_resource.rb +70 -0
  18. data/lib/intercom/api_operations/request_hard_delete.rb +12 -0
  19. data/lib/intercom/api_operations/save.rb +6 -4
  20. data/lib/intercom/api_operations/scroll.rb +4 -5
  21. data/lib/intercom/api_operations/search.rb +18 -0
  22. data/lib/intercom/article.rb +7 -0
  23. data/lib/intercom/base_collection_proxy.rb +72 -0
  24. data/lib/intercom/client.rb +66 -18
  25. data/lib/intercom/client_collection_proxy.rb +17 -39
  26. data/lib/intercom/collection.rb +7 -0
  27. data/lib/intercom/company.rb +8 -0
  28. data/lib/intercom/contact.rb +22 -3
  29. data/lib/intercom/conversation.rb +5 -0
  30. data/lib/intercom/data_attribute.rb +7 -0
  31. data/lib/intercom/deprecated_leads_collection_proxy.rb +22 -0
  32. data/lib/intercom/deprecated_resources.rb +13 -0
  33. data/lib/intercom/errors.rb +44 -4
  34. data/lib/intercom/extended_api_operations/segments.rb +3 -1
  35. data/lib/intercom/extended_api_operations/tags.rb +3 -1
  36. data/lib/intercom/lead.rb +21 -0
  37. data/lib/intercom/lib/typed_json_deserializer.rb +42 -37
  38. data/lib/intercom/note.rb +4 -0
  39. data/lib/intercom/request.rb +162 -95
  40. data/lib/intercom/scroll_collection_proxy.rb +38 -42
  41. data/lib/intercom/search_collection_proxy.rb +47 -0
  42. data/lib/intercom/section.rb +23 -0
  43. data/lib/intercom/segment.rb +4 -0
  44. data/lib/intercom/service/article.rb +20 -0
  45. data/lib/intercom/service/base_service.rb +13 -0
  46. data/lib/intercom/service/collection.rb +24 -0
  47. data/lib/intercom/service/company.rb +4 -2
  48. data/lib/intercom/service/contact.rb +29 -6
  49. data/lib/intercom/service/conversation.rb +23 -2
  50. data/lib/intercom/service/data_attribute.rb +20 -0
  51. data/lib/intercom/service/event.rb +12 -0
  52. data/lib/intercom/service/lead.rb +41 -0
  53. data/lib/intercom/service/note.rb +4 -8
  54. data/lib/intercom/service/section.rb +7 -0
  55. data/lib/intercom/service/tag.rb +8 -8
  56. data/lib/intercom/service/team.rb +17 -0
  57. data/lib/intercom/service/user.rb +4 -2
  58. data/lib/intercom/service/visitor.rb +15 -6
  59. data/lib/intercom/tag.rb +4 -0
  60. data/lib/intercom/team.rb +7 -0
  61. data/lib/intercom/traits/api_resource.rb +48 -27
  62. data/lib/intercom/traits/dirty_tracking.rb +8 -1
  63. data/lib/intercom/user.rb +12 -3
  64. data/lib/intercom/utils.rb +13 -2
  65. data/lib/intercom/version.rb +1 -1
  66. data/lib/intercom/visitor.rb +0 -2
  67. data/spec/spec_helper.rb +881 -436
  68. data/spec/unit/intercom/admin_spec.rb +2 -2
  69. data/spec/unit/intercom/article_spec.rb +40 -0
  70. data/spec/unit/intercom/base_collection_proxy_spec.rb +30 -0
  71. data/spec/unit/intercom/client_collection_proxy_spec.rb +41 -41
  72. data/spec/unit/intercom/client_spec.rb +76 -9
  73. data/spec/unit/intercom/collection_spec.rb +32 -0
  74. data/spec/unit/intercom/company_spec.rb +29 -21
  75. data/spec/unit/intercom/contact_spec.rb +365 -29
  76. data/spec/unit/intercom/conversation_spec.rb +70 -7
  77. data/spec/unit/intercom/count_spec.rb +4 -4
  78. data/spec/unit/intercom/data_attribute_spec.rb +40 -0
  79. data/spec/unit/intercom/deprecated_leads_collection_proxy_spec.rb +17 -0
  80. data/spec/unit/intercom/event_spec.rb +25 -8
  81. data/spec/unit/intercom/job_spec.rb +24 -24
  82. data/spec/unit/intercom/lead_spec.rb +57 -0
  83. data/spec/unit/intercom/lib/flat_store_spec.rb +22 -20
  84. data/spec/unit/intercom/message_spec.rb +1 -1
  85. data/spec/unit/intercom/note_spec.rb +4 -10
  86. data/spec/unit/intercom/request_spec.rb +150 -9
  87. data/spec/unit/intercom/scroll_collection_proxy_spec.rb +40 -39
  88. data/spec/unit/intercom/search_collection_proxy_spec.rb +60 -0
  89. data/spec/unit/intercom/section_spec.rb +32 -0
  90. data/spec/unit/intercom/segment_spec.rb +2 -2
  91. data/spec/unit/intercom/subscription_spec.rb +5 -6
  92. data/spec/unit/intercom/tag_spec.rb +22 -14
  93. data/spec/unit/intercom/team_spec.rb +21 -0
  94. data/spec/unit/intercom/traits/api_resource_spec.rb +129 -47
  95. data/spec/unit/intercom/user_spec.rb +227 -217
  96. data/spec/unit/intercom/visitor_spec.rb +49 -0
  97. data/spec/unit/intercom_spec.rb +5 -3
  98. metadata +63 -26
  99. data/.travis.yml +0 -6
  100. data/lib/intercom/extended_api_operations/users.rb +0 -16
  101. data/spec/unit/intercom/visitors_spec.rb +0 -61
@@ -0,0 +1,21 @@
1
+ require "spec_helper"
2
+
3
+ describe "Intercom::Team" do
4
+ let(:client) { Intercom::Client.new(token: 'token') }
5
+
6
+ it "returns a CollectionProxy for all without making any requests" do
7
+ client.expects(:execute_request).never
8
+ all = client.teams.all
9
+ _(all).must_be_instance_of(Intercom::ClientCollectionProxy)
10
+ end
11
+
12
+ it 'gets an team list' do
13
+ client.expects(:get).with("/teams", {}).returns(test_team_list)
14
+ client.teams.all.each { |t| }
15
+ end
16
+
17
+ it "gets an team" do
18
+ client.expects(:get).with("/teams/1234", {}).returns(test_team)
19
+ client.teams.find(:id => "1234")
20
+ end
21
+ end
@@ -1,93 +1,175 @@
1
- require "spec_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
2
4
 
3
5
  describe Intercom::Traits::ApiResource do
4
6
  let(:object_json) do
5
- {"type"=>"company",
6
- "id"=>"aaaaaaaaaaaaaaaaaaaaaaaa",
7
- "app_id"=>"some-app-id",
8
- "name"=>"SuperSuite",
9
- "plan_id"=>1,
10
- "remote_company_id"=>"8",
11
- "remote_created_at"=>103201,
12
- "created_at"=>1374056196,
13
- "user_count"=>1,
14
- "custom_attributes"=>{},
15
- "metadata"=>{
16
- "type"=>"user",
17
- "color"=>"cyan"
18
- }}
19
- end
20
- let(:api_resource) { DummyClass.new.extend(Intercom::Traits::ApiResource)}
21
-
22
- before(:each) { api_resource.from_response(object_json) }
7
+ { 'type' => 'company',
8
+ 'id' => 'aaaaaaaaaaaaaaaaaaaaaaaa',
9
+ 'app_id' => 'some-app-id',
10
+ 'name' => 'SuperSuite',
11
+ 'plan_id' => 1,
12
+ 'remote_company_id' => '8',
13
+ 'remote_created_at' => 103_201,
14
+ 'created_at' => 1_374_056_196,
15
+ 'user_count' => 1,
16
+ 'custom_attributes' => {},
17
+ 'metadata' => {
18
+ 'type' => 'user',
19
+ 'color' => 'cyan'
20
+ },
21
+ 'nested_fields' => {
22
+ 'type' => 'nested_fields_content',
23
+ 'field_1' => {
24
+ 'type' => 'field_content',
25
+ 'name' => 'Nested Field'
26
+ }
27
+ }
28
+ }
29
+ end
23
30
 
24
- it "does not set type on parsing json" do
25
- api_resource.wont_respond_to :type
31
+ let(:object_hash) do
32
+ {
33
+ type: 'company',
34
+ id: 'aaaaaaaaaaaaaaaaaaaaaaaa',
35
+ app_id: 'some-app-id',
36
+ name: 'SuperSuite',
37
+ plan_id: 1,
38
+ remote_company_id: '8',
39
+ remote_created_at: 103_201,
40
+ created_at: 1_374_056_196,
41
+ user_count: 1,
42
+ custom_attributes: { type: 'ping' },
43
+ metadata: {
44
+ type: 'user',
45
+ color: 'cyan'
46
+ },
47
+ nested_fields: {
48
+ type: 'nested_fields_content',
49
+ field_1: {
50
+ type: 'field_content',
51
+ name: 'Nested Field'
52
+ }
53
+ }
54
+ }
26
55
  end
27
56
 
28
- it "coerces time on parsing json" do
29
- assert_equal Time.at(1374056196), api_resource.created_at
57
+ let(:api_resource) { DummyClass.new.extend(Intercom::Traits::ApiResource) }
58
+
59
+ before(:each) { api_resource.from_response(object_json) }
60
+
61
+ it 'coerces time on parsing json' do
62
+ assert_equal Time.at(1_374_056_196), api_resource.created_at
30
63
  end
31
64
 
32
- it "exposes string" do
33
- assert_equal Time.at(1374056196), api_resource.created_at
65
+ it 'exposes string' do
66
+ assert_equal Time.at(1_374_056_196), api_resource.created_at
34
67
  end
35
68
 
36
69
  it "treats 'metadata' as a plain hash, not a typed object" do
37
70
  assert_equal Hash, api_resource.metadata.class
38
71
  end
39
72
 
40
- it "dynamically defines accessors when a non-existent property is called that looks like a setter" do
41
- api_resource.wont_respond_to :spiders
73
+ it 'dynamically defines accessors when a non-existent property is called that looks like a setter' do
74
+ _(api_resource).wont_respond_to :spiders
42
75
  api_resource.spiders = 4
43
- api_resource.must_respond_to :spiders
76
+ _(api_resource).must_respond_to :spiders
44
77
  end
45
78
 
46
- it "calls dynamically defined getter when asked" do
79
+ it 'calls dynamically defined getter when asked' do
47
80
  api_resource.foo = 4
48
81
  assert_equal 4, api_resource.foo
49
82
  end
50
83
 
51
- it "accepts unix timestamps into dynamically defined date setters" do
52
- api_resource.foo_at = 1401200468
53
- assert_equal 1401200468, api_resource.instance_variable_get(:@foo_at)
84
+ it 'accepts unix timestamps into dynamically defined date setters' do
85
+ api_resource.foo_at = 1_401_200_468
86
+ assert_equal 1_401_200_468, api_resource.instance_variable_get(:@foo_at)
54
87
  end
55
88
 
56
- it "exposes dates correctly for dynamically defined getters" do
57
- api_resource.foo_at = 1401200468
58
- assert_equal Time.at(1401200468), api_resource.foo_at
89
+ it 'exposes dates correctly for dynamically defined getters' do
90
+ api_resource.foo_at = 1_401_200_468
91
+ assert_equal Time.at(1_401_200_468), api_resource.foo_at
59
92
  end
60
93
 
61
- it "throws regular method missing error when non-existent getter is called that is backed by an instance variable" do
94
+ it 'throws regular method missing error when non-existent getter is called that is backed by an instance variable' do
62
95
  api_resource.instance_variable_set(:@bar, 'you cant see me')
63
- proc { api_resource.bar }.must_raise NoMethodError
96
+ _(proc { api_resource.bar }).must_raise NoMethodError
64
97
  end
65
98
 
66
- it "throws attribute not set error when non-existent getter is called that is not backed by an instance variable" do
67
- proc { api_resource.flubber }.must_raise Intercom::AttributeNotSetError
99
+ it 'throws attribute not set error when non-existent getter is called that is not backed by an instance variable' do
100
+ _(proc { api_resource.flubber }).must_raise Intercom::AttributeNotSetError
68
101
  end
69
102
 
70
- it "throws regular method missing error when non-existent method is called that cannot be an accessor" do
71
- proc { api_resource.flubber! }.must_raise NoMethodError
72
- proc { api_resource.flubber? }.must_raise NoMethodError
103
+ it 'throws regular method missing error when non-existent method is called that cannot be an accessor' do
104
+ _(proc { api_resource.flubber! }).must_raise NoMethodError
105
+ _(proc { api_resource.flubber? }).must_raise NoMethodError
73
106
  end
74
107
 
75
- it "throws regular method missing error when non-existent setter is called with multiple arguments" do
76
- proc { api_resource.send(:flubber=, 'a', 'b') }.must_raise NoMethodError
108
+ it 'throws regular method missing error when non-existent setter is called with multiple arguments' do
109
+ _(proc { api_resource.send(:flubber=, 'a', 'b') }).must_raise NoMethodError
77
110
  end
78
111
 
79
- it "an initialized ApiResource is equal to on generated from a response" do
112
+ it 'an initialized ApiResource is equal to one generated from a response' do
80
113
  class ConcreteApiResource; include Intercom::Traits::ApiResource; end
81
114
  initialized_api_resource = ConcreteApiResource.new(object_json)
82
115
  except(object_json, 'type').keys.each do |attribute|
83
116
  assert_equal initialized_api_resource.send(attribute), api_resource.send(attribute)
84
117
  end
85
118
  end
86
-
119
+
120
+ it 'initialized ApiResource using hash is equal to one generated from response' do
121
+ class ConcreteApiResource; include Intercom::Traits::ApiResource; end
122
+
123
+ api_resource.from_hash(object_hash)
124
+ initialized_api_resource = ConcreteApiResource.new(object_hash)
125
+ except(object_json, 'type').keys.each do |attribute|
126
+ assert_equal initialized_api_resource.send(attribute), api_resource.send(attribute)
127
+ end
128
+ end
129
+
130
+ describe 'correctly equates two resources' do
131
+ class DummyResource; include Intercom::Traits::ApiResource; end
132
+
133
+ specify 'if each resource has the same class and same value' do
134
+ api_resource1 = DummyResource.new(object_json)
135
+ api_resource2 = DummyResource.new(object_json)
136
+ assert_equal (api_resource1 == api_resource2), true
137
+ end
138
+
139
+ specify 'if each resource has the same class and different value' do
140
+ object2_json = object_json.merge('id' => 'bbbbbb')
141
+ api_resource1 = DummyResource.new(object_json)
142
+ api_resource2 = DummyResource.new(object2_json)
143
+ assert_equal (api_resource1 == api_resource2), false
144
+ end
145
+
146
+ specify 'if each resource has a different class' do
147
+ dummy_resource = DummyResource.new(object_json)
148
+ assert_equal (dummy_resource == api_resource), false
149
+ end
150
+ end
151
+
152
+ it 'correctly generates submittable hash when no updates' do
153
+ assert_equal api_resource.to_submittable_hash, {}
154
+ end
155
+
156
+ it 'correctly generates submittable hash when there are updates' do
157
+ api_resource.name = 'SuperSuite updated'
158
+ api_resource.nested_fields.field_1.name = 'Updated Name'
159
+ assert_equal api_resource.to_submittable_hash, {
160
+ 'name' => 'SuperSuite updated',
161
+ 'nested_fields' => {
162
+ 'field_1' => {
163
+ 'name' => 'Updated Name'
164
+ }
165
+ }
166
+ }
167
+ end
168
+
87
169
  def except(h, *keys)
88
170
  keys.each { |key| h.delete(key) }
89
171
  h
90
172
  end
91
-
173
+
92
174
  class DummyClass; end
93
175
  end
@@ -1,271 +1,284 @@
1
- require "spec_helper"
1
+ # frozen_string_literal: true
2
2
 
3
- describe "Intercom::User" do
4
- let (:client) { Intercom::Client.new(app_id: 'app_id', api_key: 'api_key') }
3
+ require 'spec_helper'
4
+
5
+ describe 'Intercom::User' do
6
+ let (:client) { Intercom::Client.new(token: 'token') }
5
7
 
6
8
  it "to_hash'es itself" do
7
9
  created_at = Time.now
8
- user = Intercom::User.new(:email => "jim@example.com", :user_id => "12345", :created_at => created_at, :name => "Jim Bob")
10
+ user = Intercom::User.new(email: 'jim@example.com', user_id: '12345', created_at: created_at, name: 'Jim Bob')
9
11
  as_hash = user.to_hash
10
- as_hash["email"].must_equal "jim@example.com"
11
- as_hash["user_id"].must_equal "12345"
12
- as_hash["created_at"].must_equal created_at.to_i
13
- as_hash["name"].must_equal "Jim Bob"
12
+ _(as_hash['email']).must_equal 'jim@example.com'
13
+ _(as_hash['user_id']).must_equal '12345'
14
+ _(as_hash['created_at']).must_equal created_at.to_i
15
+ _(as_hash['name']).must_equal 'Jim Bob'
14
16
  end
15
17
 
16
- it "presents created_at and last_impression_at as Date" do
18
+ it 'presents created_at and last_impression_at as Date' do
17
19
  now = Time.now
18
- user = Intercom::User.from_api(:created_at => now, :last_impression_at => now)
19
- user.created_at.must_be_kind_of Time
20
- user.created_at.to_s.must_equal now.to_s
21
- user.last_impression_at.must_be_kind_of Time
22
- user.last_impression_at.to_s.must_equal now.to_s
20
+ user = Intercom::User.from_api(created_at: now, last_impression_at: now)
21
+ _(user.created_at).must_be_kind_of Time
22
+ _(user.created_at.to_s).must_equal now.to_s
23
+ _(user.last_impression_at).must_be_kind_of Time
24
+ _(user.last_impression_at.to_s).must_equal now.to_s
23
25
  end
24
26
 
25
- it "is throws a Intercom::AttributeNotSetError on trying to access an attribute that has not been set" do
27
+ it 'is throws a Intercom::AttributeNotSetError on trying to access an attribute that has not been set' do
26
28
  user = Intercom::User.new
27
- proc { user.foo_property }.must_raise Intercom::AttributeNotSetError
29
+ _(proc { user.foo_property }).must_raise Intercom::AttributeNotSetError
28
30
  end
29
31
 
30
- it "presents a complete user record correctly" do
32
+ it 'presents a complete user record correctly' do
31
33
  user = Intercom::User.from_api(test_user)
32
- user.user_id.must_equal 'id-from-customers-app'
33
- user.email.must_equal 'bob@example.com'
34
- user.name.must_equal 'Joe Schmoe'
35
- user.app_id.must_equal 'the-app-id'
36
- user.session_count.must_equal 123
37
- user.created_at.to_i.must_equal 1401970114
38
- user.remote_created_at.to_i.must_equal 1393613864
39
- user.updated_at.to_i.must_equal 1401970114
40
-
41
- user.avatar.must_be_kind_of Intercom::Avatar
42
- user.avatar.image_url.must_equal 'https://graph.facebook.com/1/picture?width=24&height=24'
43
-
44
- user.companies.must_be_kind_of Array
45
- user.companies.size.must_equal 1
46
- user.companies[0].must_be_kind_of Intercom::Company
47
- user.companies[0].company_id.must_equal "123"
48
- user.companies[0].id.must_equal "bbbbbbbbbbbbbbbbbbbbbbbb"
49
- user.companies[0].app_id.must_equal "the-app-id"
50
- user.companies[0].name.must_equal "Company 1"
51
- user.companies[0].remote_created_at.to_i.must_equal 1390936440
52
- user.companies[0].created_at.to_i.must_equal 1401970114
53
- user.companies[0].updated_at.to_i.must_equal 1401970114
54
- user.companies[0].last_request_at.to_i.must_equal 1401970113
55
- user.companies[0].monthly_spend.must_equal 0
56
- user.companies[0].session_count.must_equal 0
57
- user.companies[0].user_count.must_equal 1
58
- user.companies[0].tag_ids.must_equal []
59
-
60
- user.custom_attributes.must_be_kind_of Intercom::Lib::FlatStore
61
- user.custom_attributes["a"].must_equal "b"
62
- user.custom_attributes["b"].must_equal 2
63
-
64
- user.social_profiles.size.must_equal 4
34
+ _(user.user_id).must_equal 'id-from-customers-app'
35
+ _(user.email).must_equal 'bob@example.com'
36
+ _(user.name).must_equal 'Joe Schmoe'
37
+ _(user.app_id).must_equal 'the-app-id'
38
+ _(user.session_count).must_equal 123
39
+ _(user.created_at.to_i).must_equal 1_401_970_114
40
+ _(user.remote_created_at.to_i).must_equal 1_393_613_864
41
+ _(user.updated_at.to_i).must_equal 1_401_970_114
42
+
43
+ _(user.avatar).must_be_kind_of Intercom::Avatar
44
+ _(user.avatar.image_url).must_equal 'https://graph.facebook.com/1/picture?width=24&height=24'
45
+
46
+ _(user.companies).must_be_kind_of Array
47
+ _(user.companies.size).must_equal 1
48
+ _(user.companies[0]).must_be_kind_of Intercom::Company
49
+ _(user.companies[0].company_id).must_equal '123'
50
+ _(user.companies[0].id).must_equal 'bbbbbbbbbbbbbbbbbbbbbbbb'
51
+ _(user.companies[0].app_id).must_equal 'the-app-id'
52
+ _(user.companies[0].name).must_equal 'Company 1'
53
+ _(user.companies[0].remote_created_at.to_i).must_equal 1_390_936_440
54
+ _(user.companies[0].created_at.to_i).must_equal 1_401_970_114
55
+ _(user.companies[0].updated_at.to_i).must_equal 1_401_970_114
56
+ _(user.companies[0].last_request_at.to_i).must_equal 1_401_970_113
57
+ _(user.companies[0].monthly_spend).must_equal 0
58
+ _(user.companies[0].session_count).must_equal 0
59
+ _(user.companies[0].user_count).must_equal 1
60
+ _(user.companies[0].tag_ids).must_equal []
61
+
62
+ _(user.custom_attributes).must_be_kind_of Intercom::Lib::FlatStore
63
+ _(user.custom_attributes['a']).must_equal 'b'
64
+ _(user.custom_attributes['b']).must_equal 2
65
+
66
+ _(user.social_profiles.size).must_equal 4
65
67
  twitter_account = user.social_profiles.first
66
- twitter_account.must_be_kind_of Intercom::SocialProfile
67
- twitter_account.name.must_equal "twitter"
68
- twitter_account.username.must_equal "abc"
69
- twitter_account.url.must_equal "http://twitter.com/abc"
70
-
71
- user.location_data.must_be_kind_of Intercom::LocationData
72
- user.location_data.city_name.must_equal "Dublin"
73
- user.location_data.continent_code.must_equal "EU"
74
- user.location_data.country_name.must_equal "Ireland"
75
- user.location_data.latitude.must_equal "90"
76
- user.location_data.longitude.must_equal "10"
77
- user.location_data.country_code.must_equal "IRL"
78
-
79
- user.unsubscribed_from_emails.must_equal true
80
- user.user_agent_data.must_equal "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
68
+ _(twitter_account).must_be_kind_of Intercom::SocialProfile
69
+ _(twitter_account.name).must_equal 'twitter'
70
+ _(twitter_account.username).must_equal 'abc'
71
+ _(twitter_account.url).must_equal 'http://twitter.com/abc'
72
+
73
+ _(user.location_data).must_be_kind_of Intercom::LocationData
74
+ _(user.location_data.city_name).must_equal 'Dublin'
75
+ _(user.location_data.continent_code).must_equal 'EU'
76
+ _(user.location_data.country_name).must_equal 'Ireland'
77
+ _(user.location_data.latitude).must_equal '90'
78
+ _(user.location_data.longitude).must_equal '10'
79
+ _(user.location_data.country_code).must_equal 'IRL'
80
+
81
+ _(user.unsubscribed_from_emails).must_equal true
82
+ _(user.user_agent_data).must_equal 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'
81
83
  end
82
84
 
83
85
  it 'allows update_last_request_at' do
84
- client.expects(:post).with("/users", {"user_id" => "1224242", 'update_last_request_at' => true, "custom_attributes" => {}}).returns({"user_id" => "i-1224242", "last_request_at" => 1414509439})
85
- client.users.create(user_id: '1224242', update_last_request_at: true)
86
+ client.expects(:post).with('/users', 'user_id' => '1224242', 'update_last_request_at' => true, 'custom_attributes' => {}).returns('user_id' => 'i-1224242', 'last_request_at' => 1_414_509_439)
87
+ client.deprecated__users.create(user_id: '1224242', update_last_request_at: true)
86
88
  end
87
89
 
88
- it "allows easy setting of custom data" do
90
+ it 'allows easy setting of custom data' do
89
91
  now = Time.now
90
92
  user = Intercom::User.new
91
- user.custom_attributes["mad"] = 123
92
- user.custom_attributes["other"] = now.to_i
93
- user.custom_attributes["thing"] = "yay"
94
- user.to_hash["custom_attributes"].must_equal "mad" => 123, "other" => now.to_i, "thing" => "yay"
93
+ user.custom_attributes['mad'] = 123
94
+ user.custom_attributes['other'] = now.to_i
95
+ user.custom_attributes['thing'] = 'yay'
96
+ _(user.to_hash['custom_attributes']).must_equal 'mad' => 123, 'other' => now.to_i, 'thing' => 'yay'
95
97
  end
96
98
 
97
- it "allows easy setting of multiple companies" do
98
- user = Intercom::User.new()
99
+ it 'allows easy setting of multiple companies' do
100
+ user = Intercom::User.new
99
101
  companies = [
100
- {"name" => "Intercom", "company_id" => "6"},
101
- {"name" => "Test", "company_id" => "9"}
102
+ { 'name' => 'Intercom', 'company_id' => '6' },
103
+ { 'name' => 'Test', 'company_id' => '9' }
102
104
  ]
103
105
  user.companies = companies
104
- user.to_hash["companies"].must_equal companies
106
+ _(user.to_hash['companies']).must_equal companies
105
107
  end
106
108
 
107
- it "rejects nested data structures in custom_attributes" do
108
- user = Intercom::User.new()
109
+ it 'rejects nested data structures in custom_attributes' do
110
+ user = Intercom::User.new
109
111
 
110
- proc { user.custom_attributes["thing"] = [1] }.must_raise(ArgumentError)
111
- proc { user.custom_attributes["thing"] = {1 => 2} }.must_raise(ArgumentError)
112
- proc { user.custom_attributes["thing"] = {1 => {2 => 3}} }.must_raise(ArgumentError)
112
+ _(proc { user.custom_attributes['thing'] = [1] }).must_raise(ArgumentError)
113
+ _(proc { user.custom_attributes['thing'] = { 1 => 2 } }).must_raise(ArgumentError)
114
+ _(proc { user.custom_attributes['thing'] = { 1 => { 2 => 3 } } }).must_raise(ArgumentError)
113
115
 
114
116
  user = Intercom::User.from_api(test_user)
115
- proc { user.custom_attributes["thing"] = [1] }.must_raise(ArgumentError)
117
+ _(proc { user.custom_attributes['thing'] = [1] }).must_raise(ArgumentError)
116
118
  end
117
119
 
118
- describe "incrementing custom_attributes fields" do
120
+ describe 'incrementing custom_attributes fields' do
119
121
  before :each do
120
122
  @now = Time.now
121
- @user = Intercom::User.new("email" => "jo@example.com", :user_id => "i-1224242", :custom_attributes => {"mad" => 123, "another" => 432, "other" => @now.to_i, :thing => "yay"})
123
+ @user = Intercom::User.new('email' => 'jo@example.com', :user_id => 'i-1224242', :custom_attributes => { 'mad' => 123, 'another' => 432, 'other' => @now.to_i, :thing => 'yay' })
122
124
  end
123
125
 
124
- it "increments up by 1 with no args" do
125
- @user.increment("mad")
126
- @user.to_hash["custom_attributes"]["mad"].must_equal 124
126
+ it 'increments up by 1 with no args' do
127
+ @user.increment('mad')
128
+ _(@user.to_hash['custom_attributes']['mad']).must_equal 124
127
129
  end
128
130
 
129
- it "increments up by given value" do
130
- @user.increment("mad", 4)
131
- @user.to_hash["custom_attributes"]["mad"].must_equal 127
131
+ it 'increments up by given value' do
132
+ @user.increment('mad', 4)
133
+ _(@user.to_hash['custom_attributes']['mad']).must_equal 127
132
134
  end
133
135
 
134
- it "increments down by given value" do
135
- @user.increment("mad", -1)
136
- @user.to_hash["custom_attributes"]["mad"].must_equal 122
136
+ it 'increments down by given value' do
137
+ @user.increment('mad', -1)
138
+ _(@user.to_hash['custom_attributes']['mad']).must_equal 122
137
139
  end
138
140
 
139
- it "can increment new custom data fields" do
140
- @user.increment("new_field", 3)
141
- @user.to_hash["custom_attributes"]["new_field"].must_equal 3
141
+ it 'can increment new custom data fields' do
142
+ @user.increment('new_field', 3)
143
+ _(@user.to_hash['custom_attributes']['new_field']).must_equal 3
142
144
  end
143
145
 
144
- it "can call increment on the same key twice and increment by 2" do
145
- @user.increment("mad")
146
- @user.increment("mad")
147
- @user.to_hash["custom_attributes"]["mad"].must_equal 125
146
+ it 'can call increment on the same key twice and increment by 2' do
147
+ @user.increment('mad')
148
+ @user.increment('mad')
149
+ _(@user.to_hash['custom_attributes']['mad']).must_equal 125
148
150
  end
149
151
  end
150
152
 
151
- describe "decrementing custom_attributes fields" do
153
+ describe 'decrementing custom_attributes fields' do
152
154
  before :each do
153
155
  @now = Time.now
154
- @user = Intercom::User.new("email" => "jo@example.com", :user_id => "i-1224242", :custom_attributes => {"mad" => 123, "another" => 432, "other" => @now.to_i, :thing => "yay"})
156
+ @user = Intercom::User.new('email' => 'jo@example.com', :user_id => 'i-1224242', :custom_attributes => { 'mad' => 123, 'another' => 432, 'other' => @now.to_i, :thing => 'yay' })
155
157
  end
156
158
 
157
- it "decrements down by 1 with no args" do
158
- @user.decrement("mad")
159
- @user.to_hash["custom_attributes"]["mad"].must_equal 122
159
+ it 'decrements down by 1 with no args' do
160
+ @user.decrement('mad')
161
+ _(@user.to_hash['custom_attributes']['mad']).must_equal 122
160
162
  end
161
163
 
162
- it "decrements down by given value" do
163
- @user.decrement("mad", 3)
164
- @user.to_hash["custom_attributes"]["mad"].must_equal 120
164
+ it 'decrements down by given value' do
165
+ @user.decrement('mad', 3)
166
+ _(@user.to_hash['custom_attributes']['mad']).must_equal 120
165
167
  end
166
168
 
167
- it "can decrement new custom data fields" do
168
- @user.decrement("new_field", 5)
169
- @user.to_hash["custom_attributes"]["new_field"].must_equal -5
169
+ it 'can decrement new custom data fields' do
170
+ @user.decrement('new_field', 5)
171
+ _(@user.to_hash['custom_attributes']['new_field']).must_equal(-5)
170
172
  end
171
173
 
172
- it "can call decrement on the same key twice and decrement by 2" do
173
- @user.decrement("mad")
174
- @user.decrement("mad")
175
- @user.to_hash["custom_attributes"]["mad"].must_equal 121
174
+ it 'can call decrement on the same key twice and decrement by 2' do
175
+ @user.decrement('mad')
176
+ @user.decrement('mad')
177
+ _(@user.to_hash['custom_attributes']['mad']).must_equal 121
176
178
  end
177
179
  end
178
180
 
179
- it "fetches a user" do
180
- client.expects(:get).with("/users", {"email" => "bo@example.com"}).returns(test_user)
181
- user = client.users.find("email" => "bo@example.com")
182
- user.email.must_equal "bob@example.com"
183
- user.name.must_equal "Joe Schmoe"
184
- user.session_count.must_equal 123
181
+ it 'fetches a user' do
182
+ client.expects(:get).with('/users', 'email' => 'bo@example.com').returns(test_user)
183
+ user = client.deprecated__users.find('email' => 'bo@example.com')
184
+ _(user.email).must_equal 'bob@example.com'
185
+ _(user.name).must_equal 'Joe Schmoe'
186
+ _(user.session_count).must_equal 123
185
187
  end
186
188
 
187
189
  it 'gets users by tag' do
188
- client.expects(:get).with("/users?tag_id=124", {}).returns(page_of_users(false))
189
- client.users.by_tag(124).each { |t| }
190
+ client.expects(:get).with('/users?tag_id=124', {}).returns(page_of_users(false))
191
+ client.deprecated__users.by_tag(124).each { |t| }
190
192
  end
191
193
 
192
194
  it 'gets users by segment' do
193
- client.expects(:get).with("/users?segment_id=124", {}).returns(page_of_users(false))
194
- client.users.by_segment(124).each { |t| }
195
+ client.expects(:get).with('/users?segment_id=124', {}).returns(page_of_users(false))
196
+ client.deprecated__users.by_segment(124).each { |t| }
195
197
  end
196
198
 
197
- it "saves a user (always sends custom_attributes)" do
198
- user = Intercom::User.new("email" => "jo@example.com", :user_id => "i-1224242")
199
- client.expects(:post).with("/users", {"email" => "jo@example.com", "user_id" => "i-1224242", "custom_attributes" => {}}).returns({"email" => "jo@example.com", "user_id" => "i-1224242"})
200
- client.users.save(user)
199
+ it 'saves a user (always sends custom_attributes)' do
200
+ user = Intercom::User.new('email' => 'jo@example.com', :user_id => 'i-1224242')
201
+ client.expects(:post).with('/users', 'email' => 'jo@example.com', 'user_id' => 'i-1224242', 'custom_attributes' => {}).returns('email' => 'jo@example.com', 'user_id' => 'i-1224242')
202
+ client.deprecated__users.save(user)
201
203
  end
202
204
 
203
- it "saves a user with a company" do
204
- user = Intercom::User.new("email" => "jo@example.com", :user_id => "i-1224242", :company => {'company_id' => 6, 'name' => "Intercom"})
205
- client.expects(:post).with("/users", {'custom_attributes' => {}, "user_id" => "i-1224242", "email" => "jo@example.com", "company" => {"company_id" => 6, "name" => "Intercom"}}).returns({"email" => "jo@example.com", "user_id" => "i-1224242"})
206
- client.users.save(user)
205
+ it 'saves a user with a company' do
206
+ user = Intercom::User.new('email' => 'jo@example.com', :user_id => 'i-1224242', :company => { 'company_id' => 6, 'name' => 'Intercom' })
207
+ client.expects(:post).with('/users', 'custom_attributes' => {}, 'user_id' => 'i-1224242', 'email' => 'jo@example.com', 'company' => { 'company_id' => 6, 'name' => 'Intercom' }).returns('email' => 'jo@example.com', 'user_id' => 'i-1224242')
208
+ client.deprecated__users.save(user)
207
209
  end
208
210
 
209
- it "saves a user with a companies" do
210
- user = Intercom::User.new("email" => "jo@example.com", :user_id => "i-1224242", :companies => [{'company_id' => 6, 'name' => "Intercom"}])
211
- client.expects(:post).with("/users", {'custom_attributes' => {}, "email" => "jo@example.com", "user_id" => "i-1224242", "companies" => [{"company_id" => 6, "name" => "Intercom"}]}).returns({"email" => "jo@example.com", "user_id" => "i-1224242"})
212
- client.users.save(user)
211
+ it 'saves a user with a companies' do
212
+ user = Intercom::User.new('email' => 'jo@example.com', :user_id => 'i-1224242', :companies => [{ 'company_id' => 6, 'name' => 'Intercom' }])
213
+ client.expects(:post).with('/users', 'custom_attributes' => {}, 'email' => 'jo@example.com', 'user_id' => 'i-1224242', 'companies' => [{ 'company_id' => 6, 'name' => 'Intercom' }]).returns('email' => 'jo@example.com', 'user_id' => 'i-1224242')
214
+ client.deprecated__users.save(user)
213
215
  end
214
216
 
215
217
  it 'can save a user with a nil email' do
216
- user = Intercom::User.new("email" => nil, :user_id => "i-1224242", :companies => [{'company_id' => 6, 'name' => "Intercom"}])
217
- client.expects(:post).with("/users", {'custom_attributes' => {}, "email" => nil, "user_id" => "i-1224242", "companies" => [{"company_id" => 6, "name" => "Intercom"}]}).returns({"email" => nil, "user_id" => "i-1224242"})
218
- client.users.save(user)
218
+ user = Intercom::User.new('email' => nil, :user_id => 'i-1224242', :companies => [{ 'company_id' => 6, 'name' => 'Intercom' }])
219
+ client.expects(:post).with('/users', 'custom_attributes' => {}, 'email' => nil, 'user_id' => 'i-1224242', 'companies' => [{ 'company_id' => 6, 'name' => 'Intercom' }]).returns('email' => nil, 'user_id' => 'i-1224242')
220
+ client.deprecated__users.save(user)
221
+ end
222
+
223
+ it 'archives a user' do
224
+ user = Intercom::User.new('id' => '1')
225
+ client.expects(:delete).with('/users/1', {}).returns(user)
226
+ client.deprecated__users.archive(user)
227
+ end
228
+ it 'has an alias to archive a user' do
229
+ user = Intercom::User.new('id' => '1')
230
+ client.expects(:delete).with('/users/1', {}).returns(user)
231
+ client.deprecated__users.delete(user)
219
232
  end
220
233
 
221
- it "deletes a user" do
222
- user = Intercom::User.new("id" => "1")
223
- client.expects(:delete).with("/users/1", {}).returns(user)
224
- client.users.delete(user)
234
+ it 'sends a request for a hard deletion' do
235
+ user = Intercom::User.new('id' => '1')
236
+ client.expects(:post).with('/user_delete_requests', intercom_user_id: '1').returns(id: user.id)
237
+ client.deprecated__users.request_hard_delete(user)
225
238
  end
226
239
 
227
- it "can use client.users.create for convenience" do
228
- client.expects(:post).with("/users", {'custom_attributes' => {}, "email" => "jo@example.com", "user_id" => "i-1224242"}).returns({"email" => "jo@example.com", "user_id" => "i-1224242"})
229
- user = client.users.create("email" => "jo@example.com", :user_id => "i-1224242")
230
- user.email.must_equal "jo@example.com"
240
+ it 'can use client.users.create for convenience' do
241
+ client.expects(:post).with('/users', 'custom_attributes' => {}, 'email' => 'jo@example.com', 'user_id' => 'i-1224242').returns('email' => 'jo@example.com', 'user_id' => 'i-1224242')
242
+ user = client.deprecated__users.create('email' => 'jo@example.com', :user_id => 'i-1224242')
243
+ _(user.email).must_equal 'jo@example.com'
231
244
  end
232
245
 
233
- it "updates the user with attributes as set by the server" do
234
- client.expects(:post).with("/users", {"email" => "jo@example.com", "user_id" => "i-1224242", 'custom_attributes' => {}}).returns({"email" => "jo@example.com", "user_id" => "i-1224242", "session_count" => 4})
235
- user = client.users.create("email" => "jo@example.com", :user_id => "i-1224242")
236
- user.session_count.must_equal 4
246
+ it 'updates the user with attributes as set by the server' do
247
+ client.expects(:post).with('/users', 'email' => 'jo@example.com', 'user_id' => 'i-1224242', 'custom_attributes' => {}).returns('email' => 'jo@example.com', 'user_id' => 'i-1224242', 'session_count' => 4)
248
+ user = client.deprecated__users.create('email' => 'jo@example.com', :user_id => 'i-1224242')
249
+ _(user.session_count).must_equal 4
237
250
  end
238
251
 
239
- it "allows setting dates to nil without converting them to 0" do
240
- client.expects(:post).with("/users", {"email" => "jo@example.com", 'custom_attributes' => {}, "remote_created_at" => nil}).returns({"email" => "jo@example.com"})
241
- user = client.users.create("email" => "jo@example.com", "remote_created_at" => nil)
242
- user.remote_created_at.must_equal nil
252
+ it 'allows setting dates to nil without converting them to 0' do
253
+ client.expects(:post).with('/users', 'email' => 'jo@example.com', 'custom_attributes' => {}, 'remote_created_at' => nil).returns('email' => 'jo@example.com')
254
+ user = client.deprecated__users.create('email' => 'jo@example.com', 'remote_created_at' => nil)
255
+ assert_nil user.remote_created_at
243
256
  end
244
257
 
245
- it "sets/gets rw keys" do
246
- params = {"email" => "me@example.com", :user_id => "abc123", "name" => "Bob Smith", "last_seen_ip" => "1.2.3.4", "last_seen_user_agent" => "ie6", "created_at" => Time.now}
258
+ it 'sets/gets rw keys' do
259
+ params = { 'email' => 'me@example.com', :user_id => 'abc123', 'name' => 'Bob Smith', 'last_seen_ip' => '1.2.3.4', 'last_seen_user_agent' => 'ie6', 'created_at' => Time.now }
247
260
  user = Intercom::User.new(params)
248
261
  custom_attributes = (params.keys + ['custom_attributes']).map(&:to_s).sort
249
- user.to_hash.keys.sort.must_equal custom_attributes
262
+ _(user.to_hash.keys.sort).must_equal custom_attributes
250
263
  params.keys.each do |key|
251
- user.send(key).to_s.must_equal params[key].to_s
264
+ _(user.send(key).to_s).must_equal params[key].to_s
252
265
  end
253
266
  end
254
267
 
255
- it "will allow extra attributes in response from api" do
256
- user = Intercom::User.send(:from_api, {"new_param" => "some value"})
257
- user.new_param.must_equal "some value"
268
+ it 'will allow extra attributes in response from api' do
269
+ user = Intercom::User.send(:from_api, 'new_param' => 'some value')
270
+ _(user.new_param).must_equal 'some value'
258
271
  end
259
272
 
260
- it "returns a ClientCollectionProxy for all without making any requests" do
273
+ it 'returns a ClientCollectionProxy for all without making any requests' do
261
274
  client.expects(:execute_request).never
262
- all = client.users.all
263
- all.must_be_instance_of(Intercom::ClientCollectionProxy)
275
+ all = client.deprecated__users.all
276
+ _(all).must_be_instance_of(Intercom::ClientCollectionProxy)
264
277
  end
265
278
 
266
279
  it 'can print users without crashing' do
267
- client.expects(:get).with("/users", {"email" => "bo@example.com"}).returns(test_user)
268
- user = client.users.find("email" => "bo@example.com")
280
+ client.expects(:get).with('/users', 'email' => 'bo@example.com').returns(test_user)
281
+ user = client.deprecated__users.find('email' => 'bo@example.com')
269
282
 
270
283
  begin
271
284
  orignal_stdout = $stdout
@@ -273,91 +286,88 @@ describe "Intercom::User" do
273
286
 
274
287
  puts user
275
288
  p user
276
-
277
289
  ensure
278
290
  $stdout = orignal_stdout
279
291
  end
280
292
  end
281
293
 
282
294
  describe 'bulk operations' do
283
- let (:job) {
295
+ let (:job) do
284
296
  {
285
- "app_id"=>"app_id",
286
- "id"=>"super_awesome_job",
287
- "created_at"=>1446033421,
288
- "completed_at"=>1446048736,
289
- "closing_at"=>1446034321,
290
- "updated_at"=>1446048736,
291
- "name"=>"api_bulk_job",
292
- "state"=>"completed",
293
- "links"=>
297
+ 'app_id' => 'app_id',
298
+ 'id' => 'super_awesome_job',
299
+ 'created_at' => 1_446_033_421,
300
+ 'completed_at' => 1_446_048_736,
301
+ 'closing_at' => 1_446_034_321,
302
+ 'updated_at' => 1_446_048_736,
303
+ 'name' => 'api_bulk_job',
304
+ 'state' => 'completed',
305
+ 'links' =>
294
306
  {
295
- "error"=>"https://api.intercom.io/jobs/super_awesome_job/error",
296
- "self"=>"https://api.intercom.io/jobs/super_awesome_job"
307
+ 'error' => 'https://api.intercom.io/jobs/super_awesome_job/error',
308
+ 'self' => 'https://api.intercom.io/jobs/super_awesome_job'
297
309
  },
298
- "tasks"=>
310
+ 'tasks' =>
299
311
  [
300
312
  {
301
- "id"=>"super_awesome_task",
302
- "item_count"=>2,
303
- "created_at"=>1446033421,
304
- "started_at"=>1446033709,
305
- "completed_at"=>1446033709,
306
- "state"=>"completed"
313
+ 'id' => 'super_awesome_task',
314
+ 'item_count' => 2,
315
+ 'created_at' => 1_446_033_421,
316
+ 'started_at' => 1_446_033_709,
317
+ 'completed_at' => 1_446_033_709,
318
+ 'state' => 'completed'
307
319
  }
308
320
  ]
309
- }
310
- }
311
- let(:bulk_request) {
312
- {
321
+ }
322
+ end
323
+ let(:bulk_request) do
324
+ {
313
325
  items: [
314
326
  {
315
- method: "post",
316
- data_type: "user",
317
- data:{
327
+ method: 'post',
328
+ data_type: 'user',
329
+ data: {
318
330
  user_id: 25,
319
- email: "alice@example.com"
331
+ email: 'alice@example.com'
320
332
  }
321
333
  },
322
334
  {
323
- method: "delete",
324
- data_type: "user",
325
- data:{
335
+ method: 'delete',
336
+ data_type: 'user',
337
+ data: {
326
338
  user_id: 26,
327
- email: "bob@example.com"
339
+ email: 'bob@example.com'
328
340
  }
329
341
  }
330
342
  ]
331
343
  }
332
- }
333
- let(:users_to_create) {
344
+ end
345
+ let(:users_to_create) do
334
346
  [
335
347
  {
336
348
  user_id: 25,
337
- email: "alice@example.com"
349
+ email: 'alice@example.com'
338
350
  }
339
351
  ]
340
- }
341
- let(:users_to_delete) {
352
+ end
353
+ let(:users_to_delete) do
342
354
  [
343
355
  {
344
356
  user_id: 26,
345
- email: "bob@example.com"
357
+ email: 'bob@example.com'
346
358
  }
347
359
  ]
348
- }
349
-
350
- it "submits a bulk job" do
351
- client.expects(:post).with("/bulk/users", bulk_request).returns(job)
352
- client.users.submit_bulk_job(create_items: users_to_create, delete_items: users_to_delete)
353
360
  end
354
361
 
355
- it "adds users to an existing bulk job" do
356
- bulk_request[:job] = {id: 'super_awesome_job'}
357
- client.expects(:post).with("/bulk/users", bulk_request).returns(job)
358
- client.users.submit_bulk_job(create_items: users_to_create, delete_items: users_to_delete, job_id: 'super_awesome_job')
362
+ it 'submits a bulk job' do
363
+ client.expects(:post).with('/bulk/users', bulk_request).returns(job)
364
+ client.deprecated__users.submit_bulk_job(create_items: users_to_create, delete_items: users_to_delete)
359
365
  end
360
366
 
367
+ it 'adds users to an existing bulk job' do
368
+ bulk_request[:job] = { id: 'super_awesome_job' }
369
+ client.expects(:post).with('/bulk/users', bulk_request).returns(job)
370
+ client.deprecated__users.submit_bulk_job(create_items: users_to_create, delete_items: users_to_delete, job_id: 'super_awesome_job')
371
+ end
361
372
  end
362
-
363
373
  end