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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: dd239c2ecad17fa5fb9ca5f01cfda0bf248cb5c5
4
+ data.tar.gz: 2dc497813f158780edc3741290dcb564d634fcb5
5
+ SHA512:
6
+ metadata.gz: 45c49f64438e64b67cfadfce88c18b2c77941dd1134782f881fff5e8542f7b1dceffa415840d7027d1271d868cce2bd752e35a02395c30d05c98b129b2506eec
7
+ data.tar.gz: feec2067b0542e8c270b2f9f3eb5bf38a1c47e5514480e977b47742ad6a85935a6be03283b3bd64c2b5836b0b3fd7a521a1038d4e82cad97ef393e7389ee0ef6
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format progress
2
+ --require spec_helper
3
+ --color
@@ -80,6 +80,6 @@ by jeweler).
80
80
 
81
81
  Copyright (c) 2011-15 Alvin Liang (aliang). See LICENSE.txt for further details.
82
82
 
83
- Some code based on a few bugfixes in lfittl and fraudpointer forks.
84
-
85
- Support for Google Contacts API version 3 fields by draffensperger.
83
+ * Some code based on a few bugfixes in lfittl and fraudpointer forks.
84
+ * Support for Google Contacts API version 3 fields by draffensperger.
85
+ * Additional specs and empty GroupSet entry fix by Jeiwan.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.0
1
+ 0.7.1
@@ -2,14 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
+ # stub: google_contacts_api 0.7.1 ruby lib
5
6
 
6
7
  Gem::Specification.new do |s|
7
8
  s.name = "google_contacts_api"
8
- s.version = "0.7.0"
9
+ s.version = "0.7.1"
9
10
 
10
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib"]
11
13
  s.authors = ["Alvin Liang"]
12
- s.date = "2015-07-24"
14
+ s.date = "2016-01-05"
13
15
  s.description = "Lets you read from the Google Contacts API. Posting to come later."
14
16
  s.email = "ayliang@gmail.com"
15
17
  s.extra_rdoc_files = [
@@ -18,6 +20,7 @@ Gem::Specification.new do |s|
18
20
  ]
19
21
  s.files = [
20
22
  ".document",
23
+ ".rspec",
21
24
  ".travis.yml",
22
25
  "Gemfile",
23
26
  "LICENSE.txt",
@@ -37,21 +40,30 @@ Gem::Specification.new do |s|
37
40
  "lib/google_contacts_api/result_set.rb",
38
41
  "lib/google_contacts_api/user.rb",
39
42
  "lib/google_contacts_api/version.rb",
40
- "spec/contact_set.json",
41
- "spec/empty_contact_set.json",
42
- "spec/errors/auth_sub_401.html",
43
- "spec/google_contacts_api_spec.rb",
44
- "spec/group_set.json",
45
- "spec/spec_helper.rb"
43
+ "spec/fixtures/contact_set.json",
44
+ "spec/fixtures/empty_contact_set.json",
45
+ "spec/fixtures/empty_group_set.json",
46
+ "spec/fixtures/group_set.json",
47
+ "spec/lib/google_contacts_api/api_spec.rb",
48
+ "spec/lib/google_contacts_api/contact_set_spec.rb",
49
+ "spec/lib/google_contacts_api/contact_spec.rb",
50
+ "spec/lib/google_contacts_api/contacts_spec.rb",
51
+ "spec/lib/google_contacts_api/group_set_spec.rb",
52
+ "spec/lib/google_contacts_api/group_spec.rb",
53
+ "spec/lib/google_contacts_api/groups_spec.rb",
54
+ "spec/lib/google_contacts_api/result_set_spec.rb",
55
+ "spec/lib/google_contacts_api/result_spec.rb",
56
+ "spec/lib/google_contacts_api/user_spec.rb",
57
+ "spec/spec_helper.rb",
58
+ "spec/support/rspec_helpers.rb"
46
59
  ]
47
60
  s.homepage = "http://github.com/aliang/google_contacts_api"
48
61
  s.licenses = ["MIT"]
49
- s.require_paths = ["lib"]
50
- s.rubygems_version = "1.8.24"
62
+ s.rubygems_version = "2.4.8"
51
63
  s.summary = "Lets you read from the Google Contacts API"
52
64
 
53
65
  if s.respond_to? :specification_version then
54
- s.specification_version = 3
66
+ s.specification_version = 4
55
67
 
