google_contacts_api 0.7.0 → 0.7.1
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.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/README.markdown +3 -3
- data/VERSION +1 -1
- data/google_contacts_api.gemspec +23 -11
- data/lib/google_contacts_api/contacts.rb +1 -1
- data/lib/google_contacts_api/group_set.rb +6 -2
- data/spec/{contact_set.json → fixtures/contact_set.json} +0 -0
- data/spec/{empty_contact_set.json → fixtures/empty_contact_set.json} +0 -0
- data/spec/fixtures/empty_group_set.json +72 -0
- data/spec/{group_set.json → fixtures/group_set.json} +1 -1
- data/spec/lib/google_contacts_api/api_spec.rb +88 -0
- data/spec/lib/google_contacts_api/contact_set_spec.rb +39 -0
- data/spec/lib/google_contacts_api/contact_spec.rb +420 -0
- data/spec/lib/google_contacts_api/contacts_spec.rb +33 -0
- data/spec/lib/google_contacts_api/group_set_spec.rb +39 -0
- data/spec/lib/google_contacts_api/group_spec.rb +92 -0
- data/spec/lib/google_contacts_api/groups_spec.rb +33 -0
- data/spec/lib/google_contacts_api/result_set_spec.rb +35 -0
- data/spec/lib/google_contacts_api/result_spec.rb +69 -0
- data/spec/lib/google_contacts_api/user_spec.rb +66 -0
- data/spec/spec_helper.rb +2 -34
- data/spec/support/rspec_helpers.rb +48 -0
- metadata +43 -59
- data/spec/errors/auth_sub_401.html +0 -0
- data/spec/google_contacts_api_spec.rb +0 -608
metadata
CHANGED
@@ -1,116 +1,102 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google_contacts_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
5
|
-
prerelease:
|
4
|
+
version: 0.7.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Alvin Liang
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2016-01-05 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: activesupport
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: i18n
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: json
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: hashie
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - '>='
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
70
62
|
type: :runtime
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - '>='
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '0'
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: shoulda
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
|
-
- -
|
73
|
+
- - '>='
|
84
74
|
- !ruby/object:Gem::Version
|
85
75
|
version: '0'
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
|
-
- -
|
80
|
+
- - '>='
|
92
81
|
- !ruby/object:Gem::Version
|
93
82
|
version: '0'
|
94
83
|
- !ruby/object:Gem::Dependency
|
95
84
|
name: simplecov
|
96
85
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
86
|
requirements:
|
99
|
-
- -
|
87
|
+
- - '>='
|
100
88
|
- !ruby/object:Gem::Version
|
101
89
|
version: '0'
|
102
90
|
type: :development
|
103
91
|
prerelease: false
|
104
92
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
93
|
requirements:
|
107
|
-
- -
|
94
|
+
- - '>='
|
108
95
|
- !ruby/object:Gem::Version
|
109
96
|
version: '0'
|
110
97
|
- !ruby/object:Gem::Dependency
|
111
98
|
name: rspec
|
112
99
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
100
|
requirements:
|
115
101
|
- - ~>
|
116
102
|
- !ruby/object:Gem::Version
|
@@ -118,7 +104,6 @@ dependencies:
|
|
118
104
|
type: :development
|
119
105
|
prerelease: false
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
107
|
requirements:
|
123
108
|
- - ~>
|
124
109
|
- !ruby/object:Gem::Version
|
@@ -126,65 +111,57 @@ dependencies:
|
|
126
111
|
- !ruby/object:Gem::Dependency
|
127
112
|
name: rdoc
|
128
113
|
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
114
|
requirements:
|
131
|
-
- -
|
115
|
+
- - '>='
|
132
116
|
- !ruby/object:Gem::Version
|
133
117
|
version: '0'
|
134
118
|
type: :development
|
135
119
|
prerelease: false
|
136
120
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
121
|
requirements:
|
139
|
-
- -
|
122
|
+
- - '>='
|
140
123
|
- !ruby/object:Gem::Version
|
141
124
|
version: '0'
|
142
125
|
- !ruby/object:Gem::Dependency
|
143
126
|
name: bundler
|
144
127
|
requirement: !ruby/object:Gem::Requirement
|
145
|
-
none: false
|
146
128
|
requirements:
|
147
|
-
- -
|
129
|
+
- - '>='
|
148
130
|
- !ruby/object:Gem::Version
|
149
131
|
version: '0'
|
150
132
|
type: :development
|
151
133
|
prerelease: false
|
152
134
|
version_requirements: !ruby/object:Gem::Requirement
|
153
|
-
none: false
|
154
135
|
requirements:
|
155
|
-
- -
|
136
|
+
- - '>='
|
156
137
|
- !ruby/object:Gem::Version
|
157
138
|
version: '0'
|
158
139
|
- !ruby/object:Gem::Dependency
|
159
140
|
name: jeweler
|
160
141
|
requirement: !ruby/object:Gem::Requirement
|
161
|
-
none: false
|
162
142
|
requirements:
|
163
|
-
- -
|
143
|
+
- - '>='
|
164
144
|
- !ruby/object:Gem::Version
|
165
145
|
version: '0'
|
166
146
|
type: :development
|
167
147
|
prerelease: false
|
168
148
|
version_requirements: !ruby/object:Gem::Requirement
|
169
|
-
none: false
|
170
149
|
requirements:
|
171
|
-
- -
|
150
|
+
- - '>='
|
172
151
|
- !ruby/object:Gem::Version
|
173
152
|
version: '0'
|
174
153
|
- !ruby/object:Gem::Dependency
|
175
154
|
name: travis-lint
|
176
155
|
requirement: !ruby/object:Gem::Requirement
|
177
|
-
none: false
|
178
156
|
requirements:
|
179
|
-
- -
|
157
|
+
- - '>='
|
180
158
|
- !ruby/object:Gem::Version
|
181
159
|
version: '0'
|
182
160
|
type: :development
|
183
161
|
prerelease: false
|
184
162
|
version_requirements: !ruby/object:Gem::Requirement
|
185
|
-
none: false
|
186
163
|
requirements:
|
187
|
-
- -
|
164
|
+
- - '>='
|
188
165
|
- !ruby/object:Gem::Version
|
189
166
|
version: '0'
|
190
167
|
description: Lets you read from the Google Contacts API. Posting to come later.
|
@@ -196,6 +173,7 @@ extra_rdoc_files:
|
|
196
173
|
- README.markdown
|
197
174
|
files:
|
198
175
|
- .document
|
176
|
+
- .rspec
|
199
177
|
- .travis.yml
|
200
178
|
- Gemfile
|
201
179
|
- LICENSE.txt
|
@@ -215,38 +193,44 @@ files:
|
|
215
193
|
- lib/google_contacts_api/result_set.rb
|
216
194
|
- lib/google_contacts_api/user.rb
|
217
195
|
- lib/google_contacts_api/version.rb
|
218
|
-
- spec/contact_set.json
|
219
|
-
- spec/empty_contact_set.json
|
220
|
-
- spec/
|
221
|
-
- spec/
|
222
|
-
- spec/
|
196
|
+
- spec/fixtures/contact_set.json
|
197
|
+
- spec/fixtures/empty_contact_set.json
|
198
|
+
- spec/fixtures/empty_group_set.json
|
199
|
+
- spec/fixtures/group_set.json
|
200
|
+
- spec/lib/google_contacts_api/api_spec.rb
|
201
|
+
- spec/lib/google_contacts_api/contact_set_spec.rb
|
202
|
+
- spec/lib/google_contacts_api/contact_spec.rb
|
203
|
+
- spec/lib/google_contacts_api/contacts_spec.rb
|
204
|
+
- spec/lib/google_contacts_api/group_set_spec.rb
|
205
|
+
- spec/lib/google_contacts_api/group_spec.rb
|
206
|
+
- spec/lib/google_contacts_api/groups_spec.rb
|
207
|
+
- spec/lib/google_contacts_api/result_set_spec.rb
|
208
|
+
- spec/lib/google_contacts_api/result_spec.rb
|
209
|
+
- spec/lib/google_contacts_api/user_spec.rb
|
223
210
|
- spec/spec_helper.rb
|
211
|
+
- spec/support/rspec_helpers.rb
|
224
212
|
homepage: http://github.com/aliang/google_contacts_api
|
225
213
|
licenses:
|
226
214
|
- MIT
|
215
|
+
metadata: {}
|
227
216
|
post_install_message:
|
228
217
|
rdoc_options: []
|
229
218
|
require_paths:
|
230
219
|
- lib
|
231
220
|
required_ruby_version: !ruby/object:Gem::Requirement
|
232
|
-
none: false
|
233
221
|
requirements:
|
234
|
-
- -
|
222
|
+
- - '>='
|
235
223
|
- !ruby/object:Gem::Version
|
236
224
|
version: '0'
|
237
|
-
segments:
|
238
|
-
- 0
|
239
|
-
hash: -2507649345760241403
|
240
225
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
241
|
-
none: false
|
242
226
|
requirements:
|
243
|
-
- -
|
227
|
+
- - '>='
|
244
228
|
- !ruby/object:Gem::Version
|
245
229
|
version: '0'
|
246
230
|
requirements: []
|
247
231
|
rubyforge_project:
|
248
|
-
rubygems_version:
|
232
|
+
rubygems_version: 2.4.8
|
249
233
|
signing_key:
|
250
|
-
specification_version:
|
234
|
+
specification_version: 4
|
251
235
|
summary: Lets you read from the Google Contacts API
|
252
236
|
test_files: []
|
File without changes
|
@@ -1,608 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
class MockOAuth2Error < StandardError
|
4
|
-
attr_accessor :response
|
5
|
-
|
6
|
-
def initialize(response)
|
7
|
-
@response = response
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
describe "GoogleContactsApi" do
|
12
|
-
describe "Api" do
|
13
|
-
before(:each) do
|
14
|
-
@oauth = double("oauth")
|
15
|
-
allow(@oauth).to receive(:get).and_return("get response")
|
16
|
-
@api = GoogleContactsApi::Api.new(@oauth)
|
17
|
-
end
|
18
|
-
|
19
|
-
describe ".get" do
|
20
|
-
it "should perform a get request using oauth returning json with version 3" do
|
21
|
-
# expectation should come before execution
|
22
|
-
expect(@oauth).to receive(:get).with(
|
23
|
-
GoogleContactsApi::Api::BASE_URL + "any_url?alt=json¶m=param&v=3", {"header" => "header"})
|
24
|
-
expect(@api.get("any_url",
|
25
|
-
{"param" => "param"},
|
26
|
-
{"header" => "header"})).to eq("get response")
|
27
|
-
end
|
28
|
-
|
29
|
-
it "should perform a get request using oauth with the version specified" do
|
30
|
-
expect(@oauth).to receive(:get).with(
|
31
|
-
GoogleContactsApi::Api::BASE_URL + "any_url?alt=json¶m=param&v=2", {"header" => "header"})
|
32
|
-
expect(@api.get("any_url",
|
33
|
-
{"param" => "param", "v" => "2"},
|
34
|
-
{"header" => "header"})).to eq("get response")
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
# Not implemented yet
|
39
|
-
pending "should perform a post request using oauth"
|
40
|
-
pending "should perform a put request using oauth"
|
41
|
-
pending "should perform a delete request using oauth"
|
42
|
-
# Not sure how to test, you'd need a revoked token.
|
43
|
-
it "should raise UnauthorizedError if OAuth 1.0 returns unauthorized" do
|
44
|
-
oauth = double("oauth")
|
45
|
-
error_html = load_file(File.join('errors', 'auth_sub_401.html'))
|
46
|
-
allow(oauth).to receive(:get).and_return(Net::HTTPUnauthorized.new("1.1", 401, error_html))
|
47
|
-
api = GoogleContactsApi::Api.new(oauth)
|
48
|
-
expect { api.get("any url",
|
49
|
-
{"param" => "param"},
|
50
|
-
{"header" => "header"}) }.to raise_error(GoogleContactsApi::UnauthorizedError)
|
51
|
-
end
|
52
|
-
|
53
|
-
it "should raise UnauthorizedError if OAuth 2.0 returns unauthorized" do
|
54
|
-
oauth = double("oauth2")
|
55
|
-
oauth2_response = Struct.new(:status)
|
56
|
-
allow(oauth).to receive(:get).and_raise(MockOAuth2Error.new(oauth2_response.new(401)))
|
57
|
-
api = GoogleContactsApi::Api.new(oauth)
|
58
|
-
expect { api.get("any url",
|
59
|
-
{"param" => "param"},
|
60
|
-
{"header" => "header"}) }.to raise_error(GoogleContactsApi::UnauthorizedError)
|
61
|
-
end
|
62
|
-
|
63
|
-
describe "parsing response code" do
|
64
|
-
before(:all) do
|
65
|
-
@Oauth = Struct.new(:code)
|
66
|
-
@Oauth2 = Struct.new(:status)
|
67
|
-
end
|
68
|
-
it "should parse something that looks like an oauth gem response" do
|
69
|
-
expect(GoogleContactsApi::Api.parse_response_code(@Oauth.new("401"))).to eq(401)
|
70
|
-
end
|
71
|
-
|
72
|
-
it "should parse something that looks like an oauth2 gem response" do
|
73
|
-
expect(GoogleContactsApi::Api.parse_response_code(@Oauth2.new(401))).to eq(401)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
describe GoogleContactsApi::Contacts do
|
79
|
-
let(:api) { double("api") }
|
80
|
-
let(:test_class) {
|
81
|
-
Class.new do
|
82
|
-
include GoogleContactsApi::Contacts
|
83
|
-
def initialize(api)
|
84
|
-
@api = api
|
85
|
-
end
|
86
|
-
end
|
87
|
-
}
|
88
|
-
describe ".get_contacts" do
|
89
|
-
it "should get the contacts using the internal @api object" do
|
90
|
-
expect(api).to receive(:get).with("contacts/default/full", kind_of(Hash)).and_return(Hashie::Mash.new({
|
91
|
-
"body" => "some response", # could use example response here
|
92
|
-
"code" => 200
|
93
|
-
}))
|
94
|
-
allow(GoogleContactsApi::ContactSet).to receive(:new).and_return("contact set")
|
95
|
-
expect(test_class.new(api).get_contacts).to eq("contact set")
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
describe GoogleContactsApi::Groups do
|
101
|
-
let(:api) { double("api") }
|
102
|
-
let(:test_class) {
|
103
|
-
Class.new do
|
104
|
-
include GoogleContactsApi::Groups
|
105
|
-
def initialize(api)
|
106
|
-
@api = api
|
107
|
-
end
|
108
|
-
end
|
109
|
-
}
|
110
|
-
describe ".get_groups" do
|
111
|
-
it "should get the groups using the internal @api object" do
|
112
|
-
expect(api).to receive(:get).with("groups/default/full", kind_of(Hash)).and_return(Hashie::Mash.new({
|
113
|
-
"body" => "some response", # could use example response here
|
114
|
-
"code" => 200
|
115
|
-
}))
|
116
|
-
allow(GoogleContactsApi::GroupSet).to receive(:new).and_return("group set")
|
117
|
-
expect(test_class.new(api).get_groups).to eq("group set")
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
describe GoogleContactsApi::User do
|
123
|
-
let(:oauth) { double ("oauth") }
|
124
|
-
let(:user) { GoogleContactsApi::User.new(@oauth) }
|
125
|
-
|
126
|
-
# Should hit the right URLs and return the right stuff
|
127
|
-
describe ".groups" do
|
128
|
-
it "should be able to get groups including system groups" do
|
129
|
-
expect(user).to receive(:get_groups).and_return("group set")
|
130
|
-
expect(user.groups).to eq("group set")
|
131
|
-
end
|
132
|
-
end
|
133
|
-
describe ".groups!" do
|
134
|
-
it "should be able to get groups" do
|
135
|
-
expect(user).to receive(:get_groups).and_return("group set")
|
136
|
-
expect(user.groups!).to eq("group set")
|
137
|
-
end
|
138
|
-
it "should pass query params along to get_groups" do
|
139
|
-
expect(user).to receive(:get_groups).with("something" => "important").and_return("group set")
|
140
|
-
expect(user.groups!("something" => "important")).to eq("group set")
|
141
|
-
end
|
142
|
-
it "should reload the groups" do
|
143
|
-
expect(user).to receive(:get_groups).and_return("group set").twice
|
144
|
-
user.groups
|
145
|
-
groups = user.groups!
|
146
|
-
expect(groups).to eq("group set")
|
147
|
-
end
|
148
|
-
end
|
149
|
-
describe ".contacts" do
|
150
|
-
it "should be able to get contacts" do
|
151
|
-
expect(user).to receive(:get_contacts).and_return("contact set")
|
152
|
-
expect(user.contacts).to eq("contact set")
|
153
|
-
end
|
154
|
-
it "should use the contact cache for subsequent access" do
|
155
|
-
expect(user).to receive(:get_contacts).and_return("contact set").once
|
156
|
-
user.contacts
|
157
|
-
contacts = user.contacts
|
158
|
-
expect(contacts).to eq("contact set")
|
159
|
-
end
|
160
|
-
end
|
161
|
-
describe ".contacts!" do
|
162
|
-
it "should be able to get contacts" do
|
163
|
-
expect(user).to receive(:get_contacts).and_return("contact set")
|
164
|
-
expect(user.contacts!).to eq("contact set")
|
165
|
-
end
|
166
|
-
it "should pass query params along to get_contacts" do
|
167
|
-
expect(user).to receive(:get_contacts).with("something" => "important").and_return("contact set")
|
168
|
-
expect(user.contacts!("something" => "important")).to eq("contact set")
|
169
|
-
end
|
170
|
-
it "should reload the contacts" do
|
171
|
-
expect(user).to receive(:get_contacts).and_return("contact set").twice
|
172
|
-
user.contacts
|
173
|
-
contacts = user.contacts!
|
174
|
-
expect(contacts).to eq("contact set")
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
describe "ResultSet" do
|
180
|
-
pending ".each"
|
181
|
-
pending ".has_more?"
|
182
|
-
end
|
183
|
-
|
184
|
-
describe "ContactSet" do
|
185
|
-
describe "with entries" do
|
186
|
-
before(:all) do
|
187
|
-
@contact_set_json = contact_set_json
|
188
|
-
@contact_set = GoogleContactsApi::ContactSet.new(@contact_set_json)
|
189
|
-
end
|
190
|
-
|
191
|
-
it "should return the right starting index" do
|
192
|
-
expect(@contact_set.start_index).to eq(1)
|
193
|
-
end
|
194
|
-
it "should return the right number of results per page" do
|
195
|
-
expect(@contact_set.items_per_page).to eq(25)
|
196
|
-
end
|
197
|
-
it "should return the right number of total results" do
|
198
|
-
expect(@contact_set.total_results).to eq(500)
|
199
|
-
end
|
200
|
-
it "should tell me if there are more results" do
|
201
|
-
# yeah this is an awkward assertion and matcher
|
202
|
-
expect(@contact_set).to be_has_more
|
203
|
-
expect(@contact_set.has_more?).to eq(true)
|
204
|
-
end
|
205
|
-
it "should parse results into Contacts" do
|
206
|
-
expect(@contact_set.to_a.first).to be_instance_of(GoogleContactsApi::Contact)
|
207
|
-
end
|
208
|
-
end
|
209
|
-
it "should parse nil results into an empty array" do
|
210
|
-
@empty_contact_set_json = empty_contact_set_json
|
211
|
-
@empty_contact_set = GoogleContactsApi::ContactSet.new(@empty_contact_set_json)
|
212
|
-
expect(@empty_contact_set.total_results).to eq(0)
|
213
|
-
expect(@empty_contact_set.instance_variable_get("@results")).to eq([])
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
|
-
describe "GroupSet" do
|
218
|
-
before(:all) do
|
219
|
-
@group_set_json = group_set_json
|
220
|
-
@group_set = GoogleContactsApi::GroupSet.new(@group_set_json)
|
221
|
-
end
|
222
|
-
|
223
|
-
it "should return the right starting index" do
|
224
|
-
expect(@group_set.start_index).to eq(1)
|
225
|
-
end
|
226
|
-
it "should return the right number of results per page" do
|
227
|
-
expect(@group_set.items_per_page).to eq(25)
|
228
|
-
end
|
229
|
-
it "should return the right number of total results" do
|
230
|
-
expect(@group_set.total_results).to eq(5)
|
231
|
-
end
|
232
|
-
it "should tell me if there are more results" do
|
233
|
-
# yeah this is an awkward assertion and matcher
|
234
|
-
expect(@group_set).not_to be_has_more
|
235
|
-
expect(@group_set.has_more?).to eq(false)
|
236
|
-
end
|
237
|
-
it "should parse results into Groups" do
|
238
|
-
expect(@group_set.to_a.first).to be_instance_of(GoogleContactsApi::Group)
|
239
|
-
end
|
240
|
-
end
|
241
|
-
|
242
|
-
describe "Result" do
|
243
|
-
it 'supports the deleted? method' do
|
244
|
-
expect(GoogleContactsApi::Result.new('gd$deleted' => {}).deleted?).to eq(true)
|
245
|
-
expect(GoogleContactsApi::Result.new.deleted?).to eq(false)
|
246
|
-
end
|
247
|
-
end
|
248
|
-
|
249
|
-
describe "Contact" do
|
250
|
-
before(:all) do
|
251
|
-
@contact_json_hash = contact_json_hash
|
252
|
-
@contact = GoogleContactsApi::Contact.new(@contact_json_hash)
|
253
|
-
end
|
254
|
-
# ok, these tests are kind of silly
|
255
|
-
it "should return the right title" do
|
256
|
-
expect(@contact.title).to eq("Contact 1")
|
257
|
-
end
|
258
|
-
it "should return the right id" do
|
259
|
-
expect(@contact.id).to eq("http://www.google.com/m8/feeds/contacts/example%40gmail.com/base/0")
|
260
|
-
end
|
261
|
-
it "should return the right content" do
|
262
|
-
# TODO: Nothing in source, oops
|
263
|
-
expect(@contact.content).to eq(nil)
|
264
|
-
end
|
265
|
-
it "should return the right updated time" do
|
266
|
-
# different representation slightly
|
267
|
-
expect(@contact.updated.to_s).to eq("2011-07-07T21:02:42+00:00")
|
268
|
-
end
|
269
|
-
it "should return the right self link" do
|
270
|
-
expect(@contact.self_link).to eq("https://www.google.com/m8/feeds/contacts/example%40gmail.com/full/0")
|
271
|
-
end
|
272
|
-
it "should return the right photo link entry" do
|
273
|
-
expect(@contact.photo_link_entry).to eq({
|
274
|
-
"rel" => "http://schemas.google.com/contacts/2008/rel#photo",
|
275
|
-
"type" => "image/*",
|
276
|
-
"href" => "https://www.google.com/m8/feeds/photos/media/example%40gmail.com/0",
|
277
|
-
"gd$etag" => "\"dxt2DAEZfCp7ImA-AV4zRxBoPG4UK3owXBM.\""
|
278
|
-
})
|
279
|
-
end
|
280
|
-
it "should return the right photo link" do
|
281
|
-
expect(@contact.photo_link).to eq("https://www.google.com/m8/feeds/photos/media/example%40gmail.com/0")
|
282
|
-
end
|
283
|
-
it "should return the right edit link" do
|
284
|
-
expect(@contact.edit_link).to eq("https://www.google.com/m8/feeds/contacts/example%40gmail.com/full/0")
|
285
|
-
end
|
286
|
-
it "should return the right edit photo link" do
|
287
|
-
# TODO: there isn't one in this contact, hahah
|
288
|
-
expect(@contact.edit_photo_link).to eq(nil)
|
289
|
-
end
|
290
|
-
it "should try to fetch a photo" do
|
291
|
-
@oauth = double("oauth")
|
292
|
-
allow(@oauth).to receive(:get).and_return(Hashie::Mash.new({
|
293
|
-
"body" => "some response", # could use example response here
|
294
|
-
"code" => 200
|
295
|
-
}))
|
296
|
-
# @api = GoogleContactsApi::Api.new(@oauth)
|
297
|
-
@api = double("api")
|
298
|
-
allow(@api).to receive(:oauth).and_return(@oauth)
|
299
|
-
@contact = GoogleContactsApi::Contact.new(@contact_json_hash, nil, @api)
|
300
|
-
expect(@oauth).to receive("get").with(@contact.photo_link)
|
301
|
-
@contact.photo
|
302
|
-
end
|
303
|
-
it "should fetch a photo with metadata" do
|
304
|
-
@oauth = double("oauth")
|
305
|
-
allow(@oauth).to receive(:get).and_return(Hashie::Mash.new({
|
306
|
-
"body" => "some response",
|
307
|
-
"code" => 200,
|
308
|
-
"headers" => { "content-type" => "image/jpeg" }
|
309
|
-
}))
|
310
|
-
@api = double("api")
|
311
|
-
allow(@api).to receive(:oauth).and_return(@oauth)
|
312
|
-
@contact = GoogleContactsApi::Contact.new(@contact_json_hash, nil, @api)
|
313
|
-
expect(@oauth).to receive("get").with(@contact.photo_link)
|
314
|
-
expect(@contact.photo_with_metadata).to eq( { data: 'some response',
|
315
|
-
etag: 'dxt2DAEZfCp7ImA-AV4zRxBoPG4UK3owXBM.',
|
316
|
-
content_type: 'image/jpeg'
|
317
|
-
} )
|
318
|
-
end
|
319
|
-
# TODO: there isn't any phone number in here
|
320
|
-
pending "should return all phone numbers"
|
321
|
-
it "should return all e-mail addresses" do
|
322
|
-
expect(@contact.emails).to eq(["contact1@example.com"])
|
323
|
-
end
|
324
|
-
it "should return the right primary e-mail address" do
|
325
|
-
expect(@contact.primary_email).to eq("contact1@example.com")
|
326
|
-
end
|
327
|
-
it "should return an empty array if there are no e-mail addresses" do
|
328
|
-
@contact = GoogleContactsApi::Contact.new(contact_no_emails_json_hash)
|
329
|
-
expect(@contact.emails).to eq([])
|
330
|
-
end
|
331
|
-
it "should return nil if there is no primary e-mail address" do
|
332
|
-
@contact2 = GoogleContactsApi::Contact.new(contact_no_emails_json_hash)
|
333
|
-
expect(@contact2.primary_email).to be_nil
|
334
|
-
@contact3 = GoogleContactsApi::Contact.new(contact_no_primary_email_json_hash)
|
335
|
-
expect(@contact3.primary_email).to be_nil
|
336
|
-
end
|
337
|
-
it "should return all instant messaging accounts" do
|
338
|
-
expect(@contact.ims).to eq(["contact1@example.com"])
|
339
|
-
end
|
340
|
-
it "should return an empty array if there are no instant messaging accounts" do
|
341
|
-
@contact = GoogleContactsApi::Contact.new(contact_no_emails_json_hash)
|
342
|
-
expect(@contact.ims).to eq([])
|
343
|
-
end
|
344
|
-
|
345
|
-
#
|
346
|
-
describe 'Contacts API v3 fields' do
|
347
|
-
before do
|
348
|
-
@empty = GoogleContactsApi::Contact.new
|
349
|
-
|
350
|
-
@partly_empty = GoogleContactsApi::Contact.new(
|
351
|
-
'gd$name' => {},
|
352
|
-
'gContact$relation' => []
|
353
|
-
)
|
354
|
-
|
355
|
-
@contact_v3 = GoogleContactsApi::Contact.new(
|
356
|
-
'gd$name' => {
|
357
|
-
'gd$givenName' => { '$t' => 'John' },
|
358
|
-
'gd$familyName' => { '$t' => 'Doe' },
|
359
|
-
'gd$fullName' => { '$t' => 'John Doe' }
|
360
|
-
},
|
361
|
-
'gContact$birthday' => {
|
362
|
-
'when' => '1988-05-12'
|
363
|
-
},
|
364
|
-
'gContact$relation' => [ { '$t' => 'Jane', 'rel' => 'spouse' } ],
|
365
|
-
'gd$structuredPostalAddress' => [
|
366
|
-
{
|
367
|
-
'gd$country' => { '$t' => 'United States of America' },
|
368
|
-
'gd$formattedAddress' => { '$t' => "2345 Long Dr. #232\nSomwhere\nIL\n12345\nUnited States of America" },
|
369
|
-
'gd$city' => { '$t' => 'Somwhere' },
|
370
|
-
'gd$street' => { '$t' => '2345 Long Dr. #232' },
|
371
|
-
'gd$region' => { '$t' => 'IL' },
|
372
|
-
'gd$postcode' => { '$t' => '12345' }
|
373
|
-
},
|
374
|
-
{
|
375
|
-
'rel' => 'http://schemas.google.com/g/2005#home',
|
376
|
-
'primary' => 'true',
|
377
|
-
'gd$country' => { '$t' => 'United States of America' },
|
378
|
-
'gd$formattedAddress' => { '$t' => "123 Far Ln.\nAnywhere\nMO\n67891\nUnited States of America" },
|
379
|
-
'gd$city' => { '$t' => 'Anywhere' },
|
380
|
-
'gd$street' => { '$t' => '123 Far Ln.' }
|
381
|
-
}
|
382
|
-
],
|
383
|
-
'gd$email' => [
|
384
|
-
{
|
385
|
-
'primary' => 'true',
|
386
|
-
'rel' => 'http://schemas.google.com/g/2005#other',
|
387
|
-
'address' => 'johnsmith@example.com'
|
388
|
-
}
|
389
|
-
],
|
390
|
-
'gd$phoneNumber' => [
|
391
|
-
{
|
392
|
-
'primary' => 'true',
|
393
|
-
'$t' => '(123) 334-5158',
|
394
|
-
'rel' => 'http://schemas.google.com/g/2005#mobile'
|
395
|
-
}
|
396
|
-
],
|
397
|
-
'gd$organization' => [
|
398
|
-
{
|
399
|
-
'gd$orgTitle' => { '$t' => 'Worker Person' },
|
400
|
-
'gd$orgName' => { '$t' => 'Example, Inc' },
|
401
|
-
'rel' => 'http://schemas.google.com/g/2005#other'
|
402
|
-
}
|
403
|
-
],
|
404
|
-
'gContact$groupMembershipInfo' => [
|
405
|
-
{
|
406
|
-
'deleted' => 'false',
|
407
|
-
'href' => 'http://www.google.com/m8/feeds/groups/test.user%40gmail.com/base/111'
|
408
|
-
},
|
409
|
-
{
|
410
|
-
'deleted' => 'true',
|
411
|
-
'href' => 'http://www.google.com/m8/feeds/groups/test.user%40gmail.com/base/222'
|
412
|
-
}
|
413
|
-
]
|
414
|
-
)
|
415
|
-
end
|
416
|
-
|
417
|
-
it 'should catch nil values for nested fields' do
|
418
|
-
expect(@empty.nested_t_field_or_nil('gd$name', 'gd$givenName')).to be_nil
|
419
|
-
expect(@partly_empty.nested_t_field_or_nil('gd$name', 'gd$givenName')).to be_nil
|
420
|
-
expect(@contact_v3.nested_t_field_or_nil('gd$name', 'gd$givenName')).to eq('John')
|
421
|
-
end
|
422
|
-
|
423
|
-
it 'has given_name' do
|
424
|
-
expect(@contact_v3.given_name).to eq('John')
|
425
|
-
end
|
426
|
-
|
427
|
-
it 'has family_name' do
|
428
|
-
expect(@contact_v3.family_name).to eq('Doe')
|
429
|
-
end
|
430
|
-
|
431
|
-
it 'has full_name' do
|
432
|
-
expect(@contact_v3).to receive(:nested_t_field_or_nil).with('gd$name', 'gd$fullName').and_return('val')
|
433
|
-
expect(@contact_v3.full_name).to eq('val')
|
434
|
-
end
|
435
|
-
|
436
|
-
it 'has relations' do
|
437
|
-
expect(@empty.relations).to eq([])
|
438
|
-
expect(@partly_empty.relations).to eq([])
|
439
|
-
expect(@contact_v3.relations).to eq([ { '$t' => 'Jane', 'rel' => 'spouse' } ])
|
440
|
-
end
|
441
|
-
it 'has spouse' do
|
442
|
-
expect(@empty.spouse).to be_nil
|
443
|
-
expect(@partly_empty.spouse).to be_nil
|
444
|
-
expect(@contact_v3.spouse).to eq('Jane')
|
445
|
-
end
|
446
|
-
|
447
|
-
it 'has birthday' do
|
448
|
-
expect(@empty.birthday).to be_nil
|
449
|
-
expect(@contact_v3.birthday).to eq({ year: 1988, month: 5, day: 12 })
|
450
|
-
|
451
|
-
contact_birthday_no_year = GoogleContactsApi::Contact.new('gContact$birthday' => { 'when' => '--05-12' })
|
452
|
-
expect(contact_birthday_no_year.birthday).to eq({ year: nil, month: 5, day: 12 })
|
453
|
-
end
|
454
|
-
|
455
|
-
it 'has addresses' do
|
456
|
-
expect(@empty.addresses).to eq([])
|
457
|
-
|
458
|
-
formatted_addresses = [
|
459
|
-
{ rel: 'work', primary: false, country: 'United States of America', city: 'Somwhere', street: '2345 Long Dr. #232',
|
460
|
-
region: 'IL', postcode: '12345' },
|
461
|
-
{ rel: 'home', primary: true, country: 'United States of America', city: 'Anywhere', street: '123 Far Ln.',
|
462
|
-
region: nil, postcode: nil }
|
463
|
-
]
|
464
|
-
expect(@contact_v3.addresses).to eq(formatted_addresses)
|
465
|
-
end
|
466
|
-
|
467
|
-
it 'has full phone numbers' do
|
468
|
-
expect(@empty.phone_numbers_full).to eq([])
|
469
|
-
expect(@contact_v3.phone_numbers_full).to eq([ { :primary => true, :number => '(123) 334-5158', :rel => 'mobile' } ])
|
470
|
-
end
|
471
|
-
it 'has full emails' do
|
472
|
-
expect(@empty.emails_full).to eq([])
|
473
|
-
expect(@contact_v3.emails_full).to eq([ { :primary => true, :address => 'johnsmith@example.com', :rel => 'other' } ])
|
474
|
-
end
|
475
|
-
|
476
|
-
it 'has organizations' do
|
477
|
-
expect(@empty.organizations).to eq([])
|
478
|
-
|
479
|
-
formatted_organizations = [
|
480
|
-
{
|
481
|
-
org_title: 'Worker Person',
|
482
|
-
org_name: 'Example, Inc',
|
483
|
-
primary: false,
|
484
|
-
rel: 'other'
|
485
|
-
}
|
486
|
-
]
|
487
|
-
expect(@contact_v3.organizations).to eq(formatted_organizations)
|
488
|
-
end
|
489
|
-
|
490
|
-
it 'has group membership info' do
|
491
|
-
expect(@empty.group_membership_info).to eq([])
|
492
|
-
|
493
|
-
group_membership_info = [
|
494
|
-
{ deleted: false, href: 'http://www.google.com/m8/feeds/groups/test.user%40gmail.com/base/111' },
|
495
|
-
{ deleted: true, href: 'http://www.google.com/m8/feeds/groups/test.user%40gmail.com/base/222' }
|
496
|
-
]
|
497
|
-
expect(@contact_v3.group_membership_info).to eq(group_membership_info)
|
498
|
-
end
|
499
|
-
|
500
|
-
it 'has group memberships' do
|
501
|
-
expect(@contact_v3.group_memberships).to eq(['http://www.google.com/m8/feeds/groups/test.user%40gmail.com/base/111'])
|
502
|
-
end
|
503
|
-
|
504
|
-
it 'has deleted group memberships' do
|
505
|
-
expect(@contact_v3.deleted_group_memberships).to eq(['http://www.google.com/m8/feeds/groups/test.user%40gmail.com/base/222'])
|
506
|
-
end
|
507
|
-
end
|
508
|
-
|
509
|
-
# The Google Contacts API (https://developers.google.com/gdata/docs/2.0/elements)
|
510
|
-
# specifies an optional yomi field for orgName, givenName, additionalName and familyName
|
511
|
-
it 'handles Japanese yomigana "yomi" name values' do
|
512
|
-
contact_params = {
|
513
|
-
'gd$name' => {
|
514
|
-
'gd$givenName' => {'$t' => 'John' },
|
515
|
-
'gd$additionalName' => {'$t' => 'Text name', 'yomi' => 'And yomi chars' },
|
516
|
-
'gd$familyName' => { 'yomi' => 'Yomi chars only' },
|
517
|
-
},
|
518
|
-
'gd$organization' => [{
|
519
|
-
'rel' => 'http://schemas.google.com/g/2005#other',
|
520
|
-
'primary' => 'true',
|
521
|
-
'gd$orgName' => {
|
522
|
-
'yomi' => 'Yomigana'
|
523
|
-
}
|
524
|
-
}],
|
525
|
-
}
|
526
|
-
contact = GoogleContactsApi::Contact.new(contact_params, nil, @api)
|
527
|
-
|
528
|
-
expect(contact.given_name).to eq('John')
|
529
|
-
expect(contact.given_name_yomi).to be_nil
|
530
|
-
|
531
|
-
expect(contact.additional_name).to eq('Text name')
|
532
|
-
expect(contact.additional_name_yomi).to eq('And yomi chars')
|
533
|
-
|
534
|
-
expect(contact.family_name).to be_nil
|
535
|
-
expect(contact.family_name_yomi).to eq('Yomi chars only')
|
536
|
-
|
537
|
-
expect(contact.organizations.first[:org_name]).to be_nil
|
538
|
-
expect(contact.organizations.first[:org_name_yomi]).to eq('Yomigana')
|
539
|
-
end
|
540
|
-
end
|
541
|
-
|
542
|
-
describe GoogleContactsApi::Group do
|
543
|
-
before(:all) do
|
544
|
-
@group_json_hash = group_json_hash
|
545
|
-
@group = GoogleContactsApi::Group.new(group_json_hash)
|
546
|
-
end
|
547
|
-
# ok, these tests are kind of silly
|
548
|
-
it "should return the right title" do
|
549
|
-
expect(@group.title).to eq("System Group: My Contacts")
|
550
|
-
end
|
551
|
-
it "should return the right id" do
|
552
|
-
expect(@group.id).to eq("http://www.google.com/m8/feeds/groups/example%40gmail.com/base/6")
|
553
|
-
end
|
554
|
-
it "should return the right content" do
|
555
|
-
# TODO: Nothing in source, oops
|
556
|
-
expect(@group.content).to eq("System Group: My Contacts")
|
557
|
-
end
|
558
|
-
it "should return the right updated time" do
|
559
|
-
# different representation slightly
|
560
|
-
expect(@group.updated.to_s).to eq("1970-01-01T00:00:00+00:00")
|
561
|
-
end
|
562
|
-
it "should tell me if it's a system group" do
|
563
|
-
expect(@group).to be_system_group
|
564
|
-
end
|
565
|
-
it 'tells the system group id or nil if not a system group' do
|
566
|
-
expect(@group).to be_system_group
|
567
|
-
expect(@group.system_group_id).to eq('Contacts')
|
568
|
-
|
569
|
-
@group.delete('gContact$systemGroup')
|
570
|
-
expect(@group).to_not be_system_group
|
571
|
-
expect(@group.system_group_id).to be_nil
|
572
|
-
end
|
573
|
-
describe ".contacts" do
|
574
|
-
before(:each) do
|
575
|
-
@api = double("api")
|
576
|
-
@group = GoogleContactsApi::Group.new(@contact_json_hash, nil, @api)
|
577
|
-
allow(@group).to receive(:id).and_return("group id")
|
578
|
-
end
|
579
|
-
it "should be able to get contacts" do
|
580
|
-
expect(@group).to receive(:get_contacts).with(hash_including({"group" => "group id"})).and_return("contact set")
|
581
|
-
expect(@group.contacts).to eq("contact set")
|
582
|
-
end
|
583
|
-
it "should use the contact cache for subsequent access" do
|
584
|
-
expect(@group).to receive(:get_contacts).with(hash_including({"group" => "group id"})).and_return("contact set").once
|
585
|
-
@group.contacts
|
586
|
-
contacts = @group.contacts
|
587
|
-
expect(contacts).to eq("contact set")
|
588
|
-
end
|
589
|
-
end
|
590
|
-
describe ".contacts!" do
|
591
|
-
before(:each) do
|
592
|
-
@api = double("api")
|
593
|
-
@group = GoogleContactsApi::Group.new(@contact_json_hash, nil, @api)
|
594
|
-
allow(@group).to receive(:id).and_return("group id")
|
595
|
-
end
|
596
|
-
it "should be able to get contacts" do
|
597
|
-
expect(@group).to receive(:get_contacts).with(hash_including({"group" => "group id"})).and_return("contact set")
|
598
|
-
expect(@group.contacts!).to eq("contact set")
|
599
|
-
end
|
600
|
-
it "should use the contact cache for subsequent access" do
|
601
|
-
expect(@group).to receive(:get_contacts).with(hash_including({"group" => "group id"})).and_return("contact set").twice
|
602
|
-
@group.contacts
|
603
|
-
contacts = @group.contacts!
|
604
|
-
expect(contacts).to eq("contact set")
|
605
|
-
end
|
606
|
-
end
|
607
|
-
end
|
608
|
-
end
|