oauth2_provider_engine 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +40 -0
- data/app/assets/javascripts/oauth2_provider/application.js +52 -0
- data/app/assets/javascripts/oauth2_provider/highcharts.js +162 -0
- data/app/assets/javascripts/oauth2_provider/jquery.tagsinput.js +218 -0
- data/app/assets/stylesheets/oauth2_provider/gh-buttons.css +388 -0
- data/app/assets/stylesheets/oauth2_provider/gh-icons.png +0 -0
- data/app/assets/stylesheets/oauth2_provider/jquery.tagsinput.css +6 -0
- data/app/assets/stylesheets/oauth2_provider/reset.css +2 -0
- data/app/assets/stylesheets/oauth2_provider/template.css +52 -0
- data/app/controllers/oauth2_provider/accesses_controller.rb +39 -0
- data/app/controllers/oauth2_provider/application_controller.rb +17 -0
- data/app/controllers/oauth2_provider/authorize_controller.rb +141 -0
- data/app/controllers/oauth2_provider/clients_controller.rb +85 -0
- data/app/controllers/oauth2_provider/scopes_controller.rb +63 -0
- data/app/controllers/oauth2_provider/token_controller.rb +187 -0
- data/app/helpers/clients_helper.rb +5 -0
- data/app/helpers/oauth2_provider/application_helper.rb +4 -0
- data/app/models/oauth2_provider/client.rb +129 -0
- data/app/models/oauth2_provider/document.rb +15 -0
- data/app/models/oauth2_provider/oauth_access.rb +80 -0
- data/app/models/oauth2_provider/oauth_authorization.rb +70 -0
- data/app/models/oauth2_provider/oauth_daily_request.rb +54 -0
- data/app/models/oauth2_provider/oauth_refresh_token.rb +20 -0
- data/app/models/oauth2_provider/oauth_token.rb +78 -0
- data/app/models/oauth2_provider/scope.rb +39 -0
- data/app/views/layouts/oauth2_provider/application.html.erb +62 -0
- data/app/views/oauth2_provider/accesses/index.html.erb +25 -0
- data/app/views/oauth2_provider/accesses/show.html.erb +35 -0
- data/app/views/oauth2_provider/clients/_form.html.erb +50 -0
- data/app/views/oauth2_provider/clients/edit.html.erb +9 -0
- data/app/views/oauth2_provider/clients/index.html.erb +43 -0
- data/app/views/oauth2_provider/clients/new.html.erb +8 -0
- data/app/views/oauth2_provider/clients/show.html.erb +49 -0
- data/app/views/oauth2_provider/scopes/_form.html.erb +35 -0
- data/app/views/oauth2_provider/scopes/edit.html.erb +8 -0
- data/app/views/oauth2_provider/scopes/index.html.erb +27 -0
- data/app/views/oauth2_provider/scopes/new.html.erb +7 -0
- data/app/views/oauth2_provider/scopes/show.html.erb +19 -0
- data/app/views/shared/authorize.html.erb +34 -0
- data/app/views/shared/token.json.erb +8 -0
- data/config/locales/en.yml +31 -0
- data/config/oauth.yml +4 -0
- data/config/routes.rb +25 -0
- data/lib/oauth2_provider.rb +38 -0
- data/lib/oauth2_provider/controller_mixin.rb +53 -0
- data/lib/oauth2_provider/engine.rb +4 -0
- data/lib/oauth2_provider_engine.rb +1 -0
- data/lib/oauth2_provider_engine/version.rb +3 -0
- data/test/dummy/CHANGELOG.rdoc +67 -0
- data/test/dummy/Gemfile +53 -0
- data/test/dummy/Gemfile.lock +254 -0
- data/test/dummy/README.rdoc +522 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/VERSION +1 -0
- data/test/dummy/app/assets/stylesheets/reset.css +2 -0
- data/test/dummy/app/assets/stylesheets/template.css +52 -0
- data/test/dummy/app/controllers/application_controller.rb +52 -0
- data/test/dummy/app/controllers/pastas_controller.rb +23 -0
- data/test/dummy/app/controllers/pizzas_controller.rb +23 -0
- data/test/dummy/app/controllers/sessions_controller.rb +26 -0
- data/test/dummy/app/controllers/users_controller.rb +59 -0
- data/test/dummy/app/models/user.rb +50 -0
- data/test/dummy/app/views/layouts/application.html.erb +65 -0
- data/test/dummy/app/views/sessions/new.html.erb +25 -0
- data/test/dummy/app/views/shared/403.json.erb +4 -0
- data/test/dummy/app/views/shared/404.json.erb +6 -0
- data/test/dummy/app/views/shared/422.json.erb +5 -0
- data/test/dummy/app/views/shared/500.json.erb +4 -0
- data/test/dummy/app/views/shared/html/404.html.erb +0 -0
- data/test/dummy/app/views/shared/html/422.html.erb +0 -0
- data/test/dummy/app/views/users/_form.html.erb +27 -0
- data/test/dummy/app/views/users/edit.html.erb +8 -0
- data/test/dummy/app/views/users/index.html.erb +20 -0
- data/test/dummy/app/views/users/new.html.erb +46 -0
- data/test/dummy/app/views/users/show.html.erb +15 -0
- data/test/dummy/app/views/users/show.json.erb +6 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +57 -0
- data/test/dummy/config/boot.rb +13 -0
- data/test/dummy/config/cucumber.yml +8 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +32 -0
- data/test/dummy/config/environments/production.rb +58 -0
- data/test/dummy/config/environments/test.rb +35 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +10 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/test.rb +3 -0
- data/test/dummy/config/locales/en.yml +1 -0
- data/test/dummy/config/mongoid.yml +20 -0
- data/test/dummy/config/routes.rb +22 -0
- data/test/dummy/db/seeds.rb +7 -0
- data/test/dummy/doc/README_FOR_APP +2 -0
- data/test/dummy/lib/tasks/cucumber.rake +53 -0
- data/test/dummy/lib/tasks/watchr.rake +5 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +4 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/public/robots.txt +5 -0
- data/test/dummy/script/cucumber +10 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/spec/acceptance/acceptance_helper.rb +5 -0
- data/test/dummy/spec/acceptance/accesses_controller_spec.rb +77 -0
- data/test/dummy/spec/acceptance/clients_controller_spec.rb +218 -0
- data/test/dummy/spec/acceptance/oauth_authorize_controller_spec.rb +241 -0
- data/test/dummy/spec/acceptance/oauth_token_controller_spec.rb +196 -0
- data/test/dummy/spec/acceptance/resource_controller_spec.rb +143 -0
- data/test/dummy/spec/acceptance/scopes_controller_spec.rb +227 -0
- data/test/dummy/spec/acceptance/support/helpers.rb +81 -0
- data/test/dummy/spec/acceptance/support/paths.rb +9 -0
- data/test/dummy/spec/acceptance/support/view_helpers.rb +52 -0
- data/test/dummy/spec/acceptance/users_controller_spec.rb +198 -0
- data/test/dummy/spec/extras/scope_spec.rb +105 -0
- data/test/dummy/spec/factories/oauth.rb +106 -0
- data/test/dummy/spec/models/oauth/client_spec.rb +123 -0
- data/test/dummy/spec/models/oauth/oauth_access_spec.rb +48 -0
- data/test/dummy/spec/models/oauth/oauth_authorization_spec.rb +50 -0
- data/test/dummy/spec/models/oauth/oauth_daily_request_spec.rb +14 -0
- data/test/dummy/spec/models/oauth/oauth_refresh_token_spec.rb +11 -0
- data/test/dummy/spec/models/oauth/oauth_token_spec.rb +55 -0
- data/test/dummy/spec/models/scope_spec.rb +17 -0
- data/test/dummy/spec/spec_helper.rb +39 -0
- data/test/dummy/spec/support/settings_helper.rb +28 -0
- data/test/dummy/test/initializers/capybara_headers_hack.rb +23 -0
- data/test/oauth2_provider_test.rb +7 -0
- data/test/test_helper.rb +15 -0
- metadata +387 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../support/settings_helper')
|
|
2
|
+
include SettingsHelper
|
|
3
|
+
|
|
4
|
+
FactoryGirl.define do
|
|
5
|
+
|
|
6
|
+
factory :user do
|
|
7
|
+
email "alice@example.com"
|
|
8
|
+
password "example"
|
|
9
|
+
admin false
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
factory :user_bob, class: User do
|
|
13
|
+
email "bob@example.com"
|
|
14
|
+
password "example"
|
|
15
|
+
admin false
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
factory :admin, class: User do
|
|
19
|
+
email "admin@example.com"
|
|
20
|
+
password "example"
|
|
21
|
+
admin true
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
factory :oauth_access, class: Oauth2Provider::OauthAccess do
|
|
25
|
+
client_uri CLIENT_URI
|
|
26
|
+
resource_owner_uri USER_URI
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
factory :oauth_authorization, class: Oauth2Provider::OauthAuthorization do
|
|
31
|
+
client_uri CLIENT_URI
|
|
32
|
+
resource_owner_uri USER_URI
|
|
33
|
+
scope ALL_SCOPE
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
factory :oauth_token, class: Oauth2Provider::OauthToken do
|
|
38
|
+
client_uri CLIENT_URI
|
|
39
|
+
resource_owner_uri USER_URI
|
|
40
|
+
scope ALL_SCOPE
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
factory :oauth_token_read, parent: :oauth_token do
|
|
44
|
+
scope READ_SCOPE
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
factory :client, class: Oauth2Provider::Client do
|
|
49
|
+
uri CLIENT_URI
|
|
50
|
+
name "the client"
|
|
51
|
+
created_from USER_URI
|
|
52
|
+
redirect_uri REDIRECT_URI
|
|
53
|
+
scope ["pizzas"]
|
|
54
|
+
scope_values ALL_SCOPE
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
factory :client_read, parent: :client do
|
|
58
|
+
uri ANOTHER_CLIENT_URI
|
|
59
|
+
scope ["pizzas/read"]
|
|
60
|
+
scope_values READ_SCOPE
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
factory :client_not_owned, parent: :client do
|
|
64
|
+
name "Not owned client"
|
|
65
|
+
created_from ANOTHER_USER_URI
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
factory :scope, class: Oauth2Provider::Scope do
|
|
70
|
+
uri SCOPE_URI
|
|
71
|
+
name "pizzas"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
factory :scope_pizzas_read, parent: :scope do
|
|
75
|
+
name "pizzas/read"
|
|
76
|
+
values ["pizzas/index", "pizzas/show"]
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
factory :scope_pizzas_all, parent: :scope do
|
|
80
|
+
name "pizzas"
|
|
81
|
+
values ["pizzas/read", "pizzas/create", "pizzas/update", "pizzas/destroy"]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
factory :scope_pastas_read, parent: :scope do
|
|
85
|
+
name "pastas/read"
|
|
86
|
+
values ["pastas/index", "pastas/show"]
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
factory :scope_pastas_all, parent: :scope do
|
|
90
|
+
name "pastas"
|
|
91
|
+
values ["pastas/create", "pastas/update", "pastas/destroy", "pastas/read"]
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
factory :scope_read, parent: :scope do
|
|
95
|
+
name "read"
|
|
96
|
+
values ["pizzas/read", "pastas/read"]
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
factory :scope_all, parent: :scope do
|
|
100
|
+
name "all"
|
|
101
|
+
values ["pizzas", "pastas"]
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
module Oauth2Provider
|
|
3
|
+
describe Client do
|
|
4
|
+
before { @client = FactoryGirl.create(:client) }
|
|
5
|
+
subject { @client }
|
|
6
|
+
|
|
7
|
+
it { should validate_presence_of(:name) }
|
|
8
|
+
it { should validate_presence_of(:uri) }
|
|
9
|
+
it { VALID_URIS.each{|uri| should allow_value(uri).for(:uri) } }
|
|
10
|
+
it { should validate_presence_of(:created_from) }
|
|
11
|
+
it { VALID_URIS.each{|uri| should allow_value(uri).for(:created_from) } }
|
|
12
|
+
it { should validate_presence_of(:redirect_uri) }
|
|
13
|
+
it { VALID_URIS.each{|uri| should allow_value(uri).for(:redirect_uri) } }
|
|
14
|
+
|
|
15
|
+
its(:secret) { should_not be_nil }
|
|
16
|
+
|
|
17
|
+
it ".granted!" do
|
|
18
|
+
lambda{ subject.granted! }.should change{ subject.granted_times }.by(1)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it ".revoked!" do
|
|
22
|
+
lambda{ subject.revoked! }.should change{ subject.revoked_times }.by(1)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it { should_not be_blocked }
|
|
26
|
+
context "#block!" do
|
|
27
|
+
before { @authorization = FactoryGirl.create(:oauth_authorization) }
|
|
28
|
+
before { @another_authorization = FactoryGirl.create(:oauth_authorization, client_uri: ANOTHER_CLIENT_URI) }
|
|
29
|
+
before { @token = FactoryGirl.create(:oauth_token) }
|
|
30
|
+
before { @another_token = FactoryGirl.create(:oauth_token, client_uri: ANOTHER_CLIENT_URI) }
|
|
31
|
+
|
|
32
|
+
before { subject.block! }
|
|
33
|
+
|
|
34
|
+
it { should be_blocked }
|
|
35
|
+
it { @authorization.reload.should be_blocked }
|
|
36
|
+
it { @another_authorization.reload.should_not be_blocked }
|
|
37
|
+
it { @token.reload.should be_blocked }
|
|
38
|
+
it { @another_token.reload.should_not be_blocked }
|
|
39
|
+
|
|
40
|
+
context "#unblock!" do
|
|
41
|
+
before { subject.unblock! }
|
|
42
|
+
|
|
43
|
+
it { should_not be_blocked }
|
|
44
|
+
it { @authorization.reload.should be_blocked }
|
|
45
|
+
it { @token.reload.should be_blocked }
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
context ".find_by_secret" do
|
|
50
|
+
let(:found) { Client.where_secret(subject.secret, subject.uri).first }
|
|
51
|
+
it { found.should_not be_nil }
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
context ".where_scope" do
|
|
55
|
+
context "with complete scope" do
|
|
56
|
+
let(:scope) { ALL_SCOPE }
|
|
57
|
+
subject { Client.where_scope(scope).first }
|
|
58
|
+
it { should_not be_nil }
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
context "with partial scope" do
|
|
62
|
+
let(:scope) { ["pizzas/show", "pizzas/create"] }
|
|
63
|
+
subject { Client.where_scope(scope).first }
|
|
64
|
+
it { should_not be_nil }
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
context "with invalid scope" do
|
|
68
|
+
let(:scope) { ["type.write", "reresource.not_existingg"] }
|
|
69
|
+
subject { Client.where_scope(scope).first }
|
|
70
|
+
it { should be_nil }
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
context "#destroy" do
|
|
75
|
+
subject { FactoryGirl.create(:client) }
|
|
76
|
+
before do
|
|
77
|
+
OauthAuthorization.destroy_all
|
|
78
|
+
3.times { FactoryGirl.create(:oauth_authorization) }
|
|
79
|
+
OauthToken.destroy_all
|
|
80
|
+
3.times { FactoryGirl.create(:oauth_token) }
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it "should remove related authorizations" do
|
|
84
|
+
lambda{ subject.destroy }.should change{
|
|
85
|
+
OauthAuthorization.all.size
|
|
86
|
+
}.by(-3)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "should remove related tokens" do
|
|
90
|
+
lambda{ subject.destroy }.should change{
|
|
91
|
+
OauthToken.all.size
|
|
92
|
+
}.by(-3)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
context ".sync_clients_with_scope" do
|
|
97
|
+
before { Client.destroy_all }
|
|
98
|
+
before { Scope.destroy_all }
|
|
99
|
+
|
|
100
|
+
before { @client = FactoryGirl.create(:client) }
|
|
101
|
+
before { @read_client = FactoryGirl.create(:client_read) }
|
|
102
|
+
before { @scope = FactoryGirl.create(:scope_pizzas_all) }
|
|
103
|
+
before { @scope_read = FactoryGirl.create(:scope_pizzas_read, values: ["pizzas/show"]) }
|
|
104
|
+
before { Client.sync_clients_with_scope("pizzas/read") }
|
|
105
|
+
|
|
106
|
+
context "with indirect scope" do
|
|
107
|
+
subject { @client.reload.scope_values }
|
|
108
|
+
it { should include "pizzas/show" }
|
|
109
|
+
it { should include "pizzas/create" }
|
|
110
|
+
it { should include "pizzas/update" }
|
|
111
|
+
it { should include "pizzas/destroy" }
|
|
112
|
+
it { should_not include "pizzas/index" }
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
context "with direct scope" do
|
|
116
|
+
subject { @read_client.reload.scope_values }
|
|
117
|
+
it { should include "pizzas/show" }
|
|
118
|
+
it { should_not include "pizzas/index" }
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
end
|
|
123
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Oauth2Provider::OauthAccess do
|
|
4
|
+
before { @access = FactoryGirl.create(:oauth_access) }
|
|
5
|
+
subject { @access }
|
|
6
|
+
|
|
7
|
+
it { should validate_presence_of(:client_uri) }
|
|
8
|
+
it { should validate_presence_of(:resource_owner_uri) }
|
|
9
|
+
it { should_not be_blocked }
|
|
10
|
+
|
|
11
|
+
context "#block!" do
|
|
12
|
+
before { @authorization = FactoryGirl.create(:oauth_authorization) }
|
|
13
|
+
before { @another_authorization = FactoryGirl.create(:oauth_authorization, client_uri: ANOTHER_CLIENT_URI) }
|
|
14
|
+
before { @token = FactoryGirl.create(:oauth_token) }
|
|
15
|
+
before { @another_token = FactoryGirl.create(:oauth_token, client_uri: ANOTHER_CLIENT_URI) }
|
|
16
|
+
|
|
17
|
+
before { subject.block! }
|
|
18
|
+
|
|
19
|
+
it { should be_blocked }
|
|
20
|
+
it { @authorization.reload.should be_blocked }
|
|
21
|
+
it { @another_authorization.reload.should_not be_blocked }
|
|
22
|
+
it { @token.reload.should be_blocked }
|
|
23
|
+
it { @another_token.reload.should_not be_blocked }
|
|
24
|
+
|
|
25
|
+
context "#unblock!" do
|
|
26
|
+
before { subject.unblock! }
|
|
27
|
+
|
|
28
|
+
it { should_not be_blocked }
|
|
29
|
+
it { @authorization.reload.should be_blocked }
|
|
30
|
+
it { @token.reload.should be_blocked }
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
context "when increment access" do
|
|
35
|
+
let(:today) { Chronic.parse("today at midday") }
|
|
36
|
+
let(:tomorrow) { Chronic.parse("tomorrow at midday") }
|
|
37
|
+
|
|
38
|
+
it "should create or increment the daily requests counter" do
|
|
39
|
+
Delorean.time_travel_to today
|
|
40
|
+
3.times { @access.accessed! }
|
|
41
|
+
@access.daily_requests.times.should == 3
|
|
42
|
+
Delorean.time_travel_to tomorrow
|
|
43
|
+
@access.accessed!
|
|
44
|
+
@access.daily_requests.times.should == 1
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Oauth2Provider::OauthAuthorization do
|
|
4
|
+
before { @authorization = FactoryGirl.create(:oauth_authorization) }
|
|
5
|
+
subject { @authorization }
|
|
6
|
+
|
|
7
|
+
it { should validate_presence_of(:client_uri) }
|
|
8
|
+
it { VALID_URIS.each{|uri| should allow_value(uri).for(:client_uri) } }
|
|
9
|
+
it { should validate_presence_of(:resource_owner_uri) }
|
|
10
|
+
it { VALID_URIS.each{|uri| should allow_value(uri).for(:resource_owner_uri) } }
|
|
11
|
+
|
|
12
|
+
its(:code) { should_not be_nil }
|
|
13
|
+
its(:expire_at) { should_not be_nil }
|
|
14
|
+
|
|
15
|
+
it { should_not be_blocked }
|
|
16
|
+
context "#block" do
|
|
17
|
+
before { subject.block! }
|
|
18
|
+
it { should be_blocked }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
context ".block_client!" do
|
|
22
|
+
before { @another_client_authorization = FactoryGirl.create(:oauth_authorization, client_uri: ANOTHER_CLIENT_URI) }
|
|
23
|
+
before { Oauth2Provider::OauthAuthorization.block_client!(CLIENT_URI) }
|
|
24
|
+
|
|
25
|
+
it { @authorization.reload.should be_blocked }
|
|
26
|
+
it { @another_client_authorization.reload.should_not be_blocked }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
context ".block_access!" do
|
|
30
|
+
before { @another_client_authorization = FactoryGirl.create(:oauth_authorization, client_uri: ANOTHER_CLIENT_URI)}
|
|
31
|
+
before { @another_owner_authorization = FactoryGirl.create(:oauth_authorization, resource_owner_uri: ANOTHER_USER_URI) }
|
|
32
|
+
before { Oauth2Provider::OauthAuthorization.block_access!(CLIENT_URI, USER_URI) }
|
|
33
|
+
|
|
34
|
+
it { @authorization.reload.should be_blocked }
|
|
35
|
+
it { @another_client_authorization.reload.should_not be_blocked }
|
|
36
|
+
it { @another_owner_authorization.reload.should_not be_blocked }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "#expired?" do
|
|
40
|
+
subject.should_not be_expired
|
|
41
|
+
Delorean.time_travel_to("in 151 seconds")
|
|
42
|
+
subject.should be_expired
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it ".where_code_and_client_uri" do
|
|
46
|
+
result = Oauth2Provider::OauthAuthorization.where_code_and_client_uri(subject.code, subject.client_uri).first
|
|
47
|
+
result.should == subject
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Oauth2Provider::OauthToken do
|
|
4
|
+
|
|
5
|
+
let(:access) { FactoryGirl.create(:oauth_access) }
|
|
6
|
+
let(:time) { Chronic.parse("17 august 1982") }
|
|
7
|
+
let(:day_requests) { access.daily_requests(time) }
|
|
8
|
+
|
|
9
|
+
its(:day) { day_requests.day.should == "17" }
|
|
10
|
+
its(:month) { day_requests.month.should == "08" }
|
|
11
|
+
its(:year) { day_requests.year.should == "1982" }
|
|
12
|
+
its(:time_id) { day_requests.time_id.should == "19820817" }
|
|
13
|
+
|
|
14
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Oauth2Provider::OauthRefreshToken do
|
|
4
|
+
before { @token = FactoryGirl.create(:oauth_token) }
|
|
5
|
+
before { @refresh_token = Oauth2Provider::OauthRefreshToken.create(access_token: @token.token) }
|
|
6
|
+
subject { @refresh_token }
|
|
7
|
+
|
|
8
|
+
it { should validate_presence_of :access_token }
|
|
9
|
+
|
|
10
|
+
its(:refresh_token) {should_not be_nil }
|
|
11
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Oauth2Provider::OauthToken do
|
|
4
|
+
before { @token = FactoryGirl.create(:oauth_token) }
|
|
5
|
+
subject { @token }
|
|
6
|
+
|
|
7
|
+
it { should validate_presence_of(:client_uri) }
|
|
8
|
+
it { VALID_URIS.each{|uri| should allow_value(uri).for(:client_uri) } }
|
|
9
|
+
it { should validate_presence_of(:resource_owner_uri) }
|
|
10
|
+
it { VALID_URIS.each{|uri| should allow_value(uri).for(:resource_owner_uri) } }
|
|
11
|
+
|
|
12
|
+
its(:token) { should_not be_nil }
|
|
13
|
+
its(:refresh_token) { should_not be_nil }
|
|
14
|
+
it { should_not be_blocked }
|
|
15
|
+
|
|
16
|
+
context "#block!" do
|
|
17
|
+
before { subject.block! }
|
|
18
|
+
it { should be_blocked }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
context ".block_client!" do
|
|
22
|
+
before { @another_client_token = FactoryGirl.create(:oauth_token, client_uri: ANOTHER_CLIENT_URI) }
|
|
23
|
+
before { Oauth2Provider::OauthToken.block_client!(CLIENT_URI) }
|
|
24
|
+
|
|
25
|
+
it { @token.reload.should be_blocked }
|
|
26
|
+
it { @another_client_token.should_not be_blocked }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
context ".block_access!" do
|
|
30
|
+
before { @another_client_token = FactoryGirl.create(:oauth_token, client_uri: ANOTHER_CLIENT_URI)}
|
|
31
|
+
before { @another_owner_token = FactoryGirl.create(:oauth_token, resource_owner_uri: ANOTHER_USER_URI) }
|
|
32
|
+
before { Oauth2Provider::OauthToken.block_access!(CLIENT_URI, USER_URI) }
|
|
33
|
+
|
|
34
|
+
it { @token.reload.should be_blocked }
|
|
35
|
+
it { @another_client_token.should_not be_blocked }
|
|
36
|
+
it { @another_owner_token.should_not be_blocked }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
context ".exist" do
|
|
40
|
+
it "should find the token" do
|
|
41
|
+
existing = Oauth2Provider::OauthToken.exist(@token.client_uri,
|
|
42
|
+
@token.resource_owner_uri,
|
|
43
|
+
@token.scope).first
|
|
44
|
+
existing.should_not be_nil
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
it "#expired?" do
|
|
50
|
+
subject.should_not be_expired
|
|
51
|
+
Delorean.time_travel_to("in #{Oauth2Provider.settings["token_expires_in"]} seconds")
|
|
52
|
+
subject.should be_expired
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Oauth2Provider::Scope do
|
|
4
|
+
before { @scope = FactoryGirl.create(:scope, values: ALL_SCOPE) }
|
|
5
|
+
subject { @scope }
|
|
6
|
+
|
|
7
|
+
it { should validate_presence_of(:name) }
|
|
8
|
+
it { should validate_presence_of(:name) }
|
|
9
|
+
|
|
10
|
+
it { VALID_URIS.each{|uri| should allow_value(uri).for(:uri) } }
|
|
11
|
+
it { INVALID_URIS.each{|uri| should_not allow_value(uri).for(:uri) } }
|
|
12
|
+
|
|
13
|
+
it { should_not allow_mass_assignment_of(:values) }
|
|
14
|
+
it { should_not allow_mass_assignment_of(:uri) }
|
|
15
|
+
|
|
16
|
+
its(:values) { should be_a_kind_of Array }
|
|
17
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# This file is copied to spec/ when you run 'rails generate rspec:install'
|
|
2
|
+
ENV["RAILS_ENV"] ||= 'test'
|
|
3
|
+
require File.expand_path("../../config/environment", __FILE__)
|
|
4
|
+
require 'rspec/rails'
|
|
5
|
+
|
|
6
|
+
# Requires supporting ruby files with custom matchers and macros, etc,
|
|
7
|
+
# in spec/support/ and its subdirectories.
|
|
8
|
+
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
|
|
9
|
+
|
|
10
|
+
# Require shared examples ruby files
|
|
11
|
+
Dir[Rails.root.join("spec/**/shared/*.rb")].each {|f| require f}
|
|
12
|
+
|
|
13
|
+
RSpec.configure do |config|
|
|
14
|
+
|
|
15
|
+
# Include helpers and global vars
|
|
16
|
+
config.include SettingsHelper
|
|
17
|
+
|
|
18
|
+
# Include extra rspec matchers
|
|
19
|
+
config.include Mongoid::Matchers
|
|
20
|
+
|
|
21
|
+
# Include time travel methods
|
|
22
|
+
config.include Delorean
|
|
23
|
+
|
|
24
|
+
# Mock library
|
|
25
|
+
config.mock_with :rspec
|
|
26
|
+
|
|
27
|
+
# User cleanup before each test
|
|
28
|
+
config.before(:each) do
|
|
29
|
+
User.destroy_all
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Cleaning up MongoDB afterspecs have ben executed
|
|
33
|
+
config.after :suite do
|
|
34
|
+
Mongoid.master.collections.select do |collection|
|
|
35
|
+
collection.name !~ /system/
|
|
36
|
+
end.each(&:drop)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|