56
68
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
57
69
  s.add_runtime_dependency(%q<activesupport>, [">= 0"])
@@ -26,4 +26,4 @@ module GoogleContactsApi
26
26
  GoogleContactsApi::ContactSet.new(response.body, @api)
27
27
  end
28
28
  end
29
- end
29
+ end
@@ -3,7 +3,11 @@ module GoogleContactsApi
3
3
  # Initialize a GroupSet from an API response body that contains groups data
4
4
  def initialize(response_body, api = nil)
5
5
  super
6
- @results = @parsed.feed.entry.map { |e| GoogleContactsApi::Group.new(e, nil, api) }
6
+ if @parsed.nil? || @parsed.feed.nil? || @parsed.feed.entry.nil?
7
+ @results = []
8
+ else
9
+ @results = @parsed.feed.entry.map { |e| GoogleContactsApi::Group.new(e, nil, api) }
10
+ end
7
11
  end
8
12
  end
9
- end
13
+ end
@@ -0,0 +1,72 @@
1
+ {
2
+ "version": "1.0",
3
+ "encoding": "UTF-8",
4
+ "feed": {
5
+ "xmlns": "http://www.w3.org/2005/Atom",
6
+ "xmlns$openSearch": "http://a9.com/-/spec/opensearch/1.1/",
7
+ "xmlns$gContact": "http://schemas.google.com/contact/2008",
8
+ "xmlns$batch": "http://schemas.google.com/gdata/batch",
9
+ "xmlns$gd": "http://schemas.google.com/g/2005",
10
+ "gd$etag": "W/\"C0UESXY5eip7ImA9WhdTEkw.\"",
11
+ "id": {
12
+ "$t": "example@gmail.com"
13
+ },
14
+ "updated": {
15
+ "$t": "2011-07-09T11:33:28.822Z"
16
+ },
17
+ "category": [{
18
+ "scheme": "http://schemas.google.com/g/2005#kind",
19
+ "term": "http://schemas.google.com/contact/2008#group"
20
+ }],
21
+ "title": {
22
+ "$t": "Example User's Contact Groups"
23
+ },
24
+ "link": [{
25
+ "rel": "alternate",
26
+ "type": "text/html",
27
+ "href": "http://www.google.com/"
28
+ },
29
+ {
30
+ "rel": "http://schemas.google.com/g/2005#feed",
31
+ "type": "application/atom+xml",
32
+ "href": "https://www.google.com/m8/feeds/groups/example%40gmail.com/full"
33
+ },
34
+ {
35
+ "rel": "http://schemas.google.com/g/2005#post",
36
+ "type": "application/atom+xml",
37
+ "href": "https://www.google.com/m8/feeds/groups/example%40gmail.com/full"
38
+ },
39
+ {
40
+ "rel": "http://schemas.google.com/g/2005#batch",
41
+ "type": "application/atom+xml",
42
+ "href": "https://www.google.com/m8/feeds/groups/example%40gmail.com/full/batch"
43
+ },
44
+ {
45
+ "rel": "self",
46
+ "type": "application/atom+xml",
47
+ "href": "https://www.google.com/m8/feeds/groups/example%40gmail.com/full?alt\u003djson\u0026max-results\u003d25"
48
+ }],
49
+ "author": [{
50
+ "name": {
51
+ "$t": "Example User"
52
+ },
53
+ "email": {
54
+ "$t": "example@gmail.com"
55
+ }
56
+ }],
57
+ "generator": {
58
+ "version": "1.0",
59
+ "uri": "http://www.google.com/m8/feeds",
60
+ "$t": "Contacts"
61
+ },
62
+ "openSearch$totalResults": {
63
+ "$t": "0"
64
+ },
65
+ "openSearch$startIndex": {
66
+ "$t": "1"
67
+ },
68
+ "openSearch$itemsPerPage": {
69
+ "$t": "25"
70
+ }
71
+ }
72
+ }
@@ -210,4 +210,4 @@
210
210
  }]
211
211
  }]
212
212
  }
