intercom 3.5.10 → 4.1.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 (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