rack-oauth2-revibe 1.0.7

Sign up to get free protection for your applications and to get access to all the features.
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