omni_api 0.0.4 → 0.0.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2eb1577afa97eb1cc2a58fee25900b59f807f9ac
4
- data.tar.gz: 4a9242500eb846d47e9089d7e03fc7e29eb8e491
3
+ metadata.gz: 8464dd48ed93791d548c2f5b3eaa744aec2d20f5
4
+ data.tar.gz: 4a8c63a501d5283c8fa9c3bfaa11ca902b56d0c4
5
5
  SHA512:
6
- metadata.gz: bbf5b72b329db9c4e6c2e16dc41bbcd216f685255daed1154f8fca33c04df4cc6d3c887cba77f79702922d311355915199e0c16ed85ffa72eb3aff5d6d6b59f0
7
- data.tar.gz: fe6f2c7534cd5109a60f69e016f2161f46de8eae1a66514978e17fc08c1755bf1bde687099b16f2fac7478063e956763cb991298791d643d93a42b5d865425f7
6
+ metadata.gz: 279d94e3a2869c510244bec6cf3cd3664615f6e2397fcc8265c563cc81c45a016a650ebce12fc9b6e0609dffe00dbe9832b36644a4a7bc997b9bf2bbec0bf1c2
7
+ data.tar.gz: 9f8563f868fdcfeddc75ea8c4a85ce4cadf37810fb1fac1bf43f72a07d1deed89d9c3740745b9eb2c97141a28ff26c5ac221d6782f0dc361e5481604970dc599
@@ -11,21 +11,24 @@ module OmniApi
11
11
  mattr_accessor :client_secret
12
12
  self.client_secret = ''
13
13
 
14
+ mattr_accessor :user_access_token
15
+ self.user_access_token = ''
16
+
17
+ mattr_accessor :user_refresh_token
18
+ self.user_refresh_token = ''
19
+
20
+ mattr_accessor :base_url
21
+ self.base_url = ''
22
+
14
23
  # rubocop:disable Style/ClassVars
15
24
  def self.client_access_token=(token)
16
25
  @@client_access_token = "bearer #{token}"
17
26
  end
18
27
 
19
- mattr_accessor :user_access_token
20
- self.user_access_token = ''
21
-
22
28
  # rubocop:disable Style/ClassVars
23
29
  def self.user_access_token=(token)
24
30
  @@user_access_token = "bearer #{token}"
25
- end
26
-
27
- mattr_accessor :base_url
28
- self.base_url = ''
31
+ end
29
32
 
30
33
  def self.config
31
34
  self
@@ -2,19 +2,17 @@ require 'active_resource/connection'
2
2
 
3
3
  module OmniApi
4
4
  module Resources
5
- class OmniApiConnection < ActiveResource::Connection
5
+ class Connection < ActiveResource::Connection
6
6
  def initialize(site, format = ActiveResource::Formats::JsonFormat)
7
7
  super
8
8
  end
9
9
 
10
10
  attr_accessor :error_handler
11
11
 
12
- private
13
-
14
- def request(method, path, *arguments)
12
+ def request(*arguments)
15
13
  super
16
- rescue Error => e
17
- error_handler.present? ? error_handler.handle(e) : raise
14
+ rescue => e
15
+ error_handler.present? ? error_handler.handle(e, self, arguments) : raise
18
16
  end
19
17
  end
20
18
  end
@@ -21,10 +21,12 @@ module OmniApi
21
21
  instance
22
22
  end
23
23
 
24
- def self.refresh(refresh_token)
24
+ def self.refresh_for(refresh_token)
25
25
  instance = self.new
26
26
  instance.attributes[:grant_type] = OmniApi::Resources::Oauth2::GrantTypes::REFRESH_TOKEN
27
+ instance.attributes[:client_id] = OmniApi.config.client_id
27
28
  instance.attributes[:refresh_token] = refresh_token
29
+ instance.attributes[:resource_type] = OmniApi::Resources::Oauth2::ResourceTypes::USER
28
30
  instance.save
29
31
  instance
30
32
  end
@@ -0,0 +1,13 @@
1
+ module OmniApi
2
+ module Resources
3
+ class UserAuthorizationErrorHandler
4
+ def handle(error, connection, arguments)
5
+ raise error unless error.is_a?(ActiveResource::UnauthorizedAccess)
6
+ Oauth2::Token.refresh_for(OmniApi.config.user_refresh_token)
7
+ new_connection = connection.clone
8
+ new_connection.error_handler = nil
9
+ new_connection.request(*arguments)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -12,6 +12,19 @@ module OmniApi
12
12
  new_headers['Authorization'] = OmniApi.config.user_access_token
