doorkeeper 3.1.0 → 5.6.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of doorkeeper might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/CHANGELOG.md +1079 -0
- data/README.md +114 -326
- data/app/assets/stylesheets/doorkeeper/admin/application.css +2 -2
- data/app/controllers/doorkeeper/application_controller.rb +7 -6
- data/app/controllers/doorkeeper/application_metal_controller.rb +9 -12
- data/app/controllers/doorkeeper/applications_controller.rb +66 -21
- data/app/controllers/doorkeeper/authorizations_controller.rb +100 -18
- data/app/controllers/doorkeeper/authorized_applications_controller.rb +23 -4
- data/app/controllers/doorkeeper/token_info_controller.rb +16 -4
- data/app/controllers/doorkeeper/tokens_controller.rb +138 -22
- data/app/helpers/doorkeeper/dashboard_helper.rb +15 -9
- data/app/views/doorkeeper/applications/_delete_form.html.erb +4 -3
- data/app/views/doorkeeper/applications/_form.html.erb +33 -21
- data/app/views/doorkeeper/applications/edit.html.erb +1 -1
- data/app/views/doorkeeper/applications/index.html.erb +18 -6
- data/app/views/doorkeeper/applications/new.html.erb +1 -1
- data/app/views/doorkeeper/applications/show.html.erb +40 -16
- data/app/views/doorkeeper/authorizations/error.html.erb +1 -1
- data/app/views/doorkeeper/authorizations/form_post.html.erb +15 -0
- data/app/views/doorkeeper/authorizations/new.html.erb +17 -11
- data/app/views/doorkeeper/authorized_applications/_delete_form.html.erb +1 -2
- data/app/views/doorkeeper/authorized_applications/index.html.erb +0 -1
- data/app/views/layouts/doorkeeper/admin.html.erb +16 -14
- data/config/locales/en.yml +37 -9
- data/lib/doorkeeper/config/abstract_builder.rb +28 -0
- data/lib/doorkeeper/config/option.rb +82 -0
- data/lib/doorkeeper/config/validations.rb +53 -0
- data/lib/doorkeeper/config.rb +602 -142
- data/lib/doorkeeper/engine.rb +22 -7
- data/lib/doorkeeper/errors.rb +37 -10
- data/lib/doorkeeper/grant_flow/fallback_flow.rb +15 -0
- data/lib/doorkeeper/grant_flow/flow.rb +44 -0
- data/lib/doorkeeper/grant_flow/registry.rb +50 -0
- data/lib/doorkeeper/grant_flow.rb +45 -0
- data/lib/doorkeeper/grape/authorization_decorator.rb +6 -4
- data/lib/doorkeeper/grape/helpers.rb +24 -12
- data/lib/doorkeeper/helpers/controller.rb +49 -27
- data/lib/doorkeeper/models/access_grant_mixin.rb +99 -16
- data/lib/doorkeeper/models/access_token_mixin.rb +386 -77
- data/lib/doorkeeper/models/application_mixin.rb +73 -30
- data/lib/doorkeeper/models/concerns/accessible.rb +6 -0
- data/lib/doorkeeper/models/concerns/expirable.rb +20 -6
- data/lib/doorkeeper/models/concerns/expiration_time_sql_math.rb +88 -0
- data/lib/doorkeeper/models/concerns/orderable.rb +15 -0
- data/lib/doorkeeper/models/concerns/ownership.rb +4 -2
- data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
- data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
- data/lib/doorkeeper/models/concerns/revocable.rb +13 -2
- data/lib/doorkeeper/models/concerns/scopes.rb +12 -2
- data/lib/doorkeeper/models/concerns/secret_storable.rb +106 -0
- data/lib/doorkeeper/oauth/authorization/code.rb +48 -12
- data/lib/doorkeeper/oauth/authorization/context.rb +17 -0
- data/lib/doorkeeper/oauth/authorization/token.rb +72 -28
- data/lib/doorkeeper/oauth/authorization/uri_builder.rb +22 -18
- data/lib/doorkeeper/oauth/authorization_code_request.rb +64 -14
- data/lib/doorkeeper/oauth/base_request.rb +66 -0
- data/lib/doorkeeper/oauth/base_response.rb +31 -0
- data/lib/doorkeeper/oauth/client/credentials.rb +23 -10
- data/lib/doorkeeper/oauth/client.rb +10 -12
- data/lib/doorkeeper/oauth/client_credentials/creator.rb +48 -4
- data/lib/doorkeeper/oauth/client_credentials/issuer.rb +17 -9
- data/lib/doorkeeper/oauth/client_credentials/validator.rb +55 -0
- data/lib/doorkeeper/oauth/client_credentials_request.rb +14 -15
- data/lib/doorkeeper/oauth/code_request.rb +8 -12
- data/lib/doorkeeper/oauth/code_response.rb +31 -19
- data/lib/doorkeeper/oauth/error.rb +5 -3
- data/lib/doorkeeper/oauth/error_response.rb +41 -20
- data/lib/doorkeeper/oauth/forbidden_token_response.rb +11 -3
- data/lib/doorkeeper/oauth/helpers/scope_checker.rb +24 -19
- data/lib/doorkeeper/oauth/helpers/unique_token.rb +20 -3
- data/lib/doorkeeper/oauth/helpers/uri_checker.rb +55 -4
- data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
- data/lib/doorkeeper/oauth/invalid_request_response.rb +43 -0
- data/lib/doorkeeper/oauth/invalid_token_response.rb +31 -5
- data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
- data/lib/doorkeeper/oauth/password_access_token_request.rb +46 -18
- data/lib/doorkeeper/oauth/pre_authorization.rb +135 -26
- data/lib/doorkeeper/oauth/refresh_token_request.rb +67 -30
- data/lib/doorkeeper/oauth/scopes.rb +26 -12
- data/lib/doorkeeper/oauth/token.rb +28 -25
- data/lib/doorkeeper/oauth/token_introspection.rb +202 -0
- data/lib/doorkeeper/oauth/token_request.rb +8 -21
- data/lib/doorkeeper/oauth/token_response.rb +14 -10
- data/lib/doorkeeper/oauth.rb +13 -0
- data/lib/doorkeeper/orm/active_record/access_grant.rb +6 -4
- data/lib/doorkeeper/orm/active_record/access_token.rb +5 -17
- data/lib/doorkeeper/orm/active_record/application.rb +6 -20
- data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +69 -0
- data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +81 -0
- data/lib/doorkeeper/orm/active_record/mixins/application.rb +214 -0
- data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +66 -0
- data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +33 -0
- data/lib/doorkeeper/orm/active_record.rb +36 -26
- data/lib/doorkeeper/rails/helpers.rb +14 -15
- data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
- data/lib/doorkeeper/rails/routes/mapper.rb +4 -2
- data/lib/doorkeeper/rails/routes/mapping.rb +10 -8
- data/lib/doorkeeper/rails/routes/registry.rb +45 -0
- data/lib/doorkeeper/rails/routes.rb +45 -28
- data/lib/doorkeeper/rake/db.rake +40 -0
- data/lib/doorkeeper/rake/setup.rake +6 -0
- data/lib/doorkeeper/rake.rb +14 -0
- data/lib/doorkeeper/request/authorization_code.rb +12 -4
- data/lib/doorkeeper/request/client_credentials.rb +3 -3
- data/lib/doorkeeper/request/code.rb +1 -1
- data/lib/doorkeeper/request/password.rb +5 -4
- data/lib/doorkeeper/request/refresh_token.rb +6 -5
- data/lib/doorkeeper/request/strategy.rb +4 -2
- data/lib/doorkeeper/request/token.rb +1 -1
- data/lib/doorkeeper/request.rb +62 -29
- data/lib/doorkeeper/secret_storing/base.rb +64 -0
- data/lib/doorkeeper/secret_storing/bcrypt.rb +60 -0
- data/lib/doorkeeper/secret_storing/plain.rb +33 -0
- data/lib/doorkeeper/secret_storing/sha256_hash.rb +26 -0
- data/lib/doorkeeper/server.rb +9 -19
- data/lib/doorkeeper/stale_records_cleaner.rb +24 -0
- data/lib/doorkeeper/validations.rb +5 -2
- data/lib/doorkeeper/version.rb +12 -1
- data/lib/doorkeeper.rb +112 -56
- data/lib/generators/doorkeeper/application_owner_generator.rb +28 -13
- data/lib/generators/doorkeeper/confidential_applications_generator.rb +33 -0
- data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
- data/lib/generators/doorkeeper/install_generator.rb +19 -9
- data/lib/generators/doorkeeper/migration_generator.rb +27 -10
- data/lib/generators/doorkeeper/pkce_generator.rb +33 -0
- data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +41 -0
- data/lib/generators/doorkeeper/templates/add_confidential_to_applications.rb.erb +13 -0
- data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +9 -0
- data/lib/generators/doorkeeper/templates/add_previous_refresh_token_to_access_tokens.rb.erb +13 -0
- data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +8 -0
- data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
- data/lib/generators/doorkeeper/templates/initializer.rb +417 -32
- data/lib/generators/doorkeeper/templates/migration.rb.erb +88 -0
- data/lib/generators/doorkeeper/views_generator.rb +8 -4
- data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +4 -5
- metadata +163 -280
- data/.gitignore +0 -14
- data/.hound.yml +0 -13
- data/.rspec +0 -1
- data/.travis.yml +0 -22
- data/CONTRIBUTING.md +0 -45
- data/Gemfile +0 -10
- data/NEWS.md +0 -525
- data/RELEASING.md +0 -17
- data/Rakefile +0 -20
- data/app/validators/redirect_uri_validator.rb +0 -34
- data/doorkeeper.gemspec +0 -27
- data/lib/doorkeeper/oauth/client/methods.rb +0 -18
- data/lib/doorkeeper/oauth/client_credentials/validation.rb +0 -45
- data/lib/doorkeeper/oauth/request_concern.rb +0 -48
- data/lib/generators/doorkeeper/application_scopes_generator.rb +0 -34
- data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb +0 -7
- data/lib/generators/doorkeeper/templates/add_scopes_to_oauth_applications.rb +0 -5
- data/lib/generators/doorkeeper/templates/migration.rb +0 -50
- data/spec/controllers/applications_controller_spec.rb +0 -58
- data/spec/controllers/authorizations_controller_spec.rb +0 -203
- data/spec/controllers/protected_resources_controller_spec.rb +0 -271
- data/spec/controllers/token_info_controller_spec.rb +0 -52
- data/spec/controllers/tokens_controller_spec.rb +0 -88
- data/spec/dummy/Rakefile +0 -7
- data/spec/dummy/app/controllers/application_controller.rb +0 -3
- data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -7
- data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -12
- data/spec/dummy/app/controllers/home_controller.rb +0 -17
- data/spec/dummy/app/controllers/metal_controller.rb +0 -11
- data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -11
- data/spec/dummy/app/helpers/application_helper.rb +0 -5
- data/spec/dummy/app/models/user.rb +0 -9
- data/spec/dummy/app/views/home/index.html.erb +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +0 -14
- data/spec/dummy/config/application.rb +0 -57
- data/spec/dummy/config/boot.rb +0 -9
- data/spec/dummy/config/database.yml +0 -15
- data/spec/dummy/config/environment.rb +0 -5
- data/spec/dummy/config/environments/development.rb +0 -29
- data/spec/dummy/config/environments/production.rb +0 -62
- data/spec/dummy/config/environments/test.rb +0 -55
- data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/dummy/config/initializers/doorkeeper.rb +0 -96
- data/spec/dummy/config/initializers/secret_token.rb +0 -9
- data/spec/dummy/config/initializers/session_store.rb +0 -8
- data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
- data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
- data/spec/dummy/config/routes.rb +0 -52
- data/spec/dummy/config.ru +0 -4
- data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -9
- data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -5
- data/spec/dummy/db/migrate/20130902165751_create_doorkeeper_tables.rb +0 -41
- data/spec/dummy/db/migrate/20130902175349_add_owner_to_application.rb +0 -7
- data/spec/dummy/db/migrate/20141209001746_add_scopes_to_oauth_applications.rb +0 -5
- data/spec/dummy/db/schema.rb +0 -66
- data/spec/dummy/public/404.html +0 -26
- data/spec/dummy/public/422.html +0 -26
- data/spec/dummy/public/500.html +0 -26
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +0 -6
- data/spec/factories.rb +0 -26
- data/spec/generators/application_owner_generator_spec.rb +0 -22
- data/spec/generators/install_generator_spec.rb +0 -31
- data/spec/generators/migration_generator_spec.rb +0 -20
- data/spec/generators/templates/routes.rb +0 -3
- data/spec/generators/views_generator_spec.rb +0 -27
- data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -24
- data/spec/lib/config_spec.rb +0 -317
- data/spec/lib/doorkeeper_spec.rb +0 -28
- data/spec/lib/models/expirable_spec.rb +0 -51
- data/spec/lib/models/revocable_spec.rb +0 -36
- data/spec/lib/models/scopes_spec.rb +0 -43
- data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -42
- data/spec/lib/oauth/authorization_code_request_spec.rb +0 -80
- data/spec/lib/oauth/client/credentials_spec.rb +0 -47
- data/spec/lib/oauth/client/methods_spec.rb +0 -54
- data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -44
- data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -86
- data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -54
- data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
- data/spec/lib/oauth/client_credentials_request_spec.rb +0 -104
- data/spec/lib/oauth/client_spec.rb +0 -39
- data/spec/lib/oauth/code_request_spec.rb +0 -45
- data/spec/lib/oauth/error_response_spec.rb +0 -61
- data/spec/lib/oauth/error_spec.rb +0 -23
- data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -23
- data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -64
- data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -20
- data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -104
- data/spec/lib/oauth/invalid_token_response_spec.rb +0 -28
- data/spec/lib/oauth/password_access_token_request_spec.rb +0 -90
- data/spec/lib/oauth/pre_authorization_spec.rb +0 -155
- data/spec/lib/oauth/refresh_token_request_spec.rb +0 -123
- data/spec/lib/oauth/scopes_spec.rb +0 -123
- data/spec/lib/oauth/token_request_spec.rb +0 -98
- data/spec/lib/oauth/token_response_spec.rb +0 -85
- data/spec/lib/oauth/token_spec.rb +0 -109
- data/spec/lib/request/strategy_spec.rb +0 -53
- data/spec/lib/server_spec.rb +0 -52
- data/spec/models/doorkeeper/access_grant_spec.rb +0 -36
- data/spec/models/doorkeeper/access_token_spec.rb +0 -350
- data/spec/models/doorkeeper/application_spec.rb +0 -187
- data/spec/requests/applications/applications_request_spec.rb +0 -94
- data/spec/requests/applications/authorized_applications_spec.rb +0 -30
- data/spec/requests/endpoints/authorization_spec.rb +0 -72
- data/spec/requests/endpoints/token_spec.rb +0 -64
- data/spec/requests/flows/authorization_code_errors_spec.rb +0 -66
- data/spec/requests/flows/authorization_code_spec.rb +0 -156
- data/spec/requests/flows/client_credentials_spec.rb +0 -58
- data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -32
- data/spec/requests/flows/implicit_grant_spec.rb +0 -61
- data/spec/requests/flows/password_spec.rb +0 -94
- data/spec/requests/flows/refresh_token_spec.rb +0 -104
- data/spec/requests/flows/revoke_token_spec.rb +0 -143
- data/spec/requests/flows/skip_authorization_spec.rb +0 -59
- data/spec/requests/protected_resources/metal_spec.rb +0 -14
- data/spec/requests/protected_resources/private_api_spec.rb +0 -81
- data/spec/routing/custom_controller_routes_spec.rb +0 -71
- data/spec/routing/default_routes_spec.rb +0 -35
- data/spec/routing/scoped_routes_spec.rb +0 -31
- data/spec/spec_helper.rb +0 -2
- data/spec/spec_helper_integration.rb +0 -56
- data/spec/support/dependencies/factory_girl.rb +0 -2
- data/spec/support/helpers/access_token_request_helper.rb +0 -11
- data/spec/support/helpers/authorization_request_helper.rb +0 -41
- data/spec/support/helpers/config_helper.rb +0 -9
- data/spec/support/helpers/model_helper.rb +0 -45
- data/spec/support/helpers/request_spec_helper.rb +0 -76
- data/spec/support/helpers/url_helper.rb +0 -55
- data/spec/support/orm/active_record.rb +0 -3
- data/spec/support/shared/controllers_shared_context.rb +0 -60
- data/spec/support/shared/models_shared_examples.rb +0 -52
- data/spec/validators/redirect_uri_validator_spec.rb +0 -78
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'spec_helper_integration'
|
2
|
-
require 'generators/doorkeeper/views_generator'
|
3
|
-
|
4
|
-
describe Doorkeeper::Generators::ViewsGenerator do
|
5
|
-
include GeneratorSpec::TestCase
|
6
|
-
|
7
|
-
tests Doorkeeper::Generators::ViewsGenerator
|
8
|
-
destination File.expand_path('../tmp/dummy', __FILE__)
|
9
|
-
|
10
|
-
before :each do
|
11
|
-
prepare_destination
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'create all views' do
|
15
|
-
run_generator
|
16
|
-
assert_file 'app/views/doorkeeper/applications/_form.html.erb'
|
17
|
-
assert_file 'app/views/doorkeeper/applications/edit.html.erb'
|
18
|
-
assert_file 'app/views/doorkeeper/applications/index.html.erb'
|
19
|
-
assert_file 'app/views/doorkeeper/applications/new.html.erb'
|
20
|
-
assert_file 'app/views/doorkeeper/applications/show.html.erb'
|
21
|
-
|
22
|
-
assert_file 'app/views/doorkeeper/authorizations/error.html.erb'
|
23
|
-
assert_file 'app/views/doorkeeper/authorizations/new.html.erb'
|
24
|
-
|
25
|
-
assert_file 'app/views/doorkeeper/authorized_applications/index.html.erb'
|
26
|
-
end
|
27
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'spec_helper_integration'
|
2
|
-
|
3
|
-
describe Doorkeeper::DashboardHelper do
|
4
|
-
describe '.doorkeeper_errors_for' do
|
5
|
-
let(:object) { double errors: { method: messages } }
|
6
|
-
let(:messages) { ['first message', 'second message'] }
|
7
|
-
|
8
|
-
context 'when object has errors' do
|
9
|
-
it 'returns error messages' do
|
10
|
-
messages.each do |message|
|
11
|
-
expect(helper.doorkeeper_errors_for(object, :method)).to include(
|
12
|
-
message.capitalize
|
13
|
-
)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
context 'when object has no errors' do
|
19
|
-
it 'returns nil' do
|
20
|
-
expect(helper.doorkeeper_errors_for(object, :amonter_method)).to be_nil
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
data/spec/lib/config_spec.rb
DELETED
@@ -1,317 +0,0 @@
|
|
1
|
-
require 'spec_helper_integration'
|
2
|
-
|
3
|
-
describe Doorkeeper, 'configuration' do
|
4
|
-
subject { Doorkeeper.configuration }
|
5
|
-
|
6
|
-
describe 'resource_owner_authenticator' do
|
7
|
-
it 'sets the block that is accessible via authenticate_resource_owner' do
|
8
|
-
block = proc {}
|
9
|
-
Doorkeeper.configure do
|
10
|
-
orm DOORKEEPER_ORM
|
11
|
-
resource_owner_authenticator &block
|
12
|
-
end
|
13
|
-
expect(subject.authenticate_resource_owner).to eq(block)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
describe 'setup_orm_adapter' do
|
18
|
-
it 'adds specific error message to NameError exception' do
|
19
|
-
expect do
|
20
|
-
Doorkeeper.configure { orm 'hibernate' }
|
21
|
-
end.to raise_error(NameError, /ORM adapter not found \(hibernate\)/)
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'does not change other exceptions' do
|
25
|
-
allow_any_instance_of(String).to receive(:classify) { raise NoMethodError }
|
26
|
-
|
27
|
-
expect do
|
28
|
-
Doorkeeper.configure { orm 'hibernate' }
|
29
|
-
end.to raise_error(NoMethodError, /ORM adapter not found \(hibernate\)/)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
describe 'admin_authenticator' do
|
34
|
-
it 'sets the block that is accessible via authenticate_admin' do
|
35
|
-
block = proc {}
|
36
|
-
Doorkeeper.configure do
|
37
|
-
orm DOORKEEPER_ORM
|
38
|
-
admin_authenticator(&block)
|
39
|
-
end
|
40
|
-
expect(subject.authenticate_admin).to eq(block)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
describe 'access_token_expires_in' do
|
45
|
-
it 'has 2 hours by default' do
|
46
|
-
expect(subject.access_token_expires_in).to eq(2.hours)
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'can change the value' do
|
50
|
-
Doorkeeper.configure do
|
51
|
-
orm DOORKEEPER_ORM
|
52
|
-
access_token_expires_in 4.hours
|
53
|
-
end
|
54
|
-
expect(subject.access_token_expires_in).to eq(4.hours)
|
55
|
-
end
|
56
|
-
|
57
|
-
it 'can be set to nil' do
|
58
|
-
Doorkeeper.configure do
|
59
|
-
orm DOORKEEPER_ORM
|
60
|
-
access_token_expires_in nil
|
61
|
-
end
|
62
|
-
expect(subject.access_token_expires_in).to be_nil
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
describe 'scopes' do
|
67
|
-
it 'has default scopes' do
|
68
|
-
Doorkeeper.configure do
|
69
|
-
orm DOORKEEPER_ORM
|
70
|
-
default_scopes :public
|
71
|
-
end
|
72
|
-
expect(subject.default_scopes).to include('public')
|
73
|
-
end
|
74
|
-
|
75
|
-
it 'has optional scopes' do
|
76
|
-
Doorkeeper.configure do
|
77
|
-
orm DOORKEEPER_ORM
|
78
|
-
optional_scopes :write, :update
|
79
|
-
end
|
80
|
-
expect(subject.optional_scopes).to include('write', 'update')
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'has all scopes' do
|
84
|
-
Doorkeeper.configure do
|
85
|
-
orm DOORKEEPER_ORM
|
86
|
-
default_scopes :normal
|
87
|
-
optional_scopes :admin
|
88
|
-
end
|
89
|
-
expect(subject.scopes).to include('normal', 'admin')
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
describe 'use_refresh_token' do
|
94
|
-
it 'is false by default' do
|
95
|
-
expect(subject.refresh_token_enabled?).to be_falsey
|
96
|
-
end
|
97
|
-
|
98
|
-
it 'can change the value' do
|
99
|
-
Doorkeeper.configure do
|
100
|
-
orm DOORKEEPER_ORM
|
101
|
-
use_refresh_token
|
102
|
-
end
|
103
|
-
expect(subject.refresh_token_enabled?).to be_truthy
|
104
|
-
end
|
105
|
-
|
106
|
-
it "does not includes 'refresh_token' in authorization_response_types" do
|
107
|
-
expect(subject.token_grant_types).not_to include 'refresh_token'
|
108
|
-
end
|
109
|
-
|
110
|
-
context "is enabled" do
|
111
|
-
before do
|
112
|
-
Doorkeeper.configure {
|
113
|
-
orm DOORKEEPER_ORM
|
114
|
-
use_refresh_token
|
115
|
-
}
|
116
|
-
end
|
117
|
-
|
118
|
-
it "includes 'refresh_token' in authorization_response_types" do
|
119
|
-
expect(subject.token_grant_types).to include 'refresh_token'
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
describe 'client_credentials' do
|
125
|
-
it 'has defaults order' do
|
126
|
-
expect(subject.client_credentials_methods).to eq([:from_basic, :from_params])
|
127
|
-
end
|
128
|
-
|
129
|
-
it 'can change the value' do
|
130
|
-
Doorkeeper.configure do
|
131
|
-
orm DOORKEEPER_ORM
|
132
|
-
client_credentials :from_digest, :from_params
|
133
|
-
end
|
134
|
-
expect(subject.client_credentials_methods).to eq([:from_digest, :from_params])
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
describe 'force_ssl_in_redirect_uri' do
|
139
|
-
it 'is true by default in non-development environments' do
|
140
|
-
expect(subject.force_ssl_in_redirect_uri).to be_truthy
|
141
|
-
end
|
142
|
-
|
143
|
-
it 'can change the value' do
|
144
|
-
Doorkeeper.configure do
|
145
|
-
orm DOORKEEPER_ORM
|
146
|
-
force_ssl_in_redirect_uri(false)
|
147
|
-
end
|
148
|
-
expect(subject.force_ssl_in_redirect_uri).to be_falsey
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
describe 'access_token_credentials' do
|
153
|
-
it 'has defaults order' do
|
154
|
-
expect(subject.access_token_methods).to eq([:from_bearer_authorization, :from_access_token_param, :from_bearer_param])
|
155
|
-
end
|
156
|
-
|
157
|
-
it 'can change the value' do
|
158
|
-
Doorkeeper.configure do
|
159
|
-
orm DOORKEEPER_ORM
|
160
|
-
access_token_methods :from_access_token_param, :from_bearer_param
|
161
|
-
end
|
162
|
-
expect(subject.access_token_methods).to eq([:from_access_token_param, :from_bearer_param])
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
describe 'enable_application_owner' do
|
167
|
-
it 'is disabled by default' do
|
168
|
-
expect(Doorkeeper.configuration.enable_application_owner?).not_to be_truthy
|
169
|
-
end
|
170
|
-
|
171
|
-
context 'when enabled without confirmation' do
|
172
|
-
before do
|
173
|
-
Doorkeeper.configure do
|
174
|
-
orm DOORKEEPER_ORM
|
175
|
-
enable_application_owner
|
176
|
-
end
|
177
|
-
end
|
178
|
-
it 'adds support for application owner' do
|
179
|
-
expect(Doorkeeper::Application.new).to respond_to :owner
|
180
|
-
end
|
181
|
-
it 'Doorkeeper.configuration.confirm_application_owner? returns false' do
|
182
|
-
expect(Doorkeeper.configuration.confirm_application_owner?).not_to be_truthy
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
context 'when enabled with confirmation set to true' do
|
187
|
-
before do
|
188
|
-
Doorkeeper.configure do
|
189
|
-
orm DOORKEEPER_ORM
|
190
|
-
enable_application_owner confirmation: true
|
191
|
-
end
|
192
|
-
end
|
193
|
-
it 'adds support for application owner' do
|
194
|
-
expect(Doorkeeper::Application.new).to respond_to :owner
|
195
|
-
end
|
196
|
-
it 'Doorkeeper.configuration.confirm_application_owner? returns true' do
|
197
|
-
expect(Doorkeeper.configuration.confirm_application_owner?).to be_truthy
|
198
|
-
end
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
describe 'realm' do
|
203
|
-
it 'is \'Doorkeeper\' by default' do
|
204
|
-
expect(Doorkeeper.configuration.realm).to eq('Doorkeeper')
|
205
|
-
end
|
206
|
-
|
207
|
-
it 'can change the value' do
|
208
|
-
Doorkeeper.configure do
|
209
|
-
orm DOORKEEPER_ORM
|
210
|
-
realm 'Example'
|
211
|
-
end
|
212
|
-
expect(subject.realm).to eq('Example')
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
describe "grant_flows" do
|
217
|
-
it "is set to all grant flows by default" do
|
218
|
-
expect(Doorkeeper.configuration.grant_flows).
|
219
|
-
to eq(%w(authorization_code client_credentials))
|
220
|
-
end
|
221
|
-
|
222
|
-
it "can change the value" do
|
223
|
-
Doorkeeper.configure {
|
224
|
-
orm DOORKEEPER_ORM
|
225
|
-
grant_flows [ 'authorization_code', 'implicit' ]
|
226
|
-
}
|
227
|
-
expect(subject.grant_flows).to eq ['authorization_code', 'implicit']
|
228
|
-
end
|
229
|
-
|
230
|
-
context "when including 'authorization_code'" do
|
231
|
-
before do
|
232
|
-
Doorkeeper.configure {
|
233
|
-
orm DOORKEEPER_ORM
|
234
|
-
grant_flows ['authorization_code']
|
235
|
-
}
|
236
|
-
end
|
237
|
-
|
238
|
-
it "includes 'code' in authorization_response_types" do
|
239
|
-
expect(subject.authorization_response_types).to include 'code'
|
240
|
-
end
|
241
|
-
|
242
|
-
it "includes 'authorization_code' in token_grant_types" do
|
243
|
-
expect(subject.token_grant_types).to include 'authorization_code'
|
244
|
-
end
|
245
|
-
end
|
246
|
-
|
247
|
-
context "when including 'implicit'" do
|
248
|
-
before do
|
249
|
-
Doorkeeper.configure {
|
250
|
-
orm DOORKEEPER_ORM
|
251
|
-
grant_flows ['implicit']
|
252
|
-
}
|
253
|
-
end
|
254
|
-
|
255
|
-
it "includes 'token' in authorization_response_types" do
|
256
|
-
expect(subject.authorization_response_types).to include 'token'
|
257
|
-
end
|
258
|
-
end
|
259
|
-
|
260
|
-
context "when including 'password'" do
|
261
|
-
before do
|
262
|
-
Doorkeeper.configure {
|
263
|
-
orm DOORKEEPER_ORM
|
264
|
-
grant_flows ['password']
|
265
|
-
}
|
266
|
-
end
|
267
|
-
|
268
|
-
it "includes 'password' in token_grant_types" do
|
269
|
-
expect(subject.token_grant_types).to include 'password'
|
270
|
-
end
|
271
|
-
end
|
272
|
-
|
273
|
-
context "when including 'client_credentials'" do
|
274
|
-
before do
|
275
|
-
Doorkeeper.configure {
|
276
|
-
orm DOORKEEPER_ORM
|
277
|
-
grant_flows ['client_credentials']
|
278
|
-
}
|
279
|
-
end
|
280
|
-
|
281
|
-
it "includes 'client_credentials' in token_grant_types" do
|
282
|
-
expect(subject.token_grant_types).to include 'client_credentials'
|
283
|
-
end
|
284
|
-
end
|
285
|
-
end
|
286
|
-
|
287
|
-
it 'raises an exception when configuration is not set' do
|
288
|
-
old_config = Doorkeeper.configuration
|
289
|
-
Doorkeeper.module_eval do
|
290
|
-
@config = nil
|
291
|
-
end
|
292
|
-
|
293
|
-
expect do
|
294
|
-
Doorkeeper.configuration
|
295
|
-
end.to raise_error Doorkeeper::MissingConfiguration
|
296
|
-
|
297
|
-
Doorkeeper.module_eval do
|
298
|
-
@config = old_config
|
299
|
-
end
|
300
|
-
end
|
301
|
-
|
302
|
-
describe 'access_token_generator' do
|
303
|
-
it 'is \'Doorkeeper::OAuth::Helpers::UniqueToken\' by default' do
|
304
|
-
expect(Doorkeeper.configuration.access_token_generator).to(
|
305
|
-
eq('Doorkeeper::OAuth::Helpers::UniqueToken')
|
306
|
-
)
|
307
|
-
end
|
308
|
-
|
309
|
-
it 'can change the value' do
|
310
|
-
Doorkeeper.configure do
|
311
|
-
orm DOORKEEPER_ORM
|
312
|
-
access_token_generator 'Example'
|
313
|
-
end
|
314
|
-
expect(subject.access_token_generator).to eq('Example')
|
315
|
-
end
|
316
|
-
end
|
317
|
-
end
|
data/spec/lib/doorkeeper_spec.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'spec_helper_integration'
|
2
|
-
|
3
|
-
describe Doorkeeper do
|
4
|
-
describe 'authenticate' do
|
5
|
-
let(:token) { double('Token') }
|
6
|
-
let(:request) { double('ActionDispatch::Request') }
|
7
|
-
before do
|
8
|
-
allow(Doorkeeper::OAuth::Token).to receive(:authenticate).
|
9
|
-
with(request, *token_strategies) { token }
|
10
|
-
end
|
11
|
-
|
12
|
-
context 'with specific access token strategies' do
|
13
|
-
let(:token_strategies) { [:first_way, :second_way] }
|
14
|
-
|
15
|
-
it 'authenticates the token from the request' do
|
16
|
-
expect(Doorkeeper.authenticate(request, token_strategies)).to eq(token)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
context 'with default access token strategies' do
|
21
|
-
let(:token_strategies) { Doorkeeper.configuration.access_token_methods }
|
22
|
-
|
23
|
-
it 'authenticates the token from the request' do
|
24
|
-
expect(Doorkeeper.authenticate(request)).to eq(token)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,51 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'timecop'
|
3
|
-
require 'active_support/time'
|
4
|
-
require 'doorkeeper/models/concerns/expirable'
|
5
|
-
|
6
|
-
describe 'Expirable' do
|
7
|
-
subject do
|
8
|
-
Class.new do
|
9
|
-
include Doorkeeper::Models::Expirable
|
10
|
-
end.new
|
11
|
-
end
|
12
|
-
|
13
|
-
before do
|
14
|
-
allow(subject).to receive(:created_at).and_return(1.minute.ago)
|
15
|
-
end
|
16
|
-
|
17
|
-
describe :expired? do
|
18
|
-
it 'is not expired if time has not passed' do
|
19
|
-
allow(subject).to receive(:expires_in).and_return(2.minutes)
|
20
|
-
expect(subject).not_to be_expired
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'is expired if time has passed' do
|
24
|
-
allow(subject).to receive(:expires_in).and_return(10.seconds)
|
25
|
-
expect(subject).to be_expired
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'is not expired if expires_in is not set' do
|
29
|
-
allow(subject).to receive(:expires_in).and_return(nil)
|
30
|
-
expect(subject).not_to be_expired
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
describe :expires_in_seconds do
|
35
|
-
it 'should return the amount of time remaining until the token is expired' do
|
36
|
-
allow(subject).to receive(:expires_in).and_return(2.minutes)
|
37
|
-
expect(subject.expires_in_seconds).to eq(60)
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'should return 0 when expired' do
|
41
|
-
allow(subject).to receive(:expires_in).and_return(30.seconds)
|
42
|
-
expect(subject.expires_in_seconds).to eq(0)
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'should return nil when expires_in is nil' do
|
46
|
-
allow(subject).to receive(:expires_in).and_return(nil)
|
47
|
-
expect(subject.expires_in_seconds).to be_nil
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'active_support/core_ext/object/blank'
|
3
|
-
require 'doorkeeper/models/concerns/revocable'
|
4
|
-
|
5
|
-
describe 'Revocable' do
|
6
|
-
subject do
|
7
|
-
Class.new do
|
8
|
-
include Doorkeeper::Models::Revocable
|
9
|
-
end.new
|
10
|
-
end
|
11
|
-
|
12
|
-
describe :revoke do
|
13
|
-
it 'updates :revoked_at attribute with current time' do
|
14
|
-
clock = double now: double
|
15
|
-
expect(subject).to receive(:update_attribute).with(:revoked_at, clock.now)
|
16
|
-
subject.revoke(clock)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
describe :revoked? do
|
21
|
-
it 'is revoked if :revoked_at has passed' do
|
22
|
-
allow(subject).to receive(:revoked_at).and_return(Time.now - 1000)
|
23
|
-
expect(subject).to be_revoked
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'is not revoked if :revoked_at has not passed' do
|
27
|
-
allow(subject).to receive(:revoked_at).and_return(Time.now + 1000)
|
28
|
-
expect(subject).not_to be_revoked
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'is not revoked if :revoked_at is not set' do
|
32
|
-
allow(subject).to receive(:revoked_at).and_return(nil)
|
33
|
-
expect(subject).not_to be_revoked
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'active_support/core_ext/module/delegation'
|
3
|
-
require 'active_support/core_ext/object/blank'
|
4
|
-
require 'doorkeeper/oauth/scopes'
|
5
|
-
require 'doorkeeper/models/concerns/scopes'
|
6
|
-
|
7
|
-
describe 'Doorkeeper::Models::Scopes' do
|
8
|
-
subject do
|
9
|
-
Class.new(Hash) do
|
10
|
-
include Doorkeeper::Models::Scopes
|
11
|
-
end.new
|
12
|
-
end
|
13
|
-
|
14
|
-
before do
|
15
|
-
subject[:scopes] = 'public admin'
|
16
|
-
end
|
17
|
-
|
18
|
-
describe :scopes do
|
19
|
-
it 'is a `Scopes` class' do
|
20
|
-
expect(subject.scopes).to be_a(Doorkeeper::OAuth::Scopes)
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'includes scopes' do
|
24
|
-
expect(subject.scopes).to include('public')
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
describe :scopes_string do
|
29
|
-
it 'is a `Scopes` class' do
|
30
|
-
expect(subject.scopes_string).to eq('public admin')
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
describe :includes_scope? do
|
35
|
-
it 'should return true if at least one scope is included' do
|
36
|
-
expect(subject.includes_scope?('public', 'private')).to be true
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'should return false if no scopes are included' do
|
40
|
-
expect(subject.includes_scope?('teacher', 'student')).to be false
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'active_support/core_ext/string'
|
3
|
-
require 'uri'
|
4
|
-
require 'rack/utils'
|
5
|
-
require 'doorkeeper/oauth/authorization/uri_builder'
|
6
|
-
|
7
|
-
module Doorkeeper::OAuth::Authorization
|
8
|
-
describe URIBuilder do
|
9
|
-
|
10
|
-
subject { Object.new.class.send :include, URIBuilder }
|
11
|
-
|
12
|
-
describe :uri_with_query do
|
13
|
-
it 'returns the uri with query' do
|
14
|
-
uri = subject.uri_with_query 'http://example.com/', parameter: 'value'
|
15
|
-
expect(uri).to eq('http://example.com/?parameter=value')
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'rejects nil values' do
|
19
|
-
uri = subject.uri_with_query 'http://example.com/', parameter: ''
|
20
|
-
expect(uri).to eq('http://example.com/?')
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'preserves original query parameters' do
|
24
|
-
uri = subject.uri_with_query 'http://example.com/?query1=value', parameter: 'value'
|
25
|
-
expect(uri).to match(/query1=value/)
|
26
|
-
expect(uri).to match(/parameter=value/)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe :uri_with_fragment do
|
31
|
-
it 'returns uri with parameters as fragments' do
|
32
|
-
uri = subject.uri_with_fragment 'http://example.com/', parameter: 'value'
|
33
|
-
expect(uri).to eq('http://example.com/#parameter=value')
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'preserves original query parameters' do
|
37
|
-
uri = subject.uri_with_fragment 'http://example.com/?query1=value1', parameter: 'value'
|
38
|
-
expect(uri).to eq('http://example.com/?query1=value1#parameter=value')
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,80 +0,0 @@
|
|
1
|
-
require 'spec_helper_integration'
|
2
|
-
|
3
|
-
module Doorkeeper::OAuth
|
4
|
-
describe AuthorizationCodeRequest do
|
5
|
-
let(:server) do
|
6
|
-
double :server,
|
7
|
-
access_token_expires_in: 2.days,
|
8
|
-
refresh_token_enabled?: false,
|
9
|
-
custom_access_token_expires_in: ->(_app) { nil }
|
10
|
-
end
|
11
|
-
let(:grant) { FactoryGirl.create :access_grant }
|
12
|
-
let(:client) { grant.application }
|
13
|
-
|
14
|
-
subject do
|
15
|
-
AuthorizationCodeRequest.new server, grant, client, redirect_uri: client.redirect_uri
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'issues a new token for the client' do
|
19
|
-
expect do
|
20
|
-
subject.authorize
|
21
|
-
end.to change { client.access_tokens.count }.by(1)
|
22
|
-
end
|
23
|
-
|
24
|
-
it "issues the token with same grant's scopes" do
|
25
|
-
subject.authorize
|
26
|
-
expect(Doorkeeper::AccessToken.last.scopes).to eq(grant.scopes)
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'revokes the grant' do
|
30
|
-
expect do
|
31
|
-
subject.authorize
|
32
|
-
end.to change { grant.reload.accessible? }
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'requires the grant to be accessible' do
|
36
|
-
grant.revoke
|
37
|
-
subject.validate
|
38
|
-
expect(subject.error).to eq(:invalid_grant)
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'requires the grant' do
|
42
|
-
subject.grant = nil
|
43
|
-
subject.validate
|
44
|
-
expect(subject.error).to eq(:invalid_grant)
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'requires the client' do
|
48
|
-
subject.client = nil
|
49
|
-
subject.validate
|
50
|
-
expect(subject.error).to eq(:invalid_client)
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'requires the redirect_uri' do
|
54
|
-
subject.redirect_uri = nil
|
55
|
-
subject.validate
|
56
|
-
expect(subject.error).to eq(:invalid_request)
|
57
|
-
end
|
58
|
-
|
59
|
-
it "matches the redirect_uri with grant's one" do
|
60
|
-
subject.redirect_uri = 'http://other.com'
|
61
|
-
subject.validate
|
62
|
-
expect(subject.error).to eq(:invalid_grant)
|
63
|
-
end
|
64
|
-
|
65
|
-
it "matches the client with grant's one" do
|
66
|
-
subject.client = FactoryGirl.create :application
|
67
|
-
subject.validate
|
68
|
-
expect(subject.error).to eq(:invalid_grant)
|
69
|
-
end
|
70
|
-
|
71
|
-
it 'skips token creation if there is a matching one' do
|
72
|
-
allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
|
73
|
-
FactoryGirl.create(:access_token, application_id: client.id,
|
74
|
-
resource_owner_id: grant.resource_owner_id, scopes: grant.scopes.to_s)
|
75
|
-
expect do
|
76
|
-
subject.authorize
|
77
|
-
end.to_not change { Doorkeeper::AccessToken.count }
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'active_support/core_ext/string'
|
3
|
-
require 'doorkeeper/oauth/client'
|
4
|
-
|
5
|
-
class Doorkeeper::OAuth::Client
|
6
|
-
describe Credentials do
|
7
|
-
it 'is blank when any of the credentials is blank' do
|
8
|
-
expect(Credentials.new(nil, 'something')).to be_blank
|
9
|
-
expect(Credentials.new('something', nil)).to be_blank
|
10
|
-
end
|
11
|
-
|
12
|
-
describe :from_request do
|
13
|
-
let(:request) { double.as_null_object }
|
14
|
-
|
15
|
-
let(:method) do
|
16
|
-
->(_request) { return 'uid', 'secret' }
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'accepts anything that responds to #call' do
|
20
|
-
expect(method).to receive(:call).with(request)
|
21
|
-
Credentials.from_request request, method
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'delegates methods received as symbols to Credentials class' do
|
25
|
-
expect(Credentials).to receive(:from_params).with(request)
|
26
|
-
Credentials.from_request request, :from_params
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'stops at the first credentials found' do
|
30
|
-
not_called_method = double
|
31
|
-
expect(not_called_method).not_to receive(:call)
|
32
|
-
Credentials.from_request request, ->(_) {}, method, not_called_method
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'returns new Credentials' do
|
36
|
-
credentials = Credentials.from_request request, method
|
37
|
-
expect(credentials).to be_a(Credentials)
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'returns uid and secret from extractor method' do
|
41
|
-
credentials = Credentials.from_request request, method
|
42
|
-
expect(credentials.uid).to eq('uid')
|
43
|
-
expect(credentials.secret).to eq('secret')
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|