omnigroupcontacts 0.3.10 → 0.3.11
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 +4 -4
- data/.gitignore +6 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +39 -0
- data/README.md +132 -0
- data/Rakefile +7 -0
- data/lib/omnigroupcontacts.rb +19 -0
- data/lib/omnigroupcontacts/authorization/oauth1.rb +122 -0
- data/lib/omnigroupcontacts/authorization/oauth2.rb +87 -0
- data/lib/omnigroupcontacts/builder.rb +30 -0
- data/lib/omnigroupcontacts/http_utils.rb +101 -0
- data/lib/omnigroupcontacts/importer.rb +5 -0
- data/lib/omnigroupcontacts/importer/gmailgroup.rb +238 -0
- data/lib/omnigroupcontacts/integration_test.rb +36 -0
- data/lib/omnigroupcontacts/middleware/base_oauth.rb +120 -0
- data/lib/omnigroupcontacts/middleware/oauth1.rb +70 -0
- data/lib/omnigroupcontacts/middleware/oauth2.rb +80 -0
- data/lib/omnigroupcontacts/parse_utils.rb +56 -0
- data/omnigroupcontacts-0.3.10.gem +0 -0
- data/omnigroupcontacts-0.3.8.gem +0 -0
- data/omnigroupcontacts-0.3.9.gem +0 -0
- data/omnigroupcontacts.gemspec +25 -0
- data/spec/omnicontacts/authorization/oauth1_spec.rb +82 -0
- data/spec/omnicontacts/authorization/oauth2_spec.rb +92 -0
- data/spec/omnicontacts/http_utils_spec.rb +79 -0
- data/spec/omnicontacts/importer/facebook_spec.rb +120 -0
- data/spec/omnicontacts/importer/gmail_spec.rb +194 -0
- data/spec/omnicontacts/importer/hotmail_spec.rb +106 -0
- data/spec/omnicontacts/importer/linkedin_spec.rb +67 -0
- data/spec/omnicontacts/importer/yahoo_spec.rb +124 -0
- data/spec/omnicontacts/integration_test_spec.rb +51 -0
- data/spec/omnicontacts/middleware/base_oauth_spec.rb +53 -0
- data/spec/omnicontacts/middleware/oauth1_spec.rb +78 -0
- data/spec/omnicontacts/middleware/oauth2_spec.rb +67 -0
- data/spec/omnicontacts/parse_utils_spec.rb +53 -0
- data/spec/spec_helper.rb +12 -0
- metadata +37 -2
@@ -0,0 +1,120 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "omnigroupcontacts/importer/facebook"
|
3
|
+
|
4
|
+
describe OmniGroupContacts::Importer::Facebook do
|
5
|
+
|
6
|
+
let(:facebook) { OmniGroupContacts::Importer::Facebook.new({}, "client_id", "client_secret") }
|
7
|
+
|
8
|
+
let(:self_response) {
|
9
|
+
'{
|
10
|
+
"first_name":"Chris",
|
11
|
+
"last_name":"Johnson",
|
12
|
+
"name":"Chris Johnson",
|
13
|
+
"id":"543216789",
|
14
|
+
"gender":"male",
|
15
|
+
"birthday":"06/21/1982",
|
16
|
+
"significant_other":{"id": "243435322"},
|
17
|
+
"relationship_status": "Married",
|
18
|
+
"picture":{"data":{"url":"http://profile.ak.fbcdn.net/hprofile-ak-snc6/186364_543216789_2089044200_q.jpg","is_silhouette":false}},
|
19
|
+
"email": "chrisjohnson@gmail.com"
|
20
|
+
}'
|
21
|
+
}
|
22
|
+
|
23
|
+
let(:spouse_response) {
|
24
|
+
'{
|
25
|
+
"first_name":"Mary",
|
26
|
+
"last_name":"Johnson",
|
27
|
+
"name":"Mary Johnson",
|
28
|
+
"id":"243435322",
|
29
|
+
"gender":"female",
|
30
|
+
"birthday":"01/21",
|
31
|
+
"picture":{"data":{"url":"http://profile.ak.fbcdn.net/hprofile-ak-snc6/186364_243435322_2089044200_q.jpg","is_silhouette":false}}
|
32
|
+
}'
|
33
|
+
}
|
34
|
+
|
35
|
+
let(:contacts_as_json) {
|
36
|
+
'{"data":[
|
37
|
+
{
|
38
|
+
"first_name":"John",
|
39
|
+
"last_name":"Smith",
|
40
|
+
"name":"John Smith",
|
41
|
+
"id":"608061886",
|
42
|
+
"gender":"male",
|
43
|
+
"birthday":"06/21",
|
44
|
+
"relationship":"cousin",
|
45
|
+
"picture":{"data":{"url":"http://profile.ak.fbcdn.net/hprofile-ak-snc6/186364_608061886_2089044200_q.jpg","is_silhouette":false}}
|
46
|
+
}
|
47
|
+
]
|
48
|
+
}' }
|
49
|
+
|
50
|
+
describe "fetch_contacts_using_access_token" do
|
51
|
+
let(:token) { "token" }
|
52
|
+
let(:token_type) { "token_type" }
|
53
|
+
|
54
|
+
before(:each) do
|
55
|
+
facebook.instance_variable_set(:@env, {})
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should request the contacts by providing the token in the url" do
|
59
|
+
facebook.should_receive(:https_get) do |host, self_path, params, headers|
|
60
|
+
params[:access_token].should eq(token)
|
61
|
+
params[:fields].should eq('first_name,last_name,name,id,gender,birthday,picture,relationship_status,significant_other,email')
|
62
|
+
self_response
|
63
|
+
end
|
64
|
+
facebook.should_receive(:https_get) do |host, spouse_path, params, headers|
|
65
|
+
params[:access_token].should eq(token)
|
66
|
+
params[:fields].should eq('first_name,last_name,name,id,gender,birthday,picture')
|
67
|
+
spouse_response
|
68
|
+
end
|
69
|
+
facebook.should_receive(:https_get) do |host, path, params, headers|
|
70
|
+
params[:access_token].should eq(token)
|
71
|
+
params[:fields].should eq('first_name,last_name,name,id,gender,birthday,picture,relationship')
|
72
|
+
contacts_as_json
|
73
|
+
end.exactly(1).times
|
74
|
+
facebook.should_receive(:https_get) do |host, path, params, headers|
|
75
|
+
params[:access_token].should eq(token)
|
76
|
+
params[:fields].should eq('first_name,last_name,name,id,gender,birthday,picture')
|
77
|
+
contacts_as_json
|
78
|
+
end.exactly(1).times
|
79
|
+
|
80
|
+
facebook.fetch_contacts_using_access_token token, token_type
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should correctly parse id, name,email,gender, birthday, profile picture and relation" do
|
84
|
+
1.times { facebook.should_receive(:https_get).and_return(self_response) }
|
85
|
+
1.times { facebook.should_receive(:https_get) }
|
86
|
+
2.times { facebook.should_receive(:https_get).and_return(contacts_as_json) }
|
87
|
+
result = facebook.fetch_contacts_using_access_token token, token_type
|
88
|
+
result.size.should be(1)
|
89
|
+
result.first[:id].should eq('608061886')
|
90
|
+
result.first[:first_name].should eq('John')
|
91
|
+
result.first[:last_name].should eq('Smith')
|
92
|
+
result.first[:name].should eq('John Smith')
|
93
|
+
result.first[:email].should be_nil
|
94
|
+
result.first[:gender].should eq('male')
|
95
|
+
result.first[:birthday].should eq({:day=>21, :month=>06, :year=>nil})
|
96
|
+
result.first[:profile_picture].should eq('https://graph.facebook.com/608061886/picture')
|
97
|
+
result.first[:relation].should eq('cousin')
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should correctly parse and set logged in user information" do
|
101
|
+
1.times { facebook.should_receive(:https_get).and_return(self_response) }
|
102
|
+
1.times { facebook.should_receive(:https_get) }
|
103
|
+
2.times { facebook.should_receive(:https_get).and_return(contacts_as_json) }
|
104
|
+
|
105
|
+
facebook.fetch_contacts_using_access_token token, token_type
|
106
|
+
|
107
|
+
user = facebook.instance_variable_get(:@env)["omnigroupcontacts.user"]
|
108
|
+
user.should_not be_nil
|
109
|
+
user[:id].should eq("543216789")
|
110
|
+
user[:first_name].should eq("Chris")
|
111
|
+
user[:last_name].should eq("Johnson")
|
112
|
+
user[:name].should eq("Chris Johnson")
|
113
|
+
user[:email].should eq("chrisjohnson@gmail.com")
|
114
|
+
user[:gender].should eq("male")
|
115
|
+
user[:birthday].should eq({:day=>21, :month=>06, :year=>1982})
|
116
|
+
user[:profile_picture].should eq("https://graph.facebook.com/543216789/picture")
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
@@ -0,0 +1,194 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "omnigroupcontacts/importer/gmail"
|
3
|
+
|
4
|
+
describe OmniGroupContacts::Importer::Gmail do
|
5
|
+
|
6
|
+
let(:gmail) { OmniGroupContacts::Importer::Gmail.new({}, "client_id", "client_secret") }
|
7
|
+
|
8
|
+
let(:gmail_with_scope_args) { OmniGroupContacts::Importer::Gmail.new({}, "client_id", "client_secret", {scope: "https://www.google.com/m8/feeds https://www.googleapis.com/auth/userinfo#email https://www.googleapis.com/auth/contacts.readonly"}) }
|
9
|
+
|
10
|
+
let(:self_response) {
|
11
|
+
'{
|
12
|
+
"id":"16482944006464829443",
|
13
|
+
"email":"chrisjohnson@gmail.com",
|
14
|
+
"name":"Chris Johnson",
|
15
|
+
"given_name":"Chris",
|
16
|
+
"family_name":"Johnson",
|
17
|
+
"picture":"https://lh3.googleusercontent.com/-b8aFbTBM/AAAAAAI/IWA/vsek/photo.jpg",
|
18
|
+
"gender":"male",
|
19
|
+
"birthday":"1982-06-21"
|
20
|
+
}'
|
21
|
+
}
|
22
|
+
|
23
|
+
let(:contacts_as_json) {
|
24
|
+
'{"version":"1.0","encoding":"UTF-8",
|
25
|
+
"feed":{
|
26
|
+
"xmlns":"http://www.w3.org/2005/Atom",
|
27
|
+
"xmlns$openSearch":"http://a9.com/-/spec/opensearch/1.1/",
|
28
|
+
"xmlns$gContact":"http://schemas.google.com/contact/2008",
|
29
|
+
"xmlns$batch":"http://schemas.google.com/gdata/batch",
|
30
|
+
"xmlns$gd":"http://schemas.google.com/g/2005",
|
31
|
+
"gd$etag":"W/\"C0YHRno7fSt7I2A9WhBSQ0Q.\"",
|
32
|
+
|
33
|
+
"id":{"$t":"logged_in_user@gmail.com"},
|
34
|
+
"updated":{"$t":"2013-02-20T20:12:17.405Z"},
|
35
|
+
"category":[{
|
36
|
+
"scheme":"http://schemas.google.com/g/2005#kind",
|
37
|
+
"term":"http://schemas.google.com/contact/2008#contact"
|
38
|
+
}],
|
39
|
+
|
40
|
+
"title":{"$t":"Users\'s Contacts"},
|
41
|
+
"link":[
|
42
|
+
{"rel":"alternate","type":"text/html","href":"http://www.google.com/"},
|
43
|
+
{"rel":"http://schemas.google.com/g/2005#feed","type":"application/atom+xml","href":"https://www.google.com/m8/feeds/contacts/logged_in_user%40gmail.com/full"},
|
44
|
+
{"rel":"http://schemas.google.com/g/2005#post","type":"application/atom+xml","href":"https://www.google.com/m8/feeds/contacts/logged_in_user%40gmail.com/full"},
|
45
|
+
{"rel":"http://schemas.google.com/g/2005#batch","type":"application/atom+xml","href":"https://www.google.com/m8/feeds/contacts/logged_in_user%40gmail.com/full/batch"},
|
46
|
+
{"rel":"self","type":"application/atom+xml","href":"https://www.google.com/m8/feeds/contacts/logged_in_user%40gmail.com/full?alt\u003djson\u0026max-results\u003d1"},
|
47
|
+
{"rel":"next","type":"application/atom+xml","href":"https://www.google.com/m8/feeds/contacts/logged_in_user%40gmail.com/full?alt\u003djson\u0026start-index\u003d2\u0026max-results\u003d1"}
|
48
|
+
],
|
49
|
+
"author":[{"name":{"$t":"Edward"},"email":{"$t":"logged_in_user@gmail.com"}}],
|
50
|
+
"generator":{"version":"1.0","uri":"http://www.google.com/m8/feeds","$t":"Contacts"},
|
51
|
+
"openSearch$totalResults":{"$t":"1007"},
|
52
|
+
"openSearch$startIndex":{"$t":"1"},
|
53
|
+
"openSearch$itemsPerPage":{"$t":"1"},
|
54
|
+
"entry":[
|
55
|
+
{
|
56
|
+
"gd$etag":"\"R3oyfDVSLyt7I2A9WhBTSEULRA0.\"",
|
57
|
+
"id":{"$t":"http://www.google.com/m8/feeds/contacts/logged_in_user%40gmail.com/base/1"},
|
58
|
+
"updated":{"$t":"2013-02-14T22:36:36.494Z"},
|
59
|
+
"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-02-14T22:36:36.494Z"},
|
60
|
+
"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/contact/2008#contact"}],
|
61
|
+
"title":{"$t":"Edward Bennet"},
|
62
|
+
"link":[
|
63
|
+
{"rel":"http://schemas.google.com/contacts/2008/rel#photo","type":"image/*","href":"https://www.google.com/m8/feeds/photos/media/logged_in_user%40gmail.com/1"},
|
64
|
+
{"rel":"self","type":"application/atom+xml","href":"https://www.google.com/m8/feeds/contacts/logged_in_user%40gmail.com/full/1"},
|
65
|
+
{"rel":"edit","type":"application/atom+xml","href":"https://www.google.com/m8/feeds/contacts/logged_in_user%40gmail.com/full/1"}
|
66
|
+
],
|
67
|
+
"gd$name":{
|
68
|
+
"gd$fullName":{"$t":"Edward Bennet"},
|
69
|
+
"gd$givenName":{"$t":"Edward"},
|
70
|
+
"gd$familyName":{"$t":"Bennet"}
|
71
|
+
},
|
72
|
+
"gd$organization":[{"rel":"http://schemas.google.com/g/2005#other","gd$orgName":{"$t":"Google"},"gd$orgTitle":{"$t":"Master Developer"}}],
|
73
|
+
"gContact$birthday":{"when":"1954-07-02"},
|
74
|
+
"gContact$relation":{"rel":"father"},
|
75
|
+
"gContact$gender":{"value":"male"},
|
76
|
+
"gContact$event":[{"rel":"anniversary","gd$when":{"startTime":"1983-04-21"}},{"label":"New Job","gd$when":{"startTime":"2014-12-01"}}],
|
77
|
+
"gd$email":[{"rel":"http://schemas.google.com/g/2005#other","address":"bennet@gmail.com","primary":"true"}],
|
78
|
+
"gContact$groupMembershipInfo":[{"deleted":"false","href":"http://www.google.com/m8/feeds/groups/logged_in_user%40gmail.com/base/6"}],
|
79
|
+
"gd$structuredPostalAddress":[{"rel":"http://schemas.google.com/g/2005#home","gd$formattedAddress":{"$t":"1313 Trashview Court\nApt. 13\nNowheresville, OK 66666"},"gd$street":{"$t":"1313 Trashview Court\nApt. 13"},"gd$postcode":{"$t":"66666"},"gd$country":{"code":"VA","$t":"Valoran"},"gd$city":{"$t":"Nowheresville"},"gd$region":{"$t":"OK"}}],
|
80
|
+
"gd$phoneNumber":[{"rel":"http://schemas.google.com/g/2005#mobile","uri":"tel:+34-653-15-76-88","$t":"653157688"}]
|
81
|
+
},
|
82
|
+
{
|
83
|
+
"gd$etag":"\"R3oyfDVSLyt7I2A9WhBTSEULRA0.\"",
|
84
|
+
"id":{"$t":"http://www.google.com/m8/feeds/contacts/logged_in_user%40gmail.com/base/1"},
|
85
|
+
"updated":{"$t":"2013-02-15T22:36:36.494Z"},
|
86
|
+
"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-02-15T22:36:36.494Z"},
|
87
|
+
"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/contact/2008#contact"}],
|
88
|
+
"title":{"$t":"Emilia Fox"},
|
89
|
+
"link":[
|
90
|
+
{"rel":"http://schemas.google.com/contacts/2008/rel#photo","type":"image/*","href":"https://www.google.com/m8/feeds/photos/media/logged_in_user%40gmail.com/1"},
|
91
|
+
{"rel":"self","type":"application/atom+xml","href":"https://www.google.com/m8/feeds/contacts/logged_in_user%40gmail.com/full/1"},
|
92
|
+
{"rel":"edit","type":"application/atom+xml","href":"https://www.google.com/m8/feeds/contacts/logged_in_user%40gmail.com/full/1"}
|
93
|
+
],
|
94
|
+
"gd$name":{
|
95
|
+
"gd$fullName":{"$t":"Emilia Fox"},
|
96
|
+
"gd$givenName":{"$t":"Emilia"},
|
97
|
+
"gd$familyName":{"$t":"Fox"}
|
98
|
+
},
|
99
|
+
"gContact$birthday":{"when":"1974-02-10"},
|
100
|
+
"gContact$relation":[{"rel":"spouse"}],
|
101
|
+
"gContact$gender":{"value":"female"},
|
102
|
+
"gd$email":[{"rel":"http://schemas.google.com/g/2005#other","address":"emilia.fox@gmail.com","primary":"true"}],
|
103
|
+
"gContact$groupMembershipInfo":[{"deleted":"false","href":"http://www.google.com/m8/feeds/groups/logged_in_user%40gmail.com/base/6"}]
|
104
|
+
}]
|
105
|
+
}
|
106
|
+
}'
|
107
|
+
}
|
108
|
+
|
109
|
+
describe "fetch_contacts_using_access_token" do
|
110
|
+
let(:token) { "token" }
|
111
|
+
let(:token_type) { "token_type" }
|
112
|
+
|
113
|
+
before(:each) do
|
114
|
+
gmail.instance_variable_set(:@env, {})
|
115
|
+
gmail_with_scope_args.instance_variable_set(:@env, {})
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should request the contacts by specifying version and code in the http headers" do
|
119
|
+
gmail.should_receive(:https_get) do |host, path, params, headers|
|
120
|
+
headers["GData-Version"].should eq("3.0")
|
121
|
+
headers["Authorization"].should eq("#{token_type} #{token}")
|
122
|
+
self_response
|
123
|
+
end
|
124
|
+
gmail.should_receive(:https_get) do |host, path, params, headers|
|
125
|
+
headers["GData-Version"].should eq("3.0")
|
126
|
+
headers["Authorization"].should eq("#{token_type} #{token}")
|
127
|
+
contacts_as_json
|
128
|
+
end
|
129
|
+
gmail.fetch_contacts_using_access_token token, token_type
|
130
|
+
|
131
|
+
gmail.scope.should eq "https://www.google.com/m8/feeds https://www.googleapis.com/auth/userinfo#email https://www.googleapis.com/auth/userinfo.profile"
|
132
|
+
gmail_with_scope_args.scope.should eq "https://www.google.com/m8/feeds https://www.googleapis.com/auth/userinfo#email https://www.googleapis.com/auth/contacts.readonly"
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should correctly parse id, name, email, gender, birthday, profile picture and relation for 1st contact" do
|
136
|
+
gmail.should_receive(:https_get)
|
137
|
+
gmail.should_receive(:https_get).and_return(contacts_as_json)
|
138
|
+
result = gmail.fetch_contacts_using_access_token token, token_type
|
139
|
+
|
140
|
+
result.size.should be(2)
|
141
|
+
result.first[:id].should eq('http://www.google.com/m8/feeds/contacts/logged_in_user%40gmail.com/base/1')
|
142
|
+
result.first[:first_name].should eq('Edward')
|
143
|
+
result.first[:last_name].should eq('Bennet')
|
144
|
+
result.first[:name].should eq("Edward Bennet")
|
145
|
+
result.first[:email].should eq("bennet@gmail.com")
|
146
|
+
result.first[:gender].should eq("male")
|
147
|
+
result.first[:birthday].should eq({:day=>02, :month=>07, :year=>1954})
|
148
|
+
result.first[:relation].should eq('father')
|
149
|
+
result.first[:profile_picture].should eq("https://profiles.google.com/s2/photos/profile/bennet")
|
150
|
+
result.first[:dates][0][:name].should eq("anniversary")
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should correctly parse id, name, email, gender, birthday, profile picture, snailmail address, phone and relation for 2nd contact" do
|
154
|
+
gmail.should_receive(:https_get)
|
155
|
+
gmail.should_receive(:https_get).and_return(contacts_as_json)
|
156
|
+
result = gmail.fetch_contacts_using_access_token token, token_type
|
157
|
+
result.size.should be(2)
|
158
|
+
result.last[:id].should eq('http://www.google.com/m8/feeds/contacts/logged_in_user%40gmail.com/base/1')
|
159
|
+
result.last[:first_name].should eq('Emilia')
|
160
|
+
result.last[:last_name].should eq('Fox')
|
161
|
+
result.last[:name].should eq("Emilia Fox")
|
162
|
+
result.last[:email].should eq("emilia.fox@gmail.com")
|
163
|
+
result.last[:gender].should eq("female")
|
164
|
+
result.last[:birthday].should eq({:day=>10, :month=>02, :year=>1974})
|
165
|
+
result.last[:profile_picture].should eq("https://profiles.google.com/s2/photos/profile/emilia.fox")
|
166
|
+
result.last[:relation].should eq('spouse')
|
167
|
+
result.first[:address_1].should eq('1313 Trashview Court')
|
168
|
+
result.first[:address_2].should eq('Apt. 13')
|
169
|
+
result.first[:city].should eq('Nowheresville')
|
170
|
+
result.first[:region].should eq('OK')
|
171
|
+
result.first[:country].should eq('VA')
|
172
|
+
result.first[:postcode].should eq('66666')
|
173
|
+
result.first[:phone_number].should eq('653157688')
|
174
|
+
end
|
175
|
+
|
176
|
+
it "should correctly parse and set logged in user information" do
|
177
|
+
gmail.should_receive(:https_get).and_return(self_response)
|
178
|
+
gmail.should_receive(:https_get).and_return(contacts_as_json)
|
179
|
+
|
180
|
+
gmail.fetch_contacts_using_access_token token, token_type
|
181
|
+
|
182
|
+
user = gmail.instance_variable_get(:@env)["omnigroupcontacts.user"]
|
183
|
+
user.should_not be_nil
|
184
|
+
user[:id].should eq("16482944006464829443")
|
185
|
+
user[:first_name].should eq("Chris")
|
186
|
+
user[:last_name].should eq("Johnson")
|
187
|
+
user[:name].should eq("Chris Johnson")
|
188
|
+
user[:email].should eq("chrisjohnson@gmail.com")
|
189
|
+
user[:gender].should eq("male")
|
190
|
+
user[:birthday].should eq({:day=>21, :month=>06, :year=>1982})
|
191
|
+
user[:profile_picture].should eq("https://profiles.google.com/s2/photos/profile/16482944006464829443")
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "omnigroupcontacts/importer/hotmail"
|
3
|
+
|
4
|
+
describe OmniGroupContacts::Importer::Hotmail do
|
5
|
+
|
6
|
+
let(:permissions) { "perm1, perm2" }
|
7
|
+
let(:hotmail) { OmniGroupContacts::Importer::Hotmail.new({}, "client_id", "client_secret", {:permissions => permissions}) }
|
8
|
+
|
9
|
+
let(:self_response) {
|
10
|
+
'{
|
11
|
+
"id": "4502de12390223d0",
|
12
|
+
"name": "Chris Johnson",
|
13
|
+
"first_name": "Chris",
|
14
|
+
"last_name": "Johnson",
|
15
|
+
"birth_day": 21,
|
16
|
+
"birth_month": 6,
|
17
|
+
"birth_year": 1982,
|
18
|
+
"gender": null,
|
19
|
+
"emails": {"preferred":"chrisjohnson@gmail.com", "account":"chrisjohn@gmail.com", "personal":null, "business":null}
|
20
|
+
}'
|
21
|
+
}
|
22
|
+
|
23
|
+
let(:contacts_as_json) {
|
24
|
+
'{
|
25
|
+
"data": [
|
26
|
+
{
|
27
|
+
"id": "contact.7fac34bb000000000000000000000000",
|
28
|
+
"first_name": "John",
|
29
|
+
"last_name": "Smith",
|
30
|
+
"name": "John Smith",
|
31
|
+
"gender": null,
|
32
|
+
"user_id": "123456",
|
33
|
+
"is_friend": false,
|
34
|
+
"is_favorite": false,
|
35
|
+
"birth_day": 5,
|
36
|
+
"birth_month": 6,
|
37
|
+
"birth_year":1952,
|
38
|
+
"email_hashes":["1234567890"]
|
39
|
+
}
|
40
|
+
]}'
|
41
|
+
}
|
42
|
+
|
43
|
+
describe "fetch_contacts_using_access_token" do
|
44
|
+
|
45
|
+
let(:token) { "token" }
|
46
|
+
let(:token_type) { "token_type" }
|
47
|
+
|
48
|
+
before(:each) do
|
49
|
+
hotmail.instance_variable_set(:@env, {"HTTP_HOST" => "http://example.com"})
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should request the contacts by providing the token in the url" do
|
53
|
+
hotmail.should_receive(:https_get) do |host, path, params, headers|
|
54
|
+
params[:access_token].should eq(token)
|
55
|
+
self_response
|
56
|
+
end
|
57
|
+
|
58
|
+
hotmail.should_receive(:https_get) do |host, path, params, headers|
|
59
|
+
params[:access_token].should eq(token)
|
60
|
+
contacts_as_json
|
61
|
+
end
|
62
|
+
hotmail.fetch_contacts_using_access_token token, token_type
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should set requested permissions in the authorization url" do
|
66
|
+
hotmail.authorization_url.should match(/scope=#{Regexp.quote(CGI.escape(permissions))}/)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should correctly parse id, name, email, gender, birthday, profile picture, relation and email hashes" do
|
70
|
+
hotmail.should_receive(:https_get).and_return(self_response)
|
71
|
+
hotmail.should_receive(:https_get).and_return(contacts_as_json)
|
72
|
+
result = hotmail.fetch_contacts_using_access_token token, token_type
|
73
|
+
|
74
|
+
result.size.should be(1)
|
75
|
+
result.first[:id].should eq('123456')
|
76
|
+
result.first[:first_name].should eq("John")
|
77
|
+
result.first[:last_name].should eq('Smith')
|
78
|
+
result.first[:name].should eq("John Smith")
|
79
|
+
result.first[:email].should be_nil
|
80
|
+
result.first[:gender].should be_nil
|
81
|
+
result.first[:birthday].should eq({:day=>5, :month=>6, :year=>1952})
|
82
|
+
result.first[:profile_picture].should eq('https://apis.live.net/v5.0/123456/picture')
|
83
|
+
result.first[:relation].should be_nil
|
84
|
+
result.first[:email_hashes].should eq(["1234567890"])
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should correctly parse and set logged in user information" do
|
88
|
+
hotmail.should_receive(:https_get).and_return(self_response)
|
89
|
+
hotmail.should_receive(:https_get).and_return(contacts_as_json)
|
90
|
+
|
91
|
+
hotmail.fetch_contacts_using_access_token token, token_type
|
92
|
+
|
93
|
+
user = hotmail.instance_variable_get(:@env)["omnigroupcontacts.user"]
|
94
|
+
user.should_not be_nil
|
95
|
+
user[:id].should eq('4502de12390223d0')
|
96
|
+
user[:first_name].should eq('Chris')
|
97
|
+
user[:last_name].should eq('Johnson')
|
98
|
+
user[:name].should eq('Chris Johnson')
|
99
|
+
user[:gender].should be_nil
|
100
|
+
user[:birthday].should eq({:day=>21, :month=>06, :year=>1982})
|
101
|
+
user[:email].should eq('chrisjohn@gmail.com')
|
102
|
+
user[:profile_picture].should eq('https://apis.live.net/v5.0/4502de12390223d0/picture')
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "omnigroupcontacts/importer/linkedin"
|
3
|
+
|
4
|
+
describe OmniGroupContacts::Importer::Linkedin do
|
5
|
+
|
6
|
+
let(:linkedin) { OmniGroupContacts::Importer::Linkedin.new({}, "client_id", "client_secret", state: "ipsaeumeaque") }
|
7
|
+
|
8
|
+
let(:contacts_as_json) do
|
9
|
+
"{
|
10
|
+
\n \"_total\": 2,
|
11
|
+
\n \"values\": [
|
12
|
+
\n {
|
13
|
+
\n \"firstName\": \"Adolf\",
|
14
|
+
\n \"id\": \"k71S5q6MKe\",
|
15
|
+
\n \"lastName\": \"Witting\",
|
16
|
+
\n \"pictureUrl\": \"https://media.licdn.com/mpr/mprx/0_mLnj-7szw130pFRLB8Op7-p1Sxoyv53U3B47Scp1Sxoyv53U3B47Scp1Sxoyv53U3B47Sc\"\n
|
17
|
+
},
|
18
|
+
\n {
|
19
|
+
\n \"firstName\": \"Emmet\",
|
20
|
+
\n \"id\": \"ms5r3lI3J2\",
|
21
|
+
\n \"lastName\": \"Little\",
|
22
|
+
\n \"pictureUrl\": \"https://media.licdn.com/mpr/mprx/0_iH9m158zCdISt1X6iH9m158zCdISt1X6iH9m158zCdISt1X6iH9m158zCdISt1X6iH9m158zCdISt1X6\"\n
|
23
|
+
}
|
24
|
+
]\n
|
25
|
+
}"
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "fetch_contacts_using_access_token" do
|
29
|
+
let(:token) { "token" }
|
30
|
+
let(:token_type) { nil }
|
31
|
+
|
32
|
+
before(:each) do
|
33
|
+
linkedin.instance_variable_set(:@env, {})
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should request the contacts by specifying code in the http headers" do
|
37
|
+
linkedin.should_receive(:https_get) do |host, path, params, headers|
|
38
|
+
headers["Authorization"].should eq("Bearer #{token}")
|
39
|
+
contacts_as_json
|
40
|
+
end
|
41
|
+
linkedin.fetch_contacts_using_access_token token, token_type
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should correctly parse id, name, and profile picture for 1st contact" do
|
45
|
+
linkedin.should_receive(:https_get).and_return(contacts_as_json)
|
46
|
+
result = linkedin.fetch_contacts_using_access_token token, token_type
|
47
|
+
|
48
|
+
result.size.should be(2)
|
49
|
+
result.first[:id].should eq('k71S5q6MKe')
|
50
|
+
result.first[:first_name].should eq('Adolf')
|
51
|
+
result.first[:last_name].should eq('Witting')
|
52
|
+
result.first[:name].should eq("Adolf Witting")
|
53
|
+
result.first[:profile_picture].should eq("https://media.licdn.com/mpr/mprx/0_mLnj-7szw130pFRLB8Op7-p1Sxoyv53U3B47Scp1Sxoyv53U3B47Scp1Sxoyv53U3B47Sc")
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should correctly parse id, name, and profile picture for 2nd contact" do
|
57
|
+
linkedin.should_receive(:https_get).and_return(contacts_as_json)
|
58
|
+
result = linkedin.fetch_contacts_using_access_token token, token_type
|
59
|
+
result.size.should be(2)
|
60
|
+
result.last[:id].should eq('ms5r3lI3J2')
|
61
|
+
result.last[:first_name].should eq('Emmet')
|
62
|
+
result.last[:last_name].should eq('Little')
|
63
|
+
result.last[:name].should eq("Emmet Little")
|
64
|
+
result.last[:profile_picture].should eq("https://media.licdn.com/mpr/mprx/0_iH9m158zCdISt1X6iH9m158zCdISt1X6iH9m158zCdISt1X6iH9m158zCdISt1X6iH9m158zCdISt1X6")
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|