13
13
  new_headers
14
14
  end
15
+
16
+ def self.connection(refresh = false)
17
+ @connection = create_new_connection if refresh || @connection.nil?
18
+ super
19
+ end
20
+
21
+ protected
22
+
23
+ def self.create_new_connection
24
+ connection = Connection.new(site, format)
25
+ connection.error_handler = UserAuthorizationErrorHandler.new
26
+ connection
27
+ end
15
28
  end
16
29
  end
17
30
  end
@@ -1,3 +1,3 @@
1
1
  module OmniApi
2
- VERSION = '0.0.4'
2
+ VERSION = '0.0.5'
3
3
  end
@@ -0,0 +1,74 @@
1
+ require 'spec_helper'
2
+
3
+ describe OmniApi::Resources::Connection do
4
+ let(:instance) { OmniApi::Resources::Connection.new('http://123.com') }
5
+
6
+ subject { instance }
7
+
8
+ it { is_expected.to respond_to(:error_handler=) }
9
+ it { is_expected.to respond_to(:request) }
10
+
11
+ describe '#request' do
12
+ let(:path) { 'http://123.com/test' }
13
+
14
+ subject { instance.request(:get, 'http://123.com/test', {}) }
15
+
16
+ context 'the underlying connection fails to resolve the request' do
17
+ before { ActiveResource::HttpMock.respond_to { |mock| mock.get path, {}, nil, 400 } }
18
+
19
+ context 'an error handler is not set' do
20
+ before { instance.error_handler = nil }
21
+
22
+ it 'does not swallow the resulting exception' do
23
+ expect { subject }.to raise_error(ActiveResource::BadRequest)
24
+ end
25
+ end
26
+
27
+ context 'an error handler is set' do
28
+ let(:error_handler) { double('error_handler') }
29
+
30
+ before { instance.error_handler = error_handler }
31
+
32
+ it 'calls the handle method of the error handler' do
33
+ expect(error_handler).to receive(:handle).with(ActiveResource::BadRequest, instance, [:get, 'http://123.com/test', {}])
34
+
35
+ subject
36
+ end
37
+
38
+ context 'the error handler handles the error successfully' do
39
+ let(:response) { ActiveResource::Response.new(body: 'testR') }
40
+ before { allow(error_handler).to receive(:handle).and_return(response) }
41
+
42
+ it { is_expected.to be response }
43
+ end
44
+ end
45
+
46
+ context 'a user_authorization_error_handler is used' do
47
+ let(:error_handler) { OmniApi::Resources::UserAuthorizationErrorHandler.new }
48
+
49
+ before { instance.error_handler = error_handler }
50
+
51
+ context 'refreshing the access token works but the request always fails with 401' do
52
+ before do
53
+ token_request_headers = {'Content-Type' => 'application/json', 'Authorization' => 'bearer random'}
54
+ ActiveResource::HttpMock.respond_to do |mock|
55
+ mock.get path, {}, nil, 401
56
+ mock.post '/api/v1/oauth2/token.json', token_request_headers, nil, 200
57
+ end
58
+ end
59
+
60
+ it 'raises the first exception encountered after refreshing the token without causing a stack overflow' do
61
+ expect { subject }.to raise_error(ActiveResource::UnauthorizedAccess)
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ context 'the underlying connection resolves the request' do
68
+ before { ActiveResource::HttpMock.respond_to { |mock | mock.get path, {}, 'testR', 200 } }
69
+
70
+ it { is_expected.to be_a(ActiveResource::Response) }
71
+ its(:body) { is_expected.to eq 'testR' }
72
+ end
73
+ end
74
+ end
@@ -6,4 +6,63 @@ describe OmniApi::Resources::Oauth2::Token do
6
6
 
7
7
  it { is_expected.to eq('token') }
8
8
  end
