rack-oauth2-revibe 1.0.7

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.
Files changed (107) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.gitignore +22 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +3 -0
  6. data/Gemfile +7 -0
  7. data/LICENSE +20 -0
  8. data/README.rdoc +78 -0
  9. data/Rakefile +25 -0
  10. data/VERSION +1 -0
  11. data/lib/rack/oauth2.rb +67 -0
  12. data/lib/rack/oauth2/access_token.rb +36 -0
  13. data/lib/rack/oauth2/access_token/authenticator.rb +24 -0
  14. data/lib/rack/oauth2/access_token/bearer.rb +11 -0
  15. data/lib/rack/oauth2/access_token/legacy.rb +23 -0
  16. data/lib/rack/oauth2/access_token/mac.rb +103 -0
  17. data/lib/rack/oauth2/access_token/mac/sha256_hex_verifier.rb +17 -0
  18. data/lib/rack/oauth2/access_token/mac/signature.rb +34 -0
  19. data/lib/rack/oauth2/access_token/mac/verifier.rb +44 -0
  20. data/lib/rack/oauth2/client.rb +139 -0
  21. data/lib/rack/oauth2/client/error.rb +14 -0
  22. data/lib/rack/oauth2/client/grant.rb +30 -0
  23. data/lib/rack/oauth2/client/grant/authorization_code.rb +12 -0
  24. data/lib/rack/oauth2/client/grant/client_credentials.rb +10 -0
  25. data/lib/rack/oauth2/client/grant/facebook_token.rb +12 -0
  26. data/lib/rack/oauth2/client/grant/password.rb +11 -0
  27. data/lib/rack/oauth2/client/grant/refresh_token.rb +11 -0
  28. data/lib/rack/oauth2/debugger.rb +3 -0
  29. data/lib/rack/oauth2/debugger/request_filter.rb +30 -0
  30. data/lib/rack/oauth2/server.rb +4 -0
  31. data/lib/rack/oauth2/server/abstract.rb +4 -0
  32. data/lib/rack/oauth2/server/abstract/error.rb +69 -0
  33. data/lib/rack/oauth2/server/abstract/handler.rb +20 -0
  34. data/lib/rack/oauth2/server/abstract/request.rb +29 -0
  35. data/lib/rack/oauth2/server/abstract/response.rb +15 -0
  36. data/lib/rack/oauth2/server/authorize.rb +117 -0
  37. data/lib/rack/oauth2/server/authorize/code.rb +39 -0
  38. data/lib/rack/oauth2/server/authorize/error.rb +71 -0
  39. data/lib/rack/oauth2/server/authorize/extension.rb +12 -0
  40. data/lib/rack/oauth2/server/authorize/extension/code_and_token.rb +39 -0
  41. data/lib/rack/oauth2/server/authorize/token.rb +43 -0
  42. data/lib/rack/oauth2/server/resource.rb +55 -0
  43. data/lib/rack/oauth2/server/resource/bearer.rb +47 -0
  44. data/lib/rack/oauth2/server/resource/bearer/error.rb +24 -0
  45. data/lib/rack/oauth2/server/resource/error.rb +81 -0
  46. data/lib/rack/oauth2/server/resource/mac.rb +36 -0
  47. data/lib/rack/oauth2/server/resource/mac/error.rb +24 -0
  48. data/lib/rack/oauth2/server/token.rb +87 -0
  49. data/lib/rack/oauth2/server/token/authorization_code.rb +28 -0
  50. data/lib/rack/oauth2/server/token/client_credentials.rb +23 -0
  51. data/lib/rack/oauth2/server/token/error.rb +54 -0
  52. data/lib/rack/oauth2/server/token/extension.rb +12 -0
  53. data/lib/rack/oauth2/server/token/extension/jwt.rb +37 -0
  54. data/lib/rack/oauth2/server/token/facebook_token.rb +27 -0
  55. data/lib/rack/oauth2/server/token/password.rb +27 -0
  56. data/lib/rack/oauth2/server/token/refresh_token.rb +26 -0
  57. data/lib/rack/oauth2/util.rb +58 -0
  58. data/rack-oauth2.gemspec +30 -0
  59. data/spec/helpers/time.rb +19 -0
  60. data/spec/helpers/webmock_helper.rb +41 -0
  61. data/spec/mock_response/blank +0 -0
  62. data/spec/mock_response/errors/invalid_request.json +4 -0
  63. data/spec/mock_response/resources/fake.txt +1 -0
  64. data/spec/mock_response/tokens/_Bearer.json +6 -0
  65. data/spec/mock_response/tokens/bearer.json +6 -0
  66. data/spec/mock_response/tokens/legacy.json +5 -0
  67. data/spec/mock_response/tokens/legacy.txt +1 -0
  68. data/spec/mock_response/tokens/legacy_without_expires_in.txt +1 -0
  69. data/spec/mock_response/tokens/mac.json +8 -0
  70. data/spec/mock_response/tokens/unknown.json +6 -0
  71. data/spec/rack/oauth2/access_token/authenticator_spec.rb +43 -0
  72. data/spec/rack/oauth2/access_token/bearer_spec.rb +18 -0
  73. data/spec/rack/oauth2/access_token/legacy_spec.rb +23 -0
  74. data/spec/rack/oauth2/access_token/mac/sha256_hex_verifier_spec.rb +28 -0
  75. data/spec/rack/oauth2/access_token/mac/signature_spec.rb +59 -0
  76. data/spec/rack/oauth2/access_token/mac/verifier_spec.rb +25 -0
  77. data/spec/rack/oauth2/access_token/mac_spec.rb +141 -0
  78. data/spec/rack/oauth2/access_token_spec.rb +69 -0
  79. data/spec/rack/oauth2/client/error_spec.rb +18 -0
  80. data/spec/rack/oauth2/client/grant/authorization_code_spec.rb +37 -0
  81. data/spec/rack/oauth2/client/grant/client_credentials_spec.rb +7 -0
  82. data/spec/rack/oauth2/client/grant/password_spec.rb +33 -0
  83. data/spec/rack/oauth2/client/grant/refresh_token_spec.rb +21 -0
  84. data/spec/rack/oauth2/client_spec.rb +287 -0
  85. data/spec/rack/oauth2/debugger/request_filter_spec.rb +33 -0
  86. data/spec/rack/oauth2/oauth2_spec.rb +74 -0
  87. data/spec/rack/oauth2/server/abstract/error_spec.rb +59 -0
  88. data/spec/rack/oauth2/server/authorize/code_spec.rb +57 -0
  89. data/spec/rack/oauth2/server/authorize/error_spec.rb +103 -0
  90. data/spec/rack/oauth2/server/authorize/extensions/code_and_token_spec.rb +60 -0
  91. data/spec/rack/oauth2/server/authorize/token_spec.rb +73 -0
  92. data/spec/rack/oauth2/server/authorize_spec.rb +214 -0
  93. data/spec/rack/oauth2/server/resource/bearer/error_spec.rb +52 -0
  94. data/spec/rack/oauth2/server/resource/bearer_spec.rb +123 -0
  95. data/spec/rack/oauth2/server/resource/error_spec.rb +147 -0
  96. data/spec/rack/oauth2/server/resource/mac/error_spec.rb +52 -0
  97. data/spec/rack/oauth2/server/resource/mac_spec.rb +119 -0
  98. data/spec/rack/oauth2/server/resource_spec.rb +23 -0
  99. data/spec/rack/oauth2/server/token/authorization_code_spec.rb +43 -0
  100. data/spec/rack/oauth2/server/token/client_credentials_spec.rb +23 -0
  101. data/spec/rack/oauth2/server/token/error_spec.rb +77 -0
  102. data/spec/rack/oauth2/server/token/password_spec.rb +37 -0
  103. data/spec/rack/oauth2/server/token/refresh_token_spec.rb +34 -0
  104. data/spec/rack/oauth2/server/token_spec.rb +134 -0
  105. data/spec/rack/oauth2/util_spec.rb +97 -0
  106. data/spec/spec_helper.rb +14 -0
  107. metadata +326 -0
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rack::OAuth2::Debugger::RequestFilter do
4
+ let(:resource_endpoint) { 'https://example.com/resources' }
5
+ let(:request) { HTTP::Message.new_request(:get, URI.parse(resource_endpoint)) }
6
+ let(:response) { HTTP::Message.new_response(MultiJson.dump({:hello => 'world'})) }
7
+ let(:request_filter) { Rack::OAuth2::Debugger::RequestFilter.new }
8
+
9
+ describe '#filter_request' do
10
+ it 'should log request' do
11
+ [
12
+ "======= [Rack::OAuth2] HTTP REQUEST STARTED =======",
13
+ request.dump
14
+ ].each do |output|
15
+ Rack::OAuth2.logger.should_receive(:info).with output
16
+ end
17
+ request_filter.filter_request(request)
18
+ end
19
+ end
20
+
21
+ describe '#filter_response' do
22
+ it 'should log response' do
23
+ [
24
+ "--------------------------------------------------",
25
+ response.dump,
26
+ "======= [Rack::OAuth2] HTTP REQUEST FINISHED ======="
27
+ ].each do |output|
28
+ Rack::OAuth2.logger.should_receive(:info).with output
29
+ end
30
+ request_filter.filter_response(request, response)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,74 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rack::OAuth2 do
4
+ subject { Rack::OAuth2 }
5
+ after { Rack::OAuth2.debugging = false }
6
+
7
+ its(:logger) { should be_a Logger }
8
+ its(:debugging?) { should be_false }
9
+
10
+ describe '.debug!' do
11
+ before { Rack::OAuth2.debug! }
12
+ its(:debugging?) { should be_true }
13
+ end
14
+
15
+ describe '.debug' do
16
+ it 'should enable debugging within given block' do
17
+ Rack::OAuth2.debug do
18
+ Rack::OAuth2.debugging?.should be_true
19
+ end
20
+ Rack::OAuth2.debugging?.should be_false
21
+ end
22
+
23
+ it 'should not force disable debugging' do
24
+ Rack::OAuth2.debug!
25
+ Rack::OAuth2.debug do
26
+ Rack::OAuth2.debugging?.should be_true
27
+ end
28
+ Rack::OAuth2.debugging?.should be_true
29
+ end
30
+ end
31
+
32
+ describe '.http_config' do
33
+ context 'when request_filter added' do
34
+ context 'when "debug!" is called' do
35
+ after { Rack::OAuth2.reset_http_config! }
36
+
37
+ it 'should put Debugger::RequestFilter at last' do
38
+ Rack::OAuth2.debug!
39
+ Rack::OAuth2.http_config do |config|
40
+ config.request_filter << Proc.new {}
41
+ end
42
+ Rack::OAuth2.http_client.request_filter.last.should be_instance_of Rack::OAuth2::Debugger::RequestFilter
43
+ end
44
+
45
+ it 'should reset_http_config' do
46
+ Rack::OAuth2.debug!
47
+ Rack::OAuth2.http_config do |config|
48
+ config.request_filter << Proc.new {}
49
+ end
50
+ size = Rack::OAuth2.http_client.request_filter.size
51
+ Rack::OAuth2.reset_http_config!
52
+ Rack::OAuth2.http_client.request_filter.size.should == size - 1
53
+ end
54
+
55
+ end
56
+ end
57
+ end
58
+
59
+ describe ".http_client" do
60
+ context "when local_http_config is used" do
61
+ it "should correctly set request_filter" do
62
+ clnt1 = Rack::OAuth2.http_client
63
+ clnt2 = Rack::OAuth2.http_client("my client") do |config|
64
+ config.request_filter << Proc.new {}
65
+ end
66
+ clnt3 = Rack::OAuth2.http_client
67
+
68
+ clnt1.request_filter.size.should == clnt3.request_filter.size
69
+ clnt1.request_filter.size.should == clnt2.request_filter.size - 1
70
+
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper.rb'
2
+
3
+ describe Rack::OAuth2::Server::Abstract::Error do
4
+
5
+ context 'when full attributes are given' do
6
+ subject do
7
+ Rack::OAuth2::Server::Abstract::Error.new 400, :invalid_request, 'Missing some required params', :uri => 'http://server.example.com/error'
8
+ end
9
+ its(:status) { should == 400 }
10
+ its(:error) { should == :invalid_request }
11
+ its(:description) { should == 'Missing some required params' }
12
+ its(:uri) { should == 'http://server.example.com/error' }
13
+ its(:protocol_params) do
14
+ should == {
15
+ :error => :invalid_request,
16
+ :error_description => 'Missing some required params',
17
+ :error_uri => 'http://server.example.com/error'
18
+ }
19
+ end
20
+ end
21
+
22
+ context 'when optional attributes are not given' do
23
+ subject do
24
+ Rack::OAuth2::Server::Abstract::Error.new 400, :invalid_request
25
+ end
26
+ its(:status) { should == 400 }
27
+ its(:error) { should == :invalid_request }
28
+ its(:description) { should be_nil }
29
+ its(:uri) { should be_nil }
30
+ its(:protocol_params) do
31
+ should == {
32
+ :error => :invalid_request,
33
+ :error_description => nil,
34
+ :error_uri => nil
35
+ }
36
+ end
37
+ end
38
+
39
+ end
40
+
41
+ describe Rack::OAuth2::Server::Abstract::BadRequest do
42
+ its(:status) { should == 400 }
43
+ end
44
+
45
+ describe Rack::OAuth2::Server::Abstract::Unauthorized do
46
+ its(:status) { should == 401 }
47
+ end
48
+
49
+ describe Rack::OAuth2::Server::Abstract::Forbidden do
50
+ its(:status) { should == 403 }
51
+ end
52
+
53
+ describe Rack::OAuth2::Server::Abstract::ServerError do
54
+ its(:status) { should == 500 }
55
+ end
56
+
57
+ describe Rack::OAuth2::Server::Abstract::TemporarilyUnavailable do
58
+ its(:status) { should == 503 }
59
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper.rb'
2
+
3
+ describe Rack::OAuth2::Server::Authorize::Code do
4
+ let(:request) { Rack::MockRequest.new app }
5
+ let(:redirect_uri) { 'http://client.example.com/callback' }
6
+ let(:authorization_code) { 'authorization_code' }
7
+ let(:response) { request.get "/?response_type=code&client_id=client&redirect_uri=#{redirect_uri}&state=state" }
8
+
9
+ context 'when approved' do
10
+ subject { response }
11
+ let :app do
12
+ Rack::OAuth2::Server::Authorize.new do |request, response|
13
+ response.redirect_uri = redirect_uri
14
+ response.code = authorization_code
15
+ response.approve!
16
+ end
17
+ end
18
+ its(:status) { should == 302 }
19
+ its(:location) { should == "#{redirect_uri}?code=#{authorization_code}&state=state" }
20
+
21
+ context 'when redirect_uri already includes query' do
22
+ let(:redirect_uri) { 'http://client.example.com/callback?k=v' }
23
+ its(:location) { should == "#{redirect_uri}&code=#{authorization_code}&state=state" }
24
+ end
25
+
26
+ context 'when redirect_uri is missing' do
27
+ let(:redirect_uri) { nil }
28
+ it do
29
+ expect { response }.to raise_error AttrRequired::AttrMissing
30
+ end
31
+ end
32
+
33
+ context 'when code is missing' do
34
+ let(:authorization_code) { nil }
35
+ it do
36
+ expect { response }.to raise_error AttrRequired::AttrMissing
37
+ end
38
+ end
39
+ end
40
+
41
+ context 'when denied' do
42
+ let :app do
43
+ Rack::OAuth2::Server::Authorize.new do |request, response|
44
+ request.verify_redirect_uri! redirect_uri
45
+ request.access_denied!
46
+ end
47
+ end
48
+ it 'should redirect with error in query' do
49
+ response.status.should == 302
50
+ error_message = {
51
+ :error => :access_denied,
52
+ :error_description => Rack::OAuth2::Server::Authorize::ErrorMethods::DEFAULT_DESCRIPTION[:access_denied]
53
+ }
54
+ response.location.should == "#{redirect_uri}?#{error_message.to_query}&state=state"
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,103 @@
1
+ require 'spec_helper.rb'
2
+
3
+ describe Rack::OAuth2::Server::Authorize::BadRequest do
4
+ let(:klass) { Rack::OAuth2::Server::Authorize::BadRequest }
5
+ let(:error) { klass.new(:invalid_request) }
6
+ let(:redirect_uri) { 'http://client.example.com/callback' }
7
+
8
+ subject { error }
9
+ it { should be_a Rack::OAuth2::Server::Abstract::BadRequest }
10
+ its(:protocol_params) do
11
+ should == {
12
+ :error => :invalid_request,
13
+ :error_description => nil,
14
+ :error_uri => nil,
15
+ :state => nil
16
+ }
17
+ end
18
+
19
+ describe '#finish' do
20
+ context 'when redirect_uri is given' do
21
+ before { error.redirect_uri = redirect_uri }
22
+
23
+ context 'when protocol_params_location = :query' do
24
+ before { error.protocol_params_location = :query }
25
+ it 'should redirect with error in query' do
26
+ state, header, response = error.finish
27
+ state.should == 302
28
+ header["Location"].should == "#{redirect_uri}?error=invalid_request"
29
+ end
30
+ end
31
+
32
+ context 'when protocol_params_location = :fragment' do
33
+ before { error.protocol_params_location = :fragment }
34
+ it 'should redirect with error in fragment' do
35
+ state, header, response = error.finish
36
+ state.should == 302
37
+ header["Location"].should == "#{redirect_uri}#error=invalid_request"
38
+ end
39
+ end
40
+
41
+ context 'otherwise' do
42
+ before { error.protocol_params_location = :other }
43
+ it 'should redirect without error' do
44
+ state, header, response = error.finish
45
+ state.should == 302
46
+ header["Location"].should == redirect_uri
47
+ end
48
+ end
49
+ end
50
+
51
+ context 'otherwise' do
52
+ it 'should raise itself' do
53
+ expect { error.finish }.to raise_error(klass) { |e|
54
+ e.should == error
55
+ }
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ describe Rack::OAuth2::Server::Authorize::ErrorMethods do
62
+ let(:klass) { Rack::OAuth2::Server::Authorize::BadRequest }
63
+ let(:redirect_uri) { 'http://client.example.com/callback' }
64
+ let(:default_description) { Rack::OAuth2::Server::Authorize::ErrorMethods::DEFAULT_DESCRIPTION }
65
+ let(:env) { Rack::MockRequest.env_for("/authorize?client_id=client_id") }
66
+ let(:request) { Rack::OAuth2::Server::Authorize::Request.new env }
67
+ let(:request_for_code) { Rack::OAuth2::Server::Authorize::Code::Request.new env }
68
+ let(:request_for_token) { Rack::OAuth2::Server::Authorize::Token::Request.new env }
69
+
70
+ describe 'bad_request!' do
71
+ it do
72
+ expect { request.bad_request! }.to raise_error klass
73
+ end
74
+
75
+ context 'when response_type = :code' do
76
+ it 'should set protocol_params_location = :query' do
77
+ expect { request_for_code.bad_request! }.to raise_error(klass) { |e|
78
+ e.protocol_params_location.should == :query
79
+ }
80
+ end
81
+ end
82
+
83
+ context 'when response_type = :token' do
84
+ it 'should set protocol_params_location = :fragment' do
85
+ expect { request_for_token.bad_request! }.to raise_error(klass) { |e|
86
+ e.protocol_params_location.should == :fragment
87
+ }
88
+ end
89
+ end
90
+ end
91
+
92
+ Rack::OAuth2::Server::Authorize::ErrorMethods::DEFAULT_DESCRIPTION.keys.each do |error_code|
93
+ method = "#{error_code}!"
94
+ describe method do
95
+ it "should raise Rack::OAuth2::Server::Authorize::BadRequest with error = :#{error_code}" do
96
+ expect { request.send method }.to raise_error(klass) { |error|
97
+ error.error.should == error_code
98
+ error.description.should == default_description[error_code]
99
+ }
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper.rb'
2
+ require 'rack/oauth2/server/authorize/extension/code_and_token'
3
+
4
+ describe Rack::OAuth2::Server::Authorize::Extension::CodeAndToken do
5
+ let(:request) { Rack::MockRequest.new app }
6
+ let(:redirect_uri) { 'http://client.example.com/callback' }
7
+ let(:access_token) { 'access_token' }
8
+ let(:authorization_code) { 'authorization_code' }
9
+ let(:response) do
10
+ request.get("/?response_type=code%20token&client_id=client&redirect_uri=#{redirect_uri}")
11
+ end
12
+
13
+ context "when approved" do
14
+ subject { response }
15
+ let(:bearer_token) { Rack::OAuth2::AccessToken::Bearer.new(:access_token => access_token) }
16
+ let :app do
17
+ Rack::OAuth2::Server::Authorize.new do |request, response|
18
+ response.redirect_uri = redirect_uri
19
+ response.access_token = bearer_token
20
+ response.code = authorization_code
21
+ response.approve!
22
+ end
23
+ end
24
+ its(:status) { should == 302 }
25
+ its(:location) { should include "#{redirect_uri}#" }
26
+ its(:location) { should include "code=#{authorization_code}"}
27
+ its(:location) { should include "access_token=#{access_token}"}
28
+ its(:location) { should include 'token_type=bearer' }
29
+
30
+ context 'when refresh_token is given' do
31
+ let :bearer_token do
32
+ Rack::OAuth2::AccessToken::Bearer.new(
33
+ :access_token => access_token,
34
+ :refresh_token => 'refresh'
35
+ )
36
+ end
37
+ its(:location) { should include "#{redirect_uri}#" }
38
+ its(:location) { should include "code=#{authorization_code}"}
39
+ its(:location) { should include "access_token=#{access_token}"}
40
+ its(:location) { should include 'token_type=bearer' }
41
+ end
42
+ end
43
+
44
+ context 'when denied' do
45
+ let :app do
46
+ Rack::OAuth2::Server::Authorize.new do |request, response|
47
+ request.verify_redirect_uri! redirect_uri
48
+ request.access_denied!
49
+ end
50
+ end
51
+ it 'should redirect with error in fragment' do
52
+ response.status.should == 302
53
+ error_message = {
54
+ :error => :access_denied,
55
+ :error_description => Rack::OAuth2::Server::Authorize::ErrorMethods::DEFAULT_DESCRIPTION[:access_denied]
56
+ }
57
+ response.location.should == "#{redirect_uri}##{error_message.to_query}"
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,73 @@
1
+ require 'spec_helper.rb'
2
+
3
+ describe Rack::OAuth2::Server::Authorize::Token do
4
+ let(:request) { Rack::MockRequest.new app }
5
+ let(:redirect_uri) { 'http://client.example.com/callback' }
6
+ let(:access_token) { 'access_token' }
7
+ let(:response) { request.get("/?response_type=token&client_id=client&redirect_uri=#{redirect_uri}&state=state") }
8
+
9
+ context "when approved" do
10
+ subject { response }
11
+ let(:bearer_token) { Rack::OAuth2::AccessToken::Bearer.new(:access_token => access_token) }
12
+ let :app do
13
+ Rack::OAuth2::Server::Authorize.new do |request, response|
14
+ response.redirect_uri = redirect_uri
15
+ response.access_token = bearer_token
16
+ response.approve!
17
+ end
18
+ end
19
+ its(:status) { should == 302 }
20
+ its(:location) { should == "#{redirect_uri}#access_token=#{access_token}&state=state&token_type=bearer" }
21
+
22
+ context 'when refresh_token is given' do
23
+ let :bearer_token do
24
+ Rack::OAuth2::AccessToken::Bearer.new(
25
+ :access_token => access_token,
26
+ :refresh_token => 'refresh'
27
+ )
28
+ end
29
+ its(:location) { should == "#{redirect_uri}#access_token=#{access_token}&state=state&token_type=bearer" }
30
+ end
31
+
32
+ context 'when redirect_uri is missing' do
33
+ let :app do
34
+ Rack::OAuth2::Server::Authorize.new do |request, response|
35
+ response.access_token = bearer_token
36
+ response.approve!
37
+ end
38
+ end
39
+ it do
40
+ expect { response }.to raise_error AttrRequired::AttrMissing
41
+ end
42
+ end
43
+
44
+ context 'when access_token is missing' do
45
+ let :app do
46
+ Rack::OAuth2::Server::Authorize.new do |request, response|
47
+ response.redirect_uri = redirect_uri
48
+ response.approve!
49
+ end
50
+ end
51
+ it do
52
+ expect { response }.to raise_error AttrRequired::AttrMissing
53
+ end
54
+ end
55
+ end
56
+
57
+ context 'when denied' do
58
+ let :app do
59
+ Rack::OAuth2::Server::Authorize.new do |request, response|
60
+ request.verify_redirect_uri! redirect_uri
61
+ request.access_denied!
62
+ end
63
+ end
64
+ it 'should redirect with error in fragment' do
65
+ response.status.should == 302
66
+ error_message = {
67
+ :error => :access_denied,
68
+ :error_description => Rack::OAuth2::Server::Authorize::ErrorMethods::DEFAULT_DESCRIPTION[:access_denied]
69
+ }
70
+ response.location.should == "#{redirect_uri}##{error_message.to_query}&state=state"
71
+ end
72
+ end
73
+ end