opro 0.0.1 → 0.0.2
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/Gemfile +6 -2
- data/Gemfile.lock +37 -33
- data/README.md +60 -31
- data/Rakefile +8 -0
- data/VERSION +1 -1
- data/app/controllers/oauth/auth_controller.rb +35 -36
- data/app/controllers/oauth/client_app_controller.rb +24 -0
- data/app/controllers/oauth/docs_controller.rb +1 -1
- data/app/controllers/oauth/tests_controller.rb +4 -26
- data/app/controllers/oauth/token_controller.rb +40 -0
- data/app/controllers/opro_controller.rb +4 -0
- data/app/models/oauth/access_grant.rb +47 -14
- data/app/models/oauth/{client_application.rb → client_appl.rb} +1 -1
- data/app/views/oauth/{client_application → client_app}/create.html.erb +1 -1
- data/app/views/oauth/{client_application → client_app}/index.html.erb +1 -1
- data/app/views/oauth/{client_application → client_app}/new.html.erb +1 -1
- data/app/views/oauth/docs/index.html.erb +8 -0
- data/app/views/oauth/docs/markdown/oauth.md.erb +2 -2
- data/app/views/oauth/docs/markdown/permissions.md.erb +30 -0
- data/app/views/oauth/docs/markdown/quick_start.md.erb +1 -1
- data/app/views/oauth/docs/markdown/refresh_tokens.md.erb +18 -0
- data/config/routes.rb +5 -10
- data/lib/generators/active_record/opro_generator.rb +1 -1
- data/lib/generators/active_record/templates/access_grants.rb +1 -1
- data/lib/generators/active_record/templates/client_applications.rb +1 -1
- data/lib/generators/opro/install_generator.rb +5 -0
- data/lib/generators/templates/opro.rb +10 -3
- data/lib/opro.rb +7 -1
- data/lib/opro/controllers/application_controller_helper.rb +7 -2
- data/lib/opro/engine.rb +4 -0
- data/lib/opro/rails/routes.rb +17 -0
- data/opro.gemspec +27 -15
- data/test/controllers/refresh_token_test.rb +0 -0
- data/test/dummy/config/environments/test.rb +4 -0
- data/test/dummy/config/initializers/opro.rb +10 -3
- data/test/dummy/config/routes.rb +2 -0
- data/test/dummy/db/migrate/20120514060322_create_opro_access_grants.rb +1 -1
- data/test/dummy/db/migrate/20120514060323_create_opro_client_applications.rb +1 -1
- data/test/integration/action_dispatch/auth_controller_test.rb +64 -0
- data/test/integration/action_dispatch/oauth_flow_test.rb +34 -0
- data/test/integration/action_dispatch/refresh_token_test.rb +54 -0
- data/test/integration/auth_controller_test.rb +8 -7
- data/test/integration/client_app_controller_test.rb +24 -0
- data/test/integration/docs_controller_test.rb +9 -1
- data/test/integration/oauth_test.rb +1 -4
- data/test/integration/refresh_token_test.rb +32 -0
- data/test/support/integration_case.rb +10 -1
- data/test/test_helper.rb +7 -3
- metadata +56 -36
- data/app/controllers/oauth/client_application_controller.rb +0 -21
- data/app/controllers/opro_application_controller.rb +0 -8
- data/test/integration/client_application_controller_test.rb +0 -24
@@ -15,6 +15,7 @@ module Opro
|
|
15
15
|
|
16
16
|
def opro_authenticate_user!
|
17
17
|
Opro.authenticate_user_method.call(self)
|
18
|
+
true
|
18
19
|
end
|
19
20
|
|
20
21
|
module ClassMethods
|
@@ -37,7 +38,11 @@ module Opro
|
|
37
38
|
|
38
39
|
# returns boolean if oauth request
|
39
40
|
def valid_oauth?
|
40
|
-
oauth? && oauth_user.present? && oauth_client_has_permissions?
|
41
|
+
oauth? && oauth_user.present? && oauth_client_not_expired? && oauth_client_has_permissions?
|
42
|
+
end
|
43
|
+
|
44
|
+
def oauth_client_not_expired?
|
45
|
+
oauth_access_grant.not_expired?
|
41
46
|
end
|
42
47
|
|
43
48
|
def disallow_oauth
|
@@ -53,7 +58,7 @@ module Opro
|
|
53
58
|
end
|
54
59
|
|
55
60
|
def oauth_access_grant
|
56
|
-
@oauth_access_grant ||= Oauth::
|
61
|
+
@oauth_access_grant ||= Oauth::AuthGrant.find_for_token(params[:access_token])
|
57
62
|
end
|
58
63
|
|
59
64
|
def oauth_client_app
|
data/lib/opro/engine.rb
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
module ActionDispatch::Routing
|
2
|
+
class Mapper
|
3
|
+
# Includes mount_opro_oauth method for routes. This method is responsible to
|
4
|
+
# generate all needed routes for oauth
|
5
|
+
def mount_opro_oauth(options = {})
|
6
|
+
skip_routes = options[:except].is_a?(Array) ? options[:except] : [options[:except]]
|
7
|
+
|
8
|
+
match 'oauth/new' => 'oauth/auth#new', :as => 'oauth_new'
|
9
|
+
match 'oauth/authorize' => 'oauth/auth#create', :as => 'oauth_authorize'
|
10
|
+
match 'oauth/token' => 'oauth/token#create', :as => 'oauth_token'
|
11
|
+
|
12
|
+
resources :oauth_docs, :controller => 'oauth/docs' unless skip_routes.include?(:docs)
|
13
|
+
resources :oauth_tests, :controller => 'oauth/tests' unless skip_routes.include?(:tests)
|
14
|
+
resources :oauth_client_apps, :controller => 'oauth/client_app' unless skip_routes.include?(:client_apps)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/opro.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "opro"
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["schneems"]
|
12
|
-
s.date = "2012-06-
|
12
|
+
s.date = "2012-06-18"
|
13
13
|
s.description = " Enable OAuth clients (iphone, android, web sites, etc.) to access and use your Rails application, what you do with it is up to you"
|
14
14
|
s.email = "richard.schneeman@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -24,20 +24,23 @@ Gem::Specification.new do |s|
|
|
24
24
|
"Rakefile",
|
25
25
|
"VERSION",
|
26
26
|
"app/controllers/oauth/auth_controller.rb",
|
27
|
-
"app/controllers/oauth/
|
27
|
+
"app/controllers/oauth/client_app_controller.rb",
|
28
28
|
"app/controllers/oauth/docs_controller.rb",
|
29
29
|
"app/controllers/oauth/tests_controller.rb",
|
30
|
-
"app/controllers/
|
30
|
+
"app/controllers/oauth/token_controller.rb",
|
31
|
+
"app/controllers/opro_controller.rb",
|
31
32
|
"app/models/oauth/access_grant.rb",
|
32
|
-
"app/models/oauth/
|
33
|
+
"app/models/oauth/client_appl.rb",
|
33
34
|
"app/views/oauth/auth/new.html.erb",
|
34
|
-
"app/views/oauth/
|
35
|
-
"app/views/oauth/
|
36
|
-
"app/views/oauth/
|
35
|
+
"app/views/oauth/client_app/create.html.erb",
|
36
|
+
"app/views/oauth/client_app/index.html.erb",
|
37
|
+
"app/views/oauth/client_app/new.html.erb",
|
37
38
|
"app/views/oauth/docs/index.html.erb",
|
38
39
|
"app/views/oauth/docs/markdown/curl.md.erb",
|
39
40
|
"app/views/oauth/docs/markdown/oauth.md.erb",
|
41
|
+
"app/views/oauth/docs/markdown/permissions.md.erb",
|
40
42
|
"app/views/oauth/docs/markdown/quick_start.md.erb",
|
43
|
+
"app/views/oauth/docs/markdown/refresh_tokens.md.erb",
|
41
44
|
"app/views/oauth/docs/show.html.erb",
|
42
45
|
"app/views/oauth/tests/index.html.erb",
|
43
46
|
"config/routes.rb",
|
@@ -51,8 +54,10 @@ Gem::Specification.new do |s|
|
|
51
54
|
"lib/opro/controllers/concerns/error_messages.rb",
|
52
55
|
"lib/opro/controllers/concerns/permissions.rb",
|
53
56
|
"lib/opro/engine.rb",
|
57
|
+
"lib/opro/rails/routes.rb",
|
54
58
|
"opro.gemspec",
|
55
59
|
"test/controllers/permissions_test.rb",
|
60
|
+
"test/controllers/refresh_token_test.rb",
|
56
61
|
"test/dummy/Rakefile",
|
57
62
|
"test/dummy/app/controllers/application_controller.rb",
|
58
63
|
"test/dummy/app/controllers/pages_controller.rb",
|
@@ -96,10 +101,14 @@ Gem::Specification.new do |s|
|
|
96
101
|
"test/dummy/public/javascripts/rails.js",
|
97
102
|
"test/dummy/public/stylesheets/.gitkeep",
|
98
103
|
"test/dummy/script/rails",
|
104
|
+
"test/integration/action_dispatch/auth_controller_test.rb",
|
105
|
+
"test/integration/action_dispatch/oauth_flow_test.rb",
|
106
|
+
"test/integration/action_dispatch/refresh_token_test.rb",
|
99
107
|
"test/integration/auth_controller_test.rb",
|
100
|
-
"test/integration/
|
108
|
+
"test/integration/client_app_controller_test.rb",
|
101
109
|
"test/integration/docs_controller_test.rb",
|
102
110
|
"test/integration/oauth_test.rb",
|
111
|
+
"test/integration/refresh_token_test.rb",
|
103
112
|
"test/opro_test.rb",
|
104
113
|
"test/support/integration_case.rb",
|
105
114
|
"test/test_helper.rb"
|
@@ -114,10 +123,11 @@ Gem::Specification.new do |s|
|
|
114
123
|
s.specification_version = 3
|
115
124
|
|
116
125
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
117
|
-
s.add_runtime_dependency(%q<activesupport>, [">= 3.0
|
118
|
-
s.add_runtime_dependency(%q<rails>, [">= 3.0
|
126
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 3.1.0"])
|
127
|
+
s.add_runtime_dependency(%q<rails>, [">= 3.1.0"])
|
119
128
|
s.add_runtime_dependency(%q<bluecloth>, [">= 0"])
|
120
129
|
s.add_development_dependency(%q<mocha>, [">= 0"])
|
130
|
+
s.add_development_dependency(%q<timecop>, [">= 0"])
|
121
131
|
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
122
132
|
s.add_development_dependency(%q<bundler>, [">= 1.1.3"])
|
123
133
|
s.add_development_dependency(%q<capybara>, [">= 0.4.0"])
|
@@ -127,10 +137,11 @@ Gem::Specification.new do |s|
|
|
127
137
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
128
138
|
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
129
139
|
else
|
130
|
-
s.add_dependency(%q<activesupport>, [">= 3.0
|
131
|
-
s.add_dependency(%q<rails>, [">= 3.0
|
140
|
+
s.add_dependency(%q<activesupport>, [">= 3.1.0"])
|
141
|
+
s.add_dependency(%q<rails>, [">= 3.1.0"])
|
132
142
|
s.add_dependency(%q<bluecloth>, [">= 0"])
|
133
143
|
s.add_dependency(%q<mocha>, [">= 0"])
|
144
|
+
s.add_dependency(%q<timecop>, [">= 0"])
|
134
145
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
135
146
|
s.add_dependency(%q<bundler>, [">= 1.1.3"])
|
136
147
|
s.add_dependency(%q<capybara>, [">= 0.4.0"])
|
@@ -141,10 +152,11 @@ Gem::Specification.new do |s|
|
|
141
152
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
142
153
|
end
|
143
154
|
else
|
144
|
-
s.add_dependency(%q<activesupport>, [">= 3.0
|
145
|
-
s.add_dependency(%q<rails>, [">= 3.0
|
155
|
+
s.add_dependency(%q<activesupport>, [">= 3.1.0"])
|
156
|
+
s.add_dependency(%q<rails>, [">= 3.1.0"])
|
146
157
|
s.add_dependency(%q<bluecloth>, [">= 0"])
|
147
158
|
s.add_dependency(%q<mocha>, [">= 0"])
|
159
|
+
s.add_dependency(%q<timecop>, [">= 0"])
|
148
160
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
149
161
|
s.add_dependency(%q<bundler>, [">= 1.1.3"])
|
150
162
|
s.add_dependency(%q<capybara>, [">= 0.4.0"])
|
File without changes
|
@@ -10,6 +10,10 @@ Dummy::Application.configure do
|
|
10
10
|
# Log error messages when you accidentally call methods on nil.
|
11
11
|
config.whiny_nils = true
|
12
12
|
|
13
|
+
|
14
|
+
config.log_level = :debug
|
15
|
+
|
16
|
+
|
13
17
|
# Show full error reports and disable caching
|
14
18
|
config.consider_all_requests_local = true
|
15
19
|
config.action_controller.perform_caching = false
|
@@ -3,8 +3,15 @@ Opro.setup do |config|
|
|
3
3
|
config.auth_strategy = :devise
|
4
4
|
|
5
5
|
## Add or remove application permissions
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
# Read permission (any request with [GET]) is turned on by default
|
7
|
+
# Write permission (any request other than [GET]) is requestable by default
|
8
|
+
# Custom permissions can be configured by adding them to `config.request_permissions`
|
9
|
+
# You can then require that permission on individual actions by calling
|
10
|
+
# `require_oauth_permissions` in the controller
|
9
11
|
config.request_permissions = [:write]
|
12
|
+
|
13
|
+
## Refresh Token config
|
14
|
+
# uncomment `config.require_refresh_within` to require refresh tokens
|
15
|
+
# this will expire tokens within the given time duration
|
16
|
+
# config.require_refresh_within = 1.month
|
10
17
|
end
|
data/test/dummy/config/routes.rb
CHANGED
@@ -0,0 +1,64 @@
|
|
1
|
+
## NOT CAPYBARA
|
2
|
+
# ActionDispatch::IntegrationTest
|
3
|
+
# http://guides.rubyonrails.org/testing.html#integration-testing
|
4
|
+
# used so we can test POST actions ^_^
|
5
|
+
|
6
|
+
require 'test_helper'
|
7
|
+
|
8
|
+
class AuthControllerTest < ActionDispatch::IntegrationTest
|
9
|
+
setup do
|
10
|
+
@user = create_user
|
11
|
+
@client_app = create_client_app
|
12
|
+
@redirect_uri = '/'
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
test "AUTHORIZE: previously authed user gets Authed immediately, permissions not changed" do
|
17
|
+
auth_grant = create_auth_grant_for_user(@user, @client_app)
|
18
|
+
|
19
|
+
params = { :client_id => @client_app.client_id ,
|
20
|
+
:client_secret => @client_app.client_secret,
|
21
|
+
:redirect_uri => @redirect_uri }
|
22
|
+
|
23
|
+
as_user(@user).post oauth_authorize_path(params)
|
24
|
+
|
25
|
+
assert_equal 302, status
|
26
|
+
follow_redirect!
|
27
|
+
assert_equal @redirect_uri, path
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
test "AUTHORIZE: app cannot force permissions change for previously authed user" do
|
32
|
+
auth_grant = create_auth_grant_for_user(@user, @client_app)
|
33
|
+
permissions = { 'foo' => 1 }
|
34
|
+
assert_not_equal auth_grant.permissions, permissions
|
35
|
+
|
36
|
+
params = { :client_id => @client_app.client_id ,
|
37
|
+
:client_secret => @client_app.client_secret,
|
38
|
+
:redirect_uri => @redirect_uri,
|
39
|
+
:permissions => permissions }
|
40
|
+
|
41
|
+
as_user(@user).post oauth_authorize_path(params)
|
42
|
+
|
43
|
+
assert_equal 302, status
|
44
|
+
follow_redirect!
|
45
|
+
assert_equal @redirect_uri, path
|
46
|
+
auth_grant = Oauth::AuthGrant.find(auth_grant.id)
|
47
|
+
|
48
|
+
refute auth_grant.permissions.has_key?(permissions.keys.first)
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
test "AUTHORIZE: user gets redirected to new form if not already authed" do
|
53
|
+
params = { :client_id => @client_app.client_id ,
|
54
|
+
:client_secret => @client_app.client_secret,
|
55
|
+
:redirect_uri => @redirect_uri }
|
56
|
+
|
57
|
+
as_user(@user).post oauth_authorize_path(params)
|
58
|
+
|
59
|
+
assert_equal 302, status
|
60
|
+
follow_redirect!
|
61
|
+
assert_equal oauth_new_path, path
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
## NOT CAPYBARA
|
2
|
+
# ActionDispatch::IntegrationTest
|
3
|
+
# http://guides.rubyonrails.org/testing.html#integration-testing
|
4
|
+
# used so we can test POST actions ^_^
|
5
|
+
|
6
|
+
require 'test_helper'
|
7
|
+
|
8
|
+
class OauthTokenTest < ActionDispatch::IntegrationTest
|
9
|
+
setup do
|
10
|
+
@user = create_user
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
test "exchange a code for a token" do
|
15
|
+
user = create_user
|
16
|
+
auth_grant = create_auth_grant_for_user(user)
|
17
|
+
client = auth_grant.application
|
18
|
+
params = {:code => auth_grant.code,
|
19
|
+
:client_id => client.client_id,
|
20
|
+
:client_secret => client.client_secret}
|
21
|
+
|
22
|
+
|
23
|
+
as_user(@user).post oauth_token_path(params)
|
24
|
+
|
25
|
+
json_hash = JSON.parse(response.body)
|
26
|
+
assert json_hash["access_token"]
|
27
|
+
assert json_hash["access_token"], auth_grant.access_token
|
28
|
+
|
29
|
+
assert json_hash["refresh_token"]
|
30
|
+
assert json_hash["refresh_token"], auth_grant.refresh_token
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
@@ -0,0 +1,54 @@
|
|
1
|
+
## NOT CAPYBARA
|
2
|
+
# ActionDispatch::IntegrationTest
|
3
|
+
# http://guides.rubyonrails.org/testing.html#integration-testing
|
4
|
+
# used so we can test POST actions ^_^
|
5
|
+
|
6
|
+
require 'test_helper'
|
7
|
+
|
8
|
+
class RefreshTokenTest < ActionDispatch::IntegrationTest
|
9
|
+
setup do
|
10
|
+
Timecop.freeze(Time.now)
|
11
|
+
Opro.setup do |config|
|
12
|
+
config.require_refresh_within = 1.month
|
13
|
+
end
|
14
|
+
|
15
|
+
@user = create_user
|
16
|
+
@auth_grant = create_auth_grant_for_user(@user)
|
17
|
+
@client_app = @auth_grant.application
|
18
|
+
end
|
19
|
+
|
20
|
+
teardown do
|
21
|
+
Timecop.return # "turn off" Timecop
|
22
|
+
end
|
23
|
+
|
24
|
+
test "clients get a valid refresh token" do
|
25
|
+
params = {:client_id => @client_app.client_id ,
|
26
|
+
:client_secret => @client_app.client_secret,
|
27
|
+
:code => @auth_grant.code}
|
28
|
+
as_user(@user).post oauth_token_path(params)
|
29
|
+
json_hash = JSON.parse(response.body)
|
30
|
+
assert_equal json_hash['expires_in'], @auth_grant.expires_in
|
31
|
+
end
|
32
|
+
|
33
|
+
test "exchange a refresh_token for an access_token" do
|
34
|
+
params = {:client_id => @client_app.client_id ,
|
35
|
+
:client_secret => @client_app.client_secret,
|
36
|
+
:refresh_token => @auth_grant.refresh_token}
|
37
|
+
|
38
|
+
Timecop.travel(2.days.from_now)
|
39
|
+
|
40
|
+
as_user(@user).post oauth_token_path(params)
|
41
|
+
|
42
|
+
json_hash = JSON.parse(response.body)
|
43
|
+
refute_equal json_hash['access_token'], @auth_grant.access_token
|
44
|
+
refute_equal json_hash['refresh_token'], @auth_grant.refresh_token
|
45
|
+
refute_equal json_hash['expires_in'], @auth_grant.expires_in
|
46
|
+
|
47
|
+
|
48
|
+
auth_grant = Oauth::AuthGrant.find(@auth_grant.id)
|
49
|
+
assert_equal json_hash['access_token'], auth_grant.access_token
|
50
|
+
assert_equal json_hash['refresh_token'], auth_grant.refresh_token
|
51
|
+
assert_equal json_hash['expires_in'], auth_grant.expires_in
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class
|
3
|
+
class CapybaraAuthControllerTest < ActiveSupport::IntegrationCase
|
4
4
|
|
5
5
|
setup do
|
6
6
|
@app = create_client_app
|
@@ -14,13 +14,14 @@ class AuthControllerTest < ActiveSupport::IntegrationCase
|
|
14
14
|
end
|
15
15
|
|
16
16
|
test 'auth entry point is accessible to logged IN users' do
|
17
|
+
as_user(@user) do
|
18
|
+
visit oauth_new_path(:client_id => @app.client_id, :redirect_uri => @redirect_uri)
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
20
|
+
assert_equal '/oauth/new', current_path
|
21
|
+
click_button 'oauthAuthorize'
|
22
|
+
end
|
21
23
|
|
22
|
-
|
23
|
-
access_grant = Oauth::AccessGrant.where(:user_id => @user.id, :application_id => @app.id).first
|
24
|
+
access_grant = Oauth::AuthGrant.where(:user_id => @user.id, :application_id => @app.id).first
|
24
25
|
assert_equal @redirect_uri, current_path
|
25
26
|
assert access_grant.present?
|
26
27
|
assert access_grant.can?(:write) # write access is checked by default
|
@@ -31,7 +32,7 @@ class AuthControllerTest < ActiveSupport::IntegrationCase
|
|
31
32
|
|
32
33
|
uncheck('permissions_write') # uncheck write access
|
33
34
|
click_button 'oauthAuthorize'
|
34
|
-
access_grant = Oauth::
|
35
|
+
access_grant = Oauth::AuthGrant.where(:user_id => @user.id, :application_id => @app.id).first
|
35
36
|
refute access_grant.can?(:write)
|
36
37
|
end
|
37
38
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ClientAppControllerTest < ActiveSupport::IntegrationCase
|
4
|
+
test 'must be logged in' do
|
5
|
+
visit new_oauth_client_app_path
|
6
|
+
assert_equal '/users/sign_in', current_path
|
7
|
+
end
|
8
|
+
|
9
|
+
test 'create client application' do
|
10
|
+
user = create_user
|
11
|
+
as_user(user).visit new_oauth_client_app_path
|
12
|
+
assert_equal '/oauth_client_apps/new', current_path
|
13
|
+
|
14
|
+
fill_in 'oauth_client_app_name', :with => rand_name
|
15
|
+
|
16
|
+
click_button 'submitApp'
|
17
|
+
assert_equal '/oauth_client_apps', current_path
|
18
|
+
|
19
|
+
last_client = Oauth::ClientApp.order(:created_at).last
|
20
|
+
assert has_content?(last_client.name)
|
21
|
+
assert has_content?(last_client.client_id)
|
22
|
+
assert has_content?(last_client.client_secret)
|
23
|
+
end
|
24
|
+
end
|