9
+
10
+ def setup_successful_token_request
11
+ body = {}
12
+ headers = {'Content-Type' => 'application/json', 'Authorization' => 'bearer random'}
13
+ ActiveResource::HttpMock.respond_to { |mock| mock.post '/api/v1/oauth2/token.json', headers, body.to_json, 200 }
14
+ end
15
+
16
+ describe '.create_for' do
17
+ let(:email) { 'someUser@email.com' }
18
+
19
+ subject { OmniApi::Resources::Oauth2::Token.create_for(email) }
20
+
21
+ it 'tries to create a new access token for the user with the given email for the the current client using client credentials' do
22
+ setup_successful_token_request
23
+
24
+ subject
25
+
26
+ expected_body = {
27
+ 'grant_type' => 'client_credentials',
28
+ 'client_id' => '',
29
+ 'client_secret' => '',
30
+ 'resource_type' => 'user',
31
+ 'resource_id' => 'someUser@email.com'
32
+ }
33
+ expect(ActiveResource::HttpMock.requests.first.body).to eq expected_body.to_json
34
+ end
35
+
36
+ context 'creating the token is successful' do
37
+ before { setup_successful_token_request }
38
+
39
+ it { is_expected.to be_a(OmniApi::Resources::Oauth2::Token) }
40
+ end
41
+ end
42
+
43
+ describe '.refresh_for' do
44
+ let(:refresh_token) { 'someRefreshToken' }
45
+
46
+ subject { OmniApi::Resources::Oauth2::Token.refresh_for(refresh_token) }
47
+
48
+ it 'tries to refresh the current user access token using the current user refresh token' do
49
+ setup_successful_token_request
50
+
51
+ subject
52
+
53
+ expected_body = {
54
+ 'grant_type' => 'refresh_token',
55
+ 'client_id' => '',
56
+ 'refresh_token' => 'someRefreshToken',
57
+ 'resource_type' => 'user'
58
+ }
59
+ expect(ActiveResource::HttpMock.requests.first.body).to eq expected_body.to_json
60
+ end
61
+
62
+ context 'refreshing the token is successful' do
63
+ before { setup_successful_token_request }
64
+
65
+ it { is_expected.to be_a(OmniApi::Resources::Oauth2::Token) }
66
+ end
67
+ end
9
68
  end
@@ -2,6 +2,12 @@ require 'spec_helper'
2
2
  require 'uri'
3
3
 
4
4
  describe OmniApi::Resources::User::UserResource do
5
+ describe '.connection' do
6
+ subject { OmniApi::Resources::User::UserResource.connection }
7
+
8
+ it { is_expected.to be_a(OmniApi::Resources::Connection) }
9
+ end
10
+
5
11
  describe '.site' do
6
12
  subject { OmniApi::Resources::User::UserResource.site }
7
13
 
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+ require 'active_resource/http_mock'
3
+
4
+ describe OmniApi::Resources::UserAuthorizationErrorHandler do
5
+ let(:instance) { OmniApi::Resources::UserAuthorizationErrorHandler.new }
6
+
7
+ describe '#handle' do
8
+ let(:error) { Exception.new('some message') }
9
+ let(:connection) { OmniApi::Resources::Connection.new('http://123.com') }
10
+ let(:arguments) { [:get, 'http://123.com', {}] }
11
+
12
+ subject { instance.handle(error, connection, arguments) }
13
+
14
+ context 'the given error is not an ActiveResource::UnauthorizedAccess error' do
15
+ it 'rethrows the given error' do
16
+ expect { subject }.to raise_error(error)
17
+ end
18
+ end
19
+
20
+ context 'the given error is an ActiveResource::UnauthorizedAccess error' do
21
+ let(:error) { ActiveResource::UnauthorizedAccess.new('nah') }
22
+
23
+ it 'tries to refresh the current user access token' do
24
+ OmniApi.config.user_refresh_token = 'refreshToken'
25
+ expect(OmniApi::Resources::Oauth2::Token).to receive(:refresh_for).with('refreshToken')
26
+
27
+ subject rescue nil
28
+ end
29
+
30
+ describe 'refreshing the token works' do
31
+ let(:updated_token) { OmniApi::Resources::Oauth2::Token.new({access_token: 'test'}) }
32
+
33
+ before do
34
+ allow(updated_token).to receive(:persisted?).and_return(true)
35
+ allow(OmniApi::Resources::Oauth2::Token).to receive(:refresh_for).and_return(updated_token)
36
+ end
37
+
38
+ it 'tries to perform the original request again' do
39
+ expect(connection).to receive(:request).with(*arguments)
40
+
41
+ subject
42
+ end
43
+
44
+ context 'retrying the request is successful' do
45
+ let(:response) { ActiveResource::Response.new(body: 'test1') }
46
+
47
+ before { allow(connection).to receive(:request).and_return(response) }
48
+
49
+ it { is_expected.to be response}
50
+ end
51
+
52
+ context 'retrying the request fails' do
53
+ before { allow(connection).to receive(:request).and_raise(ActiveResource::BadRequest.new('test')) }
54
+
55
+ it 'rethrows the error' do
56
+ expect { subject }.to raise_error(ActiveResource::BadRequest)
57
+ end
58
+
59
+ context 'the request fails again with ActiveResource::UnauthorizedAccess' do
60
+ before { allow(connection).to receive(:request).and_raise(ActiveResource::BadRequest.new('test')) }
61
+
62
+
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -16,4 +16,12 @@ describe OmniApi::Resources::UserAuthorizedResource do
16
16
  its(['Authorization']) { is_expected.to eq('bearer ') }
