rpx_now 0.5.10 → 0.5.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.
- data/README.markdown +6 -3
- data/VERSION +1 -1
- data/lib/rpx_now.rb +25 -55
- data/lib/rpx_now/request.rb +43 -0
- data/pkg/rpx_now-0.5.10.gem +0 -0
- data/pkg/rpx_now-0.5.11.gem +0 -0
- data/rdoc/README.rdoc +1 -0
- data/rpx_now.gemspec +7 -2
- data/spec/rpx_now/contacts_collection_spec.rb +1 -1
- data/spec/rpx_now/request_spec.rb +41 -0
- data/spec/rpx_now/user_proxy_spec.rb +1 -1
- data/spec/rpx_now_spec.rb +27 -49
- data/spec/spec_helper.rb +0 -2
- metadata +7 -2
data/README.markdown
CHANGED
|
@@ -23,7 +23,7 @@ Usage
|
|
|
23
23
|
Install
|
|
24
24
|
=======
|
|
25
25
|
- As Rails plugin: `script/plugin install git://github.com/grosser/rpx_now.git `
|
|
26
|
-
- As gem: `sudo gem install
|
|
26
|
+
- As gem: `sudo gem install rpx_now`
|
|
27
27
|
|
|
28
28
|
Examples
|
|
29
29
|
========
|
|
@@ -40,10 +40,13 @@ View
|
|
|
40
40
|
Environment
|
|
41
41
|
-----------
|
|
42
42
|
Rails::Initializer.run do |config|
|
|
43
|
-
config.gem "
|
|
43
|
+
config.gem "rpx_now"
|
|
44
44
|
...
|
|
45
|
+
|
|
46
|
+
config.after_initialize do # so rake gems:install works
|
|
47
|
+
RPXNow.api_key = "YOU RPX API KEY"
|
|
48
|
+
end
|
|
45
49
|
end
|
|
46
|
-
RPXNow.api_key = "YOU RPX API KEY"
|
|
47
50
|
|
|
48
51
|
Controller
|
|
49
52
|
----------
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.5.
|
|
1
|
+
0.5.11
|
data/lib/rpx_now.rb
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
require 'net/http'
|
|
2
|
+
require 'net/https'
|
|
1
3
|
require 'json'
|
|
4
|
+
|
|
5
|
+
require 'rpx_now/request'
|
|
2
6
|
require 'rpx_now/contacts_collection'
|
|
3
7
|
require 'rpx_now/user_integration'
|
|
4
8
|
require 'rpx_now/user_proxy'
|
|
@@ -6,15 +10,14 @@ require 'rpx_now/user_proxy'
|
|
|
6
10
|
module RPXNow
|
|
7
11
|
extend self
|
|
8
12
|
|
|
9
|
-
HOST = 'rpxnow.com'
|
|
10
|
-
SSL_CERT = File.join(File.dirname(__FILE__), '..', 'certs', 'ssl_cert.pem')
|
|
11
|
-
|
|
12
13
|
attr_accessor :api_key
|
|
13
14
|
attr_accessor :api_version
|
|
14
15
|
self.api_version = 2
|
|
15
16
|
|
|
16
|
-
# retrieve the users data
|
|
17
|
-
#
|
|
17
|
+
# retrieve the users data
|
|
18
|
+
# - cleaned Hash
|
|
19
|
+
# - complete/unclean response when block was given user_data{|response| ...; return hash }
|
|
20
|
+
# - nil when token was invalid / data was not found
|
|
18
21
|
def user_data(token, *args)
|
|
19
22
|
api_key, version, options = extract_key_version_and_options!(args)
|
|
20
23
|
options = {:token=>token,:apiKey=>api_key}.merge options
|
|
@@ -25,7 +28,7 @@ module RPXNow
|
|
|
25
28
|
return nil if $!.to_s=~/Data not found/
|
|
26
29
|
raise
|
|
27
30
|
end
|
|
28
|
-
if block_given? then yield(data) else
|
|
31
|
+
if block_given? then yield(data) else parse_user_data(data) end
|
|
29
32
|
end
|
|
30
33
|
|
|
31
34
|
# set the users status
|
|
@@ -80,7 +83,7 @@ module RPXNow
|
|
|
80
83
|
def embed_code(subdomain,url,options={})
|
|
81
84
|
options = {:width => '400', :height => '240', :language => 'en'}.merge(options)
|
|
82
85
|
<<EOF
|
|
83
|
-
<iframe src="https://#{subdomain}.#{HOST}/openid/embed?token_url=#{url}&language_preference=#{options[:language]}"
|
|
86
|
+
<iframe src="https://#{subdomain}.#{Request::HOST}/openid/embed?token_url=#{url}&language_preference=#{options[:language]}"
|
|
84
87
|
scrolling="no" frameBorder="no" style="width:#{options[:width]}px;height:#{options[:height]}px;">
|
|
85
88
|
</iframe>
|
|
86
89
|
EOF
|
|
@@ -96,18 +99,29 @@ EOF
|
|
|
96
99
|
|
|
97
100
|
private
|
|
98
101
|
|
|
102
|
+
def self.parse_user_data(response)
|
|
103
|
+
user_data = response['profile']
|
|
104
|
+
data = {}
|
|
105
|
+
data[:identifier] = user_data['identifier']
|
|
106
|
+
data[:email] = user_data['verifiedEmail'] || user_data['email']
|
|
107
|
+
data[:username] = user_data['preferredUsername'] || data[:email].to_s.sub(/@.*/,'')
|
|
108
|
+
data[:name] = user_data['displayName'] || data[:username]
|
|
109
|
+
data[:id] = user_data['primaryKey'] unless user_data['primaryKey'].to_s.empty?
|
|
110
|
+
data
|
|
111
|
+
end
|
|
112
|
+
|
|
99
113
|
def unobtrusive_popup_code(text, subdomain, url, options={})
|
|
100
114
|
version = extract_version! options
|
|
101
|
-
"<a class=\"rpxnow\" href=\"https://#{subdomain}.#{HOST}/openid/v#{version}/signin?token_url=#{url}\">#{text}</a>"
|
|
115
|
+
"<a class=\"rpxnow\" href=\"https://#{subdomain}.#{Request::HOST}/openid/v#{version}/signin?token_url=#{url}\">#{text}</a>"
|
|
102
116
|
end
|
|
103
117
|
|
|
104
118
|
def obtrusive_popup_code(text, subdomain, url, options = {})
|
|
105
119
|
version = extract_version! options
|
|
106
120
|
<<EOF
|
|
107
|
-
<a class="rpxnow" onclick="return false;" href="https://#{subdomain}.#{HOST}/openid/v#{version}/signin?token_url=#{url}">
|
|
121
|
+
<a class="rpxnow" onclick="return false;" href="https://#{subdomain}.#{Request::HOST}/openid/v#{version}/signin?token_url=#{url}">
|
|
108
122
|
#{text}
|
|
109
123
|
</a>
|
|
110
|
-
<script src="https://#{HOST}/openid/v#{version}/widget" type="text/javascript"></script>
|
|
124
|
+
<script src="https://#{Request::HOST}/openid/v#{version}/widget" type="text/javascript"></script>
|
|
111
125
|
<script type="text/javascript">
|
|
112
126
|
//<![CDATA[
|
|
113
127
|
RPXNOW.token_url = "#{url}";
|
|
@@ -144,52 +158,8 @@ EOF
|
|
|
144
158
|
options.delete(:api_version) || api_version
|
|
145
159
|
end
|
|
146
160
|
|
|
147
|
-
def read_user_data_from_response(response)
|
|
148
|
-
user_data = response['profile']
|
|
149
|
-
data = {}
|
|
150
|
-
data[:identifier] = user_data['identifier']
|
|
151
|
-
data[:email] = user_data['verifiedEmail'] || user_data['email']
|
|
152
|
-
data[:username] = user_data['preferredUsername'] || data[:email].to_s.sub(/@.*/,'')
|
|
153
|
-
data[:name] = user_data['displayName'] || data[:username]
|
|
154
|
-
data[:id] = user_data['primaryKey'] unless user_data['primaryKey'].to_s.empty?
|
|
155
|
-
data
|
|
156
|
-
end
|
|
157
|
-
|
|
158
161
|
def secure_json_post(path, data)
|
|
159
|
-
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
def post(path, data)
|
|
163
|
-
require 'net/http'
|
|
164
|
-
require 'net/https'
|
|
165
|
-
request = Net::HTTP::Post.new(path)
|
|
166
|
-
request.form_data = data.map{|k,v| [k.to_s,v]}#symbol keys -> string because of ruby 1.9.x bug http://redmine.ruby-lang.org/issues/show/1351
|
|
167
|
-
make_request(request)
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
def make_request(request)
|
|
171
|
-
http = Net::HTTP.new(HOST, 443)
|
|
172
|
-
http.use_ssl = true
|
|
173
|
-
http.ca_file = SSL_CERT
|
|
174
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
|
175
|
-
http.verify_depth = 5
|
|
176
|
-
http.request(request)
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
def parse_response(response)
|
|
180
|
-
if response.code.to_i >= 400
|
|
181
|
-
raise ServiceUnavailableError, "The RPX service is temporarily unavailable. (4XX)"
|
|
182
|
-
else
|
|
183
|
-
result = JSON.parse(response.body)
|
|
184
|
-
return result unless result['err']
|
|
185
|
-
|
|
186
|
-
code = result['err']['code']
|
|
187
|
-
if code == -1
|
|
188
|
-
raise ServiceUnavailableError, "The RPX service is temporarily unavailable."
|
|
189
|
-
else
|
|
190
|
-
raise ApiError, "Got error: #{result['err']['msg']} (code: #{code}), HTTP status: #{response.code}"
|
|
191
|
-
end
|
|
192
|
-
end
|
|
162
|
+
Request.post(path, data)
|
|
193
163
|
end
|
|
194
164
|
|
|
195
165
|
class ServerError < RuntimeError; end #backwards compatibility / catch all
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
module RPXNow
|
|
2
|
+
class Request
|
|
3
|
+
HOST = 'rpxnow.com'
|
|
4
|
+
SSL_CERT = File.join(File.dirname(__FILE__), '..', '..', 'certs', 'ssl_cert.pem')
|
|
5
|
+
|
|
6
|
+
def self.post(path, data)
|
|
7
|
+
parse_response(request(path,data))
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
private
|
|
11
|
+
|
|
12
|
+
def self.request(path, data)
|
|
13
|
+
request = Net::HTTP::Post.new(path)
|
|
14
|
+
request.form_data = data.map{|k,v| [k.to_s,v]}#symbol keys -> string because of ruby 1.9.x bug http://redmine.ruby-lang.org/issues/show/1351
|
|
15
|
+
make_request(request)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.make_request(request)
|
|
19
|
+
http = Net::HTTP.new(HOST, 443)
|
|
20
|
+
http.use_ssl = true
|
|
21
|
+
http.ca_file = SSL_CERT
|
|
22
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
|
23
|
+
http.verify_depth = 5
|
|
24
|
+
http.request(request)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.parse_response(response)
|
|
28
|
+
if response.code.to_i >= 400
|
|
29
|
+
raise ServiceUnavailableError, "The RPX service is temporarily unavailable. (4XX)"
|
|
30
|
+
else
|
|
31
|
+
result = JSON.parse(response.body)
|
|
32
|
+
return result unless result['err']
|
|
33
|
+
|
|
34
|
+
code = result['err']['code']
|
|
35
|
+
if code == -1
|
|
36
|
+
raise ServiceUnavailableError, "The RPX service is temporarily unavailable."
|
|
37
|
+
else
|
|
38
|
+
raise ApiError, "Got error: #{result['err']['msg']} (code: #{code}), HTTP status: #{response.code}"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
data/pkg/rpx_now-0.5.10.gem
CHANGED
|
Binary file
|
|
Binary file
|
data/rdoc/README.rdoc
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
documentation is at http://github.com/grosser/rpx_now
|
data/rpx_now.gemspec
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |s|
|
|
7
7
|
s.name = %q{rpx_now}
|
|
8
|
-
s.version = "0.5.
|
|
8
|
+
s.version = "0.5.11"
|
|
9
9
|
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
11
|
s.authors = ["Michael Grosser"]
|
|
12
|
-
s.date = %q{2009-10-
|
|
12
|
+
s.date = %q{2009-10-07}
|
|
13
13
|
s.email = %q{grosser.michael@gmail.com}
|
|
14
14
|
s.extra_rdoc_files = [
|
|
15
15
|
"README.markdown"
|
|
@@ -24,12 +24,16 @@ Gem::Specification.new do |s|
|
|
|
24
24
|
"init.rb",
|
|
25
25
|
"lib/rpx_now.rb",
|
|
26
26
|
"lib/rpx_now/contacts_collection.rb",
|
|
27
|
+
"lib/rpx_now/request.rb",
|
|
27
28
|
"lib/rpx_now/user_integration.rb",
|
|
28
29
|
"lib/rpx_now/user_proxy.rb",
|
|
29
30
|
"pkg/rpx_now-0.5.10.gem",
|
|
31
|
+
"pkg/rpx_now-0.5.11.gem",
|
|
32
|
+
"rdoc/README.rdoc",
|
|
30
33
|
"rpx_now.gemspec",
|
|
31
34
|
"spec/fixtures/get_contacts_response.json",
|
|
32
35
|
"spec/rpx_now/contacts_collection_spec.rb",
|
|
36
|
+
"spec/rpx_now/request_spec.rb",
|
|
33
37
|
"spec/rpx_now/user_proxy_spec.rb",
|
|
34
38
|
"spec/rpx_now_spec.rb",
|
|
35
39
|
"spec/spec_helper.rb"
|
|
@@ -44,6 +48,7 @@ Gem::Specification.new do |s|
|
|
|
44
48
|
"spec/rpx_now_spec.rb",
|
|
45
49
|
"spec/rpx_now/contacts_collection_spec.rb",
|
|
46
50
|
"spec/rpx_now/user_proxy_spec.rb",
|
|
51
|
+
"spec/rpx_now/request_spec.rb",
|
|
47
52
|
"spec/spec_helper.rb"
|
|
48
53
|
]
|
|
49
54
|
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'spec/spec_helper'
|
|
2
|
+
|
|
3
|
+
describe RPXNow::Request do
|
|
4
|
+
describe 'ssl cert' do
|
|
5
|
+
it "has an absolute path" do
|
|
6
|
+
RPXNow::Request::SSL_CERT[0..0].should == '/' #start with '/'
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it "exists" do
|
|
10
|
+
File.read(RPXNow::Request::SSL_CERT).to_s.should_not be_empty
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe :parse_response do
|
|
15
|
+
it "parses json when status is ok" do
|
|
16
|
+
response = mock(:code=>'200', :body=>%Q({"stat":"ok","data":"xx"}))
|
|
17
|
+
RPXNow::Request.send(:parse_response, response)['data'].should == "xx"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "raises when there is a communication error" do
|
|
21
|
+
response = stub(:code=>'200', :body=>%Q({"err":"wtf","stat":"ok"}))
|
|
22
|
+
lambda{
|
|
23
|
+
RPXNow::Request.send(:parse_response,response)
|
|
24
|
+
}.should raise_error(RPXNow::ApiError)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "raises when service has downtime" do
|
|
28
|
+
response = stub(:code=>'200', :body=>%Q({"err":{"code":-1},"stat":"ok"}))
|
|
29
|
+
lambda{
|
|
30
|
+
RPXNow::Request.send(:parse_response,response)
|
|
31
|
+
}.should raise_error(RPXNow::ServiceUnavailableError)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "raises when service is down" do
|
|
35
|
+
response = stub(:code=>'400',:body=>%Q({"stat":"err"}))
|
|
36
|
+
lambda{
|
|
37
|
+
RPXNow::Request.send(:parse_response,response)
|
|
38
|
+
}.should raise_error(RPXNow::ServiceUnavailableError)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
data/spec/rpx_now_spec.rb
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
require
|
|
1
|
+
require 'spec/spec_helper'
|
|
2
2
|
|
|
3
3
|
describe RPXNow do
|
|
4
4
|
describe :api_key= do
|
|
5
5
|
it "stores the api key, so i do not have to supply everytime" do
|
|
6
6
|
RPXNow.api_key='XX'
|
|
7
|
-
RPXNow.
|
|
7
|
+
RPXNow::Request.should_receive(:request).with{|x,data|data[:apiKey]=='XX'}.and_return mock(:code=>'200', :body=>%Q({"stat":"ok"}))
|
|
8
8
|
RPXNow.mappings(1)
|
|
9
9
|
end
|
|
10
10
|
end
|
|
@@ -98,55 +98,61 @@ describe RPXNow do
|
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
it "parses JSON response to user data" do
|
|
101
|
-
|
|
102
|
-
|
|
101
|
+
expected = {
|
|
102
|
+
:name => 'Michael Grosser',
|
|
103
|
+
:email => 'grosser.michael@googlemail.com',
|
|
104
|
+
:identifier => 'https://www.google.com/accounts/o8/id?id=AItOawmaOlyYezg_WfbgP_qjaUyHjmqZD9qNIVM',
|
|
105
|
+
:username => 'grosser.michael',
|
|
106
|
+
}
|
|
107
|
+
RPXNow::Request.should_receive(:request).and_return fake_response
|
|
108
|
+
RPXNow.user_data('').should == expected
|
|
103
109
|
end
|
|
104
110
|
|
|
105
111
|
it "adds a :id when primaryKey was returned" do
|
|
106
112
|
@response_body.sub!(%Q("verifiedEmail"), %Q("primaryKey":"2","verifiedEmail"))
|
|
107
|
-
RPXNow.
|
|
113
|
+
RPXNow::Request.should_receive(:request).and_return fake_response
|
|
108
114
|
RPXNow.user_data('')[:id].should == '2'
|
|
109
115
|
end
|
|
110
116
|
|
|
111
117
|
it "handles primaryKeys that are not numeric" do
|
|
112
118
|
@response_body.sub!(%Q("verifiedEmail"), %Q("primaryKey":"dbalatero","verifiedEmail"))
|
|
113
|
-
RPXNow.
|
|
119
|
+
RPXNow::Request.should_receive(:request).and_return fake_response
|
|
114
120
|
RPXNow.user_data('')[:id].should == 'dbalatero'
|
|
115
121
|
end
|
|
116
122
|
|
|
117
123
|
it "hands JSON response to supplied block" do
|
|
118
|
-
RPXNow.
|
|
124
|
+
RPXNow::Request.should_receive(:request).and_return mock(:code=>'200',:body=>%Q({"x":"1","stat":"ok"}))
|
|
119
125
|
response = nil
|
|
120
126
|
RPXNow.user_data(''){|data| response = data}
|
|
121
127
|
response.should == {"x" => "1", "stat" => "ok"}
|
|
122
128
|
end
|
|
123
129
|
|
|
124
130
|
it "returns what the supplied block returned" do
|
|
125
|
-
RPXNow.
|
|
131
|
+
RPXNow::Request.should_receive(:request).and_return mock(:code=>'200',:body=>%Q({"x":"1","stat":"ok"}))
|
|
126
132
|
RPXNow.user_data(''){|data| "x"}.should == 'x'
|
|
127
133
|
end
|
|
128
134
|
|
|
129
135
|
it "can send additional parameters" do
|
|
130
|
-
RPXNow.
|
|
136
|
+
RPXNow::Request.should_receive(:request).with{|url,data|
|
|
131
137
|
data[:extended].should == 'true'
|
|
132
|
-
}.
|
|
138
|
+
}.and_return fake_response
|
|
133
139
|
RPXNow.user_data('',:extended=>'true')
|
|
134
140
|
end
|
|
135
141
|
|
|
136
142
|
it "works with api key as 2nd parameter (backwards compatibility)" do
|
|
137
|
-
RPXNow.
|
|
143
|
+
RPXNow.should_receive(:secure_json_post).with('/api/v2/auth_info', :apiKey=>'THE KEY', :token=>'id').and_return @fake_user_data
|
|
138
144
|
RPXNow.user_data('id', 'THE KEY')
|
|
139
145
|
RPXNow.api_key.should == API_KEY
|
|
140
146
|
end
|
|
141
147
|
|
|
142
148
|
it "works with api key as 2nd parameter and options (backwards compatibility)" do
|
|
143
|
-
RPXNow.
|
|
149
|
+
RPXNow.should_receive(:secure_json_post).with('/api/v2/auth_info', :apiKey=>'THE KEY', :extended=>'abc', :token=>'id' ).and_return @fake_user_data
|
|
144
150
|
RPXNow.user_data('id', 'THE KEY', :extended=>'abc')
|
|
145
151
|
RPXNow.api_key.should == API_KEY
|
|
146
152
|
end
|
|
147
153
|
|
|
148
154
|
it "works with api version as option (backwards compatibility)" do
|
|
149
|
-
RPXNow.
|
|
155
|
+
RPXNow.should_receive(:secure_json_post).with('/api/v123/auth_info', :apiKey=>API_KEY, :token=>'id', :extended=>'abc').and_return @fake_user_data
|
|
150
156
|
RPXNow.user_data('id', :extended=>'abc', :api_version=>123)
|
|
151
157
|
RPXNow.api_version.should == API_VERSION
|
|
152
158
|
end
|
|
@@ -162,79 +168,51 @@ describe RPXNow do
|
|
|
162
168
|
end
|
|
163
169
|
|
|
164
170
|
it "parses JSON response to result hash" do
|
|
165
|
-
RPXNow.
|
|
171
|
+
RPXNow::Request.should_receive(:request).and_return fake_response
|
|
166
172
|
RPXNow.set_status('identifier', 'Chillen...').should == {'stat' => 'ok'}
|
|
167
173
|
end
|
|
168
174
|
end
|
|
169
175
|
|
|
170
176
|
describe :read_user_data_from_response do
|
|
171
177
|
it "reads secondary names" do
|
|
172
|
-
RPXNow.send(:
|
|
178
|
+
RPXNow.send(:parse_user_data,{'profile'=>{'preferredUsername'=>'1'}})[:name].should == '1'
|
|
173
179
|
end
|
|
174
180
|
|
|
175
181
|
it "parses email when no name is found" do
|
|
176
|
-
RPXNow.send(:
|
|
182
|
+
RPXNow.send(:parse_user_data,{'profile'=>{'email'=>'1@xxx.com'}})[:name].should == '1'
|
|
177
183
|
end
|
|
178
184
|
end
|
|
179
185
|
|
|
180
186
|
describe :contacts do
|
|
181
187
|
it "finds all contacts" do
|
|
182
188
|
response = JSON.parse(File.read('spec/fixtures/get_contacts_response.json'))
|
|
183
|
-
RPXNow.
|
|
189
|
+
RPXNow.should_receive(:secure_json_post).with('/api/v2/get_contacts',:identifier=>'xx', :apiKey=>API_KEY).and_return response
|
|
184
190
|
RPXNow.contacts('xx').size.should == 5
|
|
185
191
|
end
|
|
186
192
|
end
|
|
187
193
|
|
|
188
|
-
describe :parse_response do
|
|
189
|
-
it "parses json when status is ok" do
|
|
190
|
-
response = mock(:code=>'200', :body=>%Q({"stat":"ok","data":"xx"}))
|
|
191
|
-
RPXNow.send(:parse_response, response)['data'].should == "xx"
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
it "raises when there is a communication error" do
|
|
195
|
-
response = stub(:code=>'200', :body=>%Q({"err":"wtf","stat":"ok"}))
|
|
196
|
-
lambda{
|
|
197
|
-
RPXNow.send(:parse_response,response)
|
|
198
|
-
}.should raise_error(RPXNow::ApiError)
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
it "raises when service has downtime" do
|
|
202
|
-
response = stub(:code=>'200', :body=>%Q({"err":{"code":-1},"stat":"ok"}))
|
|
203
|
-
lambda{
|
|
204
|
-
RPXNow.send(:parse_response,response)
|
|
205
|
-
}.should raise_error(RPXNow::ServiceUnavailableError)
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
it "raises when service is down" do
|
|
209
|
-
response = stub(:code=>'400',:body=>%Q({"stat":"err"}))
|
|
210
|
-
lambda{
|
|
211
|
-
RPXNow.send(:parse_response,response)
|
|
212
|
-
}.should raise_error(RPXNow::ServiceUnavailableError)
|
|
213
|
-
end
|
|
214
|
-
end
|
|
215
|
-
|
|
216
194
|
describe :mappings do
|
|
217
195
|
it "parses JSON response to unmap data" do
|
|
218
|
-
RPXNow.
|
|
196
|
+
RPXNow::Request.should_receive(:request).and_return mock(:code=>'200',:body=>%Q({"stat":"ok", "identifiers": ["http://test.myopenid.com/"]}))
|
|
219
197
|
RPXNow.mappings(1, "x").should == ["http://test.myopenid.com/"]
|
|
220
198
|
end
|
|
221
199
|
end
|
|
222
200
|
|
|
223
201
|
describe :map do
|
|
224
202
|
it "adds a mapping" do
|
|
225
|
-
RPXNow.
|
|
203
|
+
RPXNow::Request.should_receive(:request).and_return mock(:code=>'200',:body=>%Q({"stat":"ok"}))
|
|
226
204
|
RPXNow.map('http://test.myopenid.com',1, API_KEY)
|
|
227
205
|
end
|
|
228
206
|
end
|
|
229
207
|
|
|
230
208
|
describe :unmap do
|
|
231
209
|
it "unmaps a indentifier" do
|
|
232
|
-
RPXNow.
|
|
210
|
+
RPXNow::Request.should_receive(:request).and_return mock(:code=>'200',:body=>%Q({"stat":"ok"}))
|
|
233
211
|
RPXNow.unmap('http://test.myopenid.com', 1, "x")
|
|
234
212
|
end
|
|
235
213
|
|
|
236
214
|
it "can be called with a specific version" do
|
|
237
|
-
RPXNow.
|
|
215
|
+
RPXNow.should_receive(:secure_json_post).with{|a,b|a == "/api/v300/unmap"}
|
|
238
216
|
RPXNow.unmap('http://test.myopenid.com', 1, :api_key=>'xxx', :api_version=>300)
|
|
239
217
|
end
|
|
240
218
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# ---- requirements
|
|
2
2
|
require 'rubygems'
|
|
3
3
|
require 'spec'
|
|
4
|
-
require 'mocha'
|
|
5
4
|
|
|
6
5
|
$LOAD_PATH << File.expand_path("../lib", File.dirname(__FILE__))
|
|
7
6
|
|
|
@@ -12,7 +11,6 @@ API_VERSION = RPXNow.api_version
|
|
|
12
11
|
|
|
13
12
|
# ---- rspec
|
|
14
13
|
Spec::Runner.configure do |config|
|
|
15
|
-
config.mock_with :mocha
|
|
16
14
|
config.before :each do
|
|
17
15
|
RPXNow.api_key = API_KEY
|
|
18
16
|
RPXNow.api_version = API_VERSION
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rpx_now
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.5.
|
|
4
|
+
version: 0.5.11
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Michael Grosser
|
|
@@ -9,7 +9,7 @@ autorequire:
|
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
11
|
|
|
12
|
-
date: 2009-10-
|
|
12
|
+
date: 2009-10-07 00:00:00 +02:00
|
|
13
13
|
default_executable:
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
@@ -40,12 +40,16 @@ files:
|
|
|
40
40
|
- init.rb
|
|
41
41
|
- lib/rpx_now.rb
|
|
42
42
|
- lib/rpx_now/contacts_collection.rb
|
|
43
|
+
- lib/rpx_now/request.rb
|
|
43
44
|
- lib/rpx_now/user_integration.rb
|
|
44
45
|
- lib/rpx_now/user_proxy.rb
|
|
45
46
|
- pkg/rpx_now-0.5.10.gem
|
|
47
|
+
- pkg/rpx_now-0.5.11.gem
|
|
48
|
+
- rdoc/README.rdoc
|
|
46
49
|
- rpx_now.gemspec
|
|
47
50
|
- spec/fixtures/get_contacts_response.json
|
|
48
51
|
- spec/rpx_now/contacts_collection_spec.rb
|
|
52
|
+
- spec/rpx_now/request_spec.rb
|
|
49
53
|
- spec/rpx_now/user_proxy_spec.rb
|
|
50
54
|
- spec/rpx_now_spec.rb
|
|
51
55
|
- spec/spec_helper.rb
|
|
@@ -81,4 +85,5 @@ test_files:
|
|
|
81
85
|
- spec/rpx_now_spec.rb
|
|
82
86
|
- spec/rpx_now/contacts_collection_spec.rb
|
|
83
87
|
- spec/rpx_now/user_proxy_spec.rb
|
|
88
|
+
- spec/rpx_now/request_spec.rb
|
|
84
89
|
- spec/spec_helper.rb
|