213
- }
213
+ }
@@ -0,0 +1,88 @@
1
+ class MockOAuth2Error < StandardError
2
+ attr_accessor :response
3
+
4
+ def initialize(response)
5
+ @response = response
6
+ end
7
+ end
8
+
9
+ describe GoogleContactsApi::Api do
10
+ describe '#get' do
11
+ context 'when all parameters are correct' do
12
+ before do
13
+ @oauth = double("oauth")
14
+ allow(@oauth).to receive(:get).and_return("get response")
15
+ @api = GoogleContactsApi::Api.new(@oauth)
16
+ end
17
+
18
+ context 'when version is not specified' do
19
+ it 'performs a get request using oauth returning json with version 3' do
20
+ expect(@oauth).to receive(:get).with(
21
+ GoogleContactsApi::Api::BASE_URL + "any_url?alt=json&param=param&v=3", {"header" => "header"})
22
+
23
+ expect(@api.get("any_url",
24
+ {"param" => "param"},
25
+ {"header" => "header"})).to eq("get response")
26
+ end
27
+ end
28
+
29
+ context 'when version is specified' do
30
+ it 'performs a get request using oauth with the version specified' do
31
+ expect(@oauth).to receive(:get).with(
32
+ GoogleContactsApi::Api::BASE_URL + "any_url?alt=json&param=param&v=2", {"header" => "header"})
33
+
34
+ expect(@api.get("any_url",
35
+ {"param" => "param", "v" => "2"},
36
+ {"header" => "header"})).to eq("get response")
37
+ end
38
+ end
39
+ end
40
+
41
+ context 'when OAuth 1.0 returns unauthorized' do
42
+ before do
43
+ @oauth = double("oauth")
44
+ allow(@oauth).to receive(:get).and_return(Net::HTTPUnauthorized.new("1.1", 401, "You're not authorized"))
45
+ @api = GoogleContactsApi::Api.new(@oauth)
46
+ end
47
+
48
+ it 'raises UnauthorizedError' do
49
+ expect { @api.get("any url",
50
+ {"param" => "param"},
51
+ {"header" => "header"}) }.to raise_error(GoogleContactsApi::UnauthorizedError)
52
+ end
53
+ end
54
+
55
+ context 'when OAuth 2.0 returns unauthorized' do
56
+ before do
57
+ @oauth = double("oauth")
58
+ allow(@oauth).to receive(:get).and_raise(MockOAuth2Error.new(OpenStruct.new(status: 401)))
59
+ @api = GoogleContactsApi::Api.new(@oauth)
60
+ end
61
+
62
+ it 'raises UnauthorizedError' do
63
+ expect { @api.get("any url",
64
+ {"param" => "param"},
65
+ {"header" => "header"}) }.to raise_error(GoogleContactsApi::UnauthorizedError)
66
+ end
67
+ end
68
+ end
69
+
70
+ describe "#parse_response_code" do
71
+ before(:all) do
72
+ @Oauth = Struct.new(:code)
73
+ @Oauth2 = Struct.new(:status)
74
+ end
75
+
76
+ it 'parses oauth gem response' do
77
+ expect(GoogleContactsApi::Api.parse_response_code(@Oauth.new("401"))).to eq(401)
78
+ end
79
+
80
+ it 'parses oauth2 gem response' do
81
+ expect(GoogleContactsApi::Api.parse_response_code(@Oauth2.new(401))).to eq(401)
82
+ end
83
+ end
84
+
85
+ pending "should perform a post request using oauth"
86
+ pending "should perform a put request using oauth"
87
+ pending "should perform a delete request using oauth"
88
+ end
@@ -0,0 +1,39 @@
1
+ describe GoogleContactsApi::ContactSet do
2
+ context "when entries are present" do
3
+ before(:all) do
4
+ @contact_set_json = contact_set_json
5
+ @contact_set = GoogleContactsApi::ContactSet.new(@contact_set_json)
6
+ end
7
+
8
+ specify "the right starting index is set" do
9
+ expect(@contact_set.start_index).to eq(1)
10
+ end
11
+
12
+ specify "the right number of results per page is set" do
13
+ expect(@contact_set.items_per_page).to eq(25)
14
+ end
15
+
16
+ specify "the right number of total results is set" do
17
+ expect(@contact_set.total_results).to eq(500)
18
+ end
19
+
20
+ specify "results are parsed into Contacts" do
21
+ expect(@contact_set.to_a.first).to be_instance_of(GoogleContactsApi::Contact)
22
+ end
23
+ end
24
+
25
+ context "when entries are not present" do
26
+ before(:all) do
27
+ @empty_contact_set_json = empty_contact_set_json
28
+ @empty_contact_set = GoogleContactsApi::ContactSet.new(@empty_contact_set_json)
29
+ end
30
+
31
+ specify "totals_results is equal to 0" do
32
+ expect(@empty_contact_set.total_results).to eq(0)
33
+ end
34
+
35
+ specify "@results variable is an empty array" do
36
+ expect(@empty_contact_set.instance_variable_get("@results")).to eq([])
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,420 @@
1
+ describe GoogleContactsApi::Contact do
2
+ subject { GoogleContactsApi::Contact.new(contact_json_hash) }
3
+
4
+ describe "#self_link" do
5
+ it "returns correct self_link" do
6
+ expect(subject.self_link).to eq("https://www.google.com/m8/feeds/contacts/example%40gmail.com/full/0")
7
+ end
8
+ end
9
+
10
+ describe "#photo_link_entry" do
11
+ it "returns correct photo_link_entry" do
12
+ expect(subject.photo_link_entry).to eq({
13
+ "rel" => "http://schemas.google.com/contacts/2008/rel#photo",
14
+ "type" => "image/*",
15
+ "href" => "https://www.google.com/m8/feeds/photos/media/example%40gmail.com/0",
16
+ "gd$etag" => "\"dxt2DAEZfCp7ImA-AV4zRxBoPG4UK3owXBM.\""
17
+ })
18
+ end
19
+ end
20
+
21
+ describe "#photo_link" do
22
+ it "returns correct photo_link" do
23
+ expect(subject.photo_link).to eq("https://www.google.com/m8/feeds/photos/media/example%40gmail.com/0")
24
+ end
25
+ end
26
+
27
+ describe "#edit_link" do
28
+ it "returns correct edit_link" do
29
+ expect(subject.edit_link).to eq("https://www.google.com/m8/feeds/contacts/example%40gmail.com/full/0")
30
+ end
31
+ end
32
+
33
+ describe "#edit_photo_link" do
34
+ it "returns correct edit_photo_link" do
35
+ # TODO: there isn't one in this contact, hahah
36
+ expect(subject.edit_photo_link).to eq(nil)
37
+ end
38
+ end
39
+
40
+ describe "#photo" do
41
+ it "fetches a photo" do
42
+ @oauth = double("oauth")
43
+ allow(@oauth).to receive(:get).and_return(Hashie::Mash.new({
44
+ "body" => "some response", # could use example response here
45
+ "code" => 200
46
+ }))
47
+ @api = double("api")
48
+ allow(@api).to receive(:oauth).and_return(@oauth)
49
+ @contact = GoogleContactsApi::Contact.new(contact_json_hash, nil, @api)
50
+
51
+ expect(@oauth).to receive("get").with(@contact.photo_link)
52
+
53
+ @contact.photo
54
+ end
55
+ end
56
+
57
+ describe "#photo_with_metadata" do
58
+ it "returns photo with metadata" do
59
+ @oauth = double("oauth")
60
+ allow(@oauth).to receive(:get).and_return(Hashie::Mash.new({
61
+ "body" => "some response",
62
+ "code" => 200,
63
+ "headers" => { "content-type" => "image/jpeg" }
64
+ }))
65
+ @api = double("api")
66
+ allow(@api).to receive(:oauth).and_return(@oauth)
67
+ @contact = GoogleContactsApi::Contact.new(contact_json_hash, nil, @api)
68
+
69
+ expect(@oauth).to receive("get").with(@contact.photo_link)
70
+ expect(@contact.photo_with_metadata).to eq(
71
+ data: 'some response',
72
+ etag: 'dxt2DAEZfCp7ImA-AV4zRxBoPG4UK3owXBM.',
73
+ content_type: 'image/jpeg'
74
+ )
75
+ end
76
+ end
77
+
78
+ describe "#emails" do
79
+ context 'when emails are specified' do
80
+ it "returns an array of emails" do
81
+ expect(subject.emails).to eq(["contact1@example.com"])
82
+ end
83
+ end
84
+
85
+ context 'when emails are not specified' do
86
+ it "returns an empty array" do
87
+ @contact = GoogleContactsApi::Contact.new(contact_no_emails_json_hash)
88
+ expect(@contact.emails).to eq([])
89
+ end
90
+ end
91
+ end
92
+
93
+ describe "#primary_email" do
94
+ context "when primary email is set" do
95
+ it "returns correct primary email" do
96
+ expect(subject.primary_email).to eq("contact1@example.com")
97
+ end
98
+ end
99
+
100
+ context "when primary email is not set" do
101
+ it "returns nil" do
102
+ @contact2 = GoogleContactsApi::Contact.new(contact_no_emails_json_hash)
103
+ expect(@contact2.primary_email).to be_nil
104
+ @contact3 = GoogleContactsApi::Contact.new(contact_no_primary_email_json_hash)
105
+ expect(@contact3.primary_email).to be_nil
106
+ end
107
+ end
108
+ end
109
+
110
+ describe "#ims" do
111
+ context "when instant messaging accounts are specified" do
112
+ it "returns instan messaging accounts" do
113
+ expect(subject.ims).to eq(["contact1@example.com"])
114
+ end
115
+ end
116
+
117
+ context "when instant messaging accounts are not specified" do
118
+ it "returns an empty array" do
119
+ @contact = GoogleContactsApi::Contact.new(contact_no_emails_json_hash)
120
+ expect(@contact.ims).to eq([])
121
+ end
122
+ end
123
+ end
124
+
125
+ #
126
+ describe 'Contacts API v3 fields' do
127
+ before do
128
+ @empty = GoogleContactsApi::Contact.new
129
+
130
+ @partly_empty = GoogleContactsApi::Contact.new(
131
+ 'gd$name' => {},
132
+ 'gContact$relation' => []
133
+ )
134
+
135
+ @contact_v3 = GoogleContactsApi::Contact.new(
136
+ 'gd$name' => {
137
+ 'gd$givenName' => { '$t' => 'John' },
138
+ 'gd$familyName' => { '$t' => 'Doe' },
139
+ 'gd$fullName' => { '$t' => 'John Doe' }
140
+ },
141
+ 'gContact$birthday' => {
142
+ 'when' => '1988-05-12'
143
+ },
144
+ 'gContact$relation' => [ { '$t' => 'Jane', 'rel' => 'spouse' } ],
145
+ 'gd$structuredPostalAddress' => [
146
+ {
147
+ 'gd$country' => { '$t' => 'United States of America' },
148
+ 'gd$formattedAddress' => { '$t' => "2345 Long Dr. #232\nSomwhere\nIL\n12345\nUnited States of America" },
149
+ 'gd$city' => { '$t' => 'Somwhere' },
150
+ 'gd$street' => { '$t' => '2345 Long Dr. #232' },
151
+ 'gd$region' => { '$t' => 'IL' },
152
+ 'gd$postcode' => { '$t' => '12345' }
153
+ },
154
+ {
155
+ 'rel' => 'http://schemas.google.com/g/2005#home',
156
+ 'primary' => 'true',
157
+ 'gd$country' => { '$t' => 'United States of America' },
158
+ 'gd$formattedAddress' => { '$t' => "123 Far Ln.\nAnywhere\nMO\n67891\nUnited States of America" },
159
+ 'gd$city' => { '$t' => 'Anywhere' },
160
+ 'gd$street' => { '$t' => '123 Far Ln.' }
161
+ }
162
+ ],
163
+ 'gd$email' => [
164
+ {
165
+ 'primary' => 'true',
166
+ 'rel' => 'http://schemas.google.com/g/2005#other',
167
+ 'address' => 'johnsmith@example.com'
168
+ }
169
+ ],
170
+ 'gd$phoneNumber' => [
171
+ {
172
+ 'primary' => 'true',
173
+ '$t' => '(123) 334-5158',
174
+ 'rel' => 'http://schemas.google.com/g/2005#mobile'
175
+ }
176
+ ],
177
+ 'gd$organization' => [
178
+ {
179
+ 'gd$orgTitle' => { '$t' => 'Worker Person' },
180
+ 'gd$orgName' => { '$t' => 'Example, Inc' },
181
+ 'rel' => 'http://schemas.google.com/g/2005#other'
182
+ }
183
+ ],
184
+ 'gContact$groupMembershipInfo' => [
185
+ {
186
+ 'deleted' => 'false',
187
+ 'href' => 'http://www.google.com/m8/feeds/groups/test.user%40gmail.com/base/111'
188
+ },
189
+ {
190
+ 'deleted' => 'true',
191
+ 'href' => 'http://www.google.com/m8/feeds/groups/test.user%40gmail.com/base/222'
192
+ }
193
+ ]
194
+ )
195
+ end
196
+
197
+ describe '#nested_t_field_or_nil' do
198
+ context "when nested fields are present" do
199
+ it "returns correct value" do
200
+ expect(@contact_v3.nested_t_field_or_nil('gd$name', 'gd$givenName')).to eq('John')
201
+ end
202
+ end
203
+
204
+ context "when nested fields are not present" do
205
+ it "returns nil" do
206
+ expect(@empty.nested_t_field_or_nil('gd$name', 'gd$givenName')).to be_nil
207
+ expect(@partly_empty.nested_t_field_or_nil('gd$name', 'gd$givenName')).to be_nil
208
+ end
209
+ end
210
+ end
211
+
212
+ describe "#given_name" do
213
+ it "returns given name" do
214
+ expect(@contact_v3.given_name).to eq('John')
215
+ end
216
+ end
217
+
218
+ describe "#family_name" do
219
+ it "returns family name" do
220
+ expect(@contact_v3.family_name).to eq('Doe')
221
+ end
222
+ end
223
+
224
+ describe "#full_name" do
225
+ it "returns full name" do
226
+ expect(@contact_v3).to receive(:nested_t_field_or_nil).with('gd$name', 'gd$fullName').and_return('val')
227
+ expect(@contact_v3.full_name).to eq('val')
228
+ end
229
+ end
230
+
231
+ describe "#phone_numbers" do
232
+ it "returns an array of phone numbers" do
233
+ expect(@contact_v3.phone_numbers).to eq ["(123) 334-5158"]
234
+ end
235
+ end
236
+
237
+ describe "#relations" do
238
+ context "when relations are set" do
239
+ it "returns relations" do
240
+ expect(@contact_v3.relations).to eq([ { '$t' => 'Jane', 'rel' => 'spouse' } ])
241
+ end
242
+ end
243
+
244
+ context "when relations are not set" do
245
+ it "returns an empty array" do
246
+ expect(@empty.relations).to eq([])
247
+ expect(@partly_empty.relations).to eq([])
248
+ end
249
+ end
250
+ end
251
+
252
+ describe "#spouse" do
253
+ context "when spouse is set" do
254
+ it "returns spouse" do
255
+ expect(@contact_v3.spouse).to eq('Jane')
256
+ end
257
+ end
258
+
259
+ context "when spouse is not set" do
260
+ it "returns nil" do
261
+ expect(@empty.spouse).to be_nil
262
+ expect(@partly_empty.spouse).to be_nil
263
+ end
264
+ end
265
+ end
266
+
267
+ describe "#birthday" do
268
+ context "when full birthday is set" do
269
+ it "returns full birthday" do
270
+ expect(@contact_v3.birthday).to eq({ year: 1988, month: 5, day: 12 })
271
+ end
272
+ end
273
+
274
+ context "when year is not specified" do
275
+ it "returns partial birthday" do
276
+ contact_birthday_no_year = GoogleContactsApi::Contact.new('gContact$birthday' => { 'when' => '--05-12' })
277
+ expect(contact_birthday_no_year.birthday).to eq({ year: nil, month: 5, day: 12 })
278
+ end
279
+ end
280
+
281
+ context "when birthday is not set" do
282
+ it "returns nil" do
283
+ expect(@empty.birthday).to be_nil
284
+ end
285
+ end
286
+ end
287
+
288
+ describe "#addresses" do
289
+ context "when addresses are specified" do
290
+ it "returns addresses" do
291
+ formatted_addresses = [
292
+ { rel: 'work', primary: false, country: 'United States of America', city: 'Somwhere', street: '2345 Long Dr. #232',
293
+ region: 'IL', postcode: '12345' },
294
+ { rel: 'home', primary: true, country: 'United States of America', city: 'Anywhere', street: '123 Far Ln.',
295
+ region: nil, postcode: nil }
296
+ ]
297
+ expect(@contact_v3.addresses).to eq(formatted_addresses)
298
+ end
299
+ end
300
+
301
+ context "when addresses are not specified" do
302
+ it "returns an empty arary" do
303
+ expect(@empty.addresses).to eq([])
304
+ end
305
+ end
306
+ end
307
+
308
+ describe "#phone_numbers_full" do
309
+ context "when phone numbers are specified" do
310
+ it "returns full phone numbers" do
311
+ expect(@contact_v3.phone_numbers_full).to eq([ { :primary => true, :number => '(123) 334-5158', :rel => 'mobile' } ])
312
+ end
313
+ end
314
+
315
+ context "when phone numbers are not specified" do
316
+ it "returns an empty array" do
317
+ expect(@empty.phone_numbers_full).to eq([])
318
+ end
319
+ end
320
+ end
321
+
322
+ describe "#gourp_membership_info" do
323
+ context "when gourp membership info is specified" do
324
+ it "returns gourp membership info" do
325
+ group_membership_info = [
326
+ { deleted: false, href: 'http://www.google.com/m8/feeds/groups/test.user%40gmail.com/base/111' },
327
+ { deleted: true, href: 'http://www.google.com/m8/feeds/groups/test.user%40gmail.com/base/222' }
328
+ ]
329
+ expect(@contact_v3.group_membership_info).to eq(group_membership_info)
330
+ end
331
+ end
332
+
333
+ context "when gourp membership info is not specified" do
334
+ it "returns an empty array" do
335
+ expect(@empty.group_membership_info).to eq([])
336
+ end
337
+ end
338
+ end
339
+
340
+ describe "#organizations" do
341
+ context "when organizations are specified" do
342
+ it "returns organizations" do
343
+ formatted_organizations = [
344
+ {
345
+ org_title: 'Worker Person',
346
+ org_name: 'Example, Inc',
347
+ primary: false,
348
+ rel: 'other'
349
+ }
350
+ ]
351
+ expect(@contact_v3.organizations).to eq(formatted_organizations)
352
+ end
353
+ end
354
+
355
+ context "when organizations is not specified" do
356
+ it "returns an empty array" do
357
+ expect(@empty.organizations).to eq([])
358
+ end
359
+ end
360
+ end
361
+
362
+ describe "#emails_full" do
363
+ context "when emails are specified" do
364
+ it "returns emails" do
365
+ expect(@contact_v3.emails_full).to eq([ { :primary => true, :address => 'johnsmith@example.com', :rel => 'other' } ])
366
+ end
367
+ end
368
+
369
+ context "when emails is not specified" do
370
+ it "returns an empty array" do
371
+ expect(@empty.emails_full).to eq([])
372
+ end
373
+ end
374
+ end
375
+
376
+ describe '#group_memberships' do
377
+ it "returns group memberships" do
378
+ expect(@contact_v3.group_memberships).to eq(['http://www.google.com/m8/feeds/groups/test.user%40gmail.com/base/111'])
379
+ end
380
+ end
381
+
382
+ describe "#deleted_group_memberships" do
383
+ it "returns deleted group memberships" do
384
+ expect(@contact_v3.deleted_group_memberships).to eq(['http://www.google.com/m8/feeds/groups/test.user%40gmail.com/base/222'])
385
+ end
386
+ end
387
+ end
388
+
389
+ # The Google Contacts API (https://developers.google.com/gdata/docs/2.0/elements)
390
+ # specifies an optional yomi field for orgName, givenName, additionalName and familyName
391
+ it 'handles Japanese yomigana "yomi" name values' do
392
+ contact_params = {
393
+ 'gd$name' => {
394
+ 'gd$givenName' => {'$t' => 'John' },
395
+ 'gd$additionalName' => {'$t' => 'Text name', 'yomi' => 'And yomi chars' },
396
+ 'gd$familyName' => { 'yomi' => 'Yomi chars only' },
397
+ },
398
+ 'gd$organization' => [{
399
+ 'rel' => 'http://schemas.google.com/g/2005#other',
400
+ 'primary' => 'true',
401
+ 'gd$orgName' => {
402
+ 'yomi' => 'Yomigana'
403
+ }
404
+ }],
405
+ }
406
+ contact = GoogleContactsApi::Contact.new(contact_params, nil, @api)
407
+
408
+ expect(contact.given_name).to eq('John')
409
+ expect(contact.given_name_yomi).to be_nil
410
+
411
+ expect(contact.additional_name).to eq('Text name')
412
+ expect(contact.additional_name_yomi).to eq('And yomi chars')
413
+
414
+ expect(contact.family_name).to be_nil
415
+ expect(contact.family_name_yomi).to eq('Yomi chars only')
416
+
417
+ expect(contact.organizations.first[:org_name]).to be_nil
418
+ expect(contact.organizations.first[:org_name_yomi]).to eq('Yomigana')
419
+ end
420
+ end