17
17
  end
18
18
  end
19
+
20
+ describe '.connection' do
21
+ subject { OmniApi::Resources::UserAuthorizedResource.connection }
22
+
23
+ it { is_expected.to be_a(OmniApi::Resources::Connection) }
24
+
25
+ its(:error_handler) { is_expected.to be_a(OmniApi::Resources::UserAuthorizationErrorHandler) }
26
+ end
19
27
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omni_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cristi Badila
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-09-21 00:00:00.000000000 Z
12
+ date: 2015-09-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activeresource
@@ -129,10 +129,10 @@ files:
129
129
  - lib/omni_api/resources/base_client_model.rb
130
130
  - lib/omni_api/resources/base_model.rb
131
131
  - lib/omni_api/resources/client.rb
132
+ - lib/omni_api/resources/connection.rb
132
133
  - lib/omni_api/resources/oauth2/grant_types.rb
133
134
  - lib/omni_api/resources/oauth2/resource_types.rb
134
135
  - lib/omni_api/resources/oauth2/token.rb
135
- - lib/omni_api/resources/omni_api_connection.rb
136
136
  - lib/omni_api/resources/payment_plan.rb
137
137
  - lib/omni_api/resources/phone_call.rb
138
138
  - lib/omni_api/resources/sms_message.rb
@@ -140,13 +140,16 @@ files:
140
140
  - lib/omni_api/resources/user/client_association.rb
141
141
  - lib/omni_api/resources/user/device.rb
142
142
  - lib/omni_api/resources/user/user_resource.rb
143
+ - lib/omni_api/resources/user_authorization_error_handler.rb
143
144
  - lib/omni_api/resources/user_authorized_resource.rb
144
145
  - lib/omni_api/version.rb
145
146
  - spec/OmniApi/factories/user_factory_spec.rb
146
147
  - spec/OmniApi/resources/client_spec.rb
148
+ - spec/OmniApi/resources/connection_spec.rb
147
149
  - spec/OmniApi/resources/oauth2/token_spec.rb
148
150
  - spec/OmniApi/resources/sms_message_spec.rb
149
151
  - spec/OmniApi/resources/user/user_resource_spec.rb
152
+ - spec/OmniApi/resources/user_authorization_error_handler_spec.rb
150
153
  - spec/OmniApi/resources/user_authorized_resource_spec.rb
151
154
  - spec/OmniApi/resources/user_spec.rb
152
155
  - spec/OmniApi_spec.rb
@@ -178,9 +181,11 @@ summary: A gem used to make using OmniApi easier
178
181
  test_files:
179
182
  - spec/OmniApi/factories/user_factory_spec.rb
180
183
  - spec/OmniApi/resources/client_spec.rb
184
+ - spec/OmniApi/resources/connection_spec.rb
181
185
  - spec/OmniApi/resources/oauth2/token_spec.rb
182
186
  - spec/OmniApi/resources/sms_message_spec.rb
183
187
  - spec/OmniApi/resources/user/user_resource_spec.rb
188
+ - spec/OmniApi/resources/user_authorization_error_handler_spec.rb
184
189
  - spec/OmniApi/resources/user_authorized_resource_spec.rb
185
190
  - spec/OmniApi/resources/user_spec.rb
186
191
  - spec/OmniApi_spec.rb