oath 1.1.0
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.
- checksums.yaml +7 -0
- data/.gitignore +7 -0
- data/.rspec +1 -0
- data/.travis.yml +3 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +165 -0
- data/LICENSE.txt +22 -0
- data/NEWS.rdoc +118 -0
- data/README.md +384 -0
- data/Rakefile +6 -0
- data/lib/oath.rb +132 -0
- data/lib/oath/back_door.rb +53 -0
- data/lib/oath/configuration.rb +149 -0
- data/lib/oath/constraints/signed_in.rb +14 -0
- data/lib/oath/constraints/signed_out.rb +14 -0
- data/lib/oath/controller_helpers.rb +161 -0
- data/lib/oath/failure_app.rb +48 -0
- data/lib/oath/field_map.rb +56 -0
- data/lib/oath/param_transformer.rb +38 -0
- data/lib/oath/railtie.rb +11 -0
- data/lib/oath/services.rb +5 -0
- data/lib/oath/services/authentication.rb +40 -0
- data/lib/oath/services/password_reset.rb +27 -0
- data/lib/oath/services/sign_in.rb +25 -0
- data/lib/oath/services/sign_out.rb +24 -0
- data/lib/oath/services/sign_up.rb +42 -0
- data/lib/oath/strategies/password_strategy.rb +42 -0
- data/lib/oath/test/controller_helpers.rb +43 -0
- data/lib/oath/test/helpers.rb +24 -0
- data/lib/oath/version.rb +4 -0
- data/lib/oath/warden_setup.rb +47 -0
- data/oath.gemspec +30 -0
- data/spec/features/user/user_signs_in_spec.rb +14 -0
- data/spec/features/user/user_signs_in_through_back_door_spec.rb +11 -0
- data/spec/features/user/user_tries_to_access_constrained_routes_spec.rb +18 -0
- data/spec/features/user/user_tries_to_access_http_auth_page_spec.rb +9 -0
- data/spec/features/visitor/visitor_fails_to_sign_up_spec.rb +10 -0
- data/spec/features/visitor/visitor_is_unauthorized_spec.rb +8 -0
- data/spec/features/visitor/visitor_signs_in_via_invalid_form_spec.rb +11 -0
- data/spec/features/visitor/visitor_signs_up_spec.rb +40 -0
- data/spec/features/visitor/visitor_tries_to_access_constrained_routes_spec.rb +14 -0
- data/spec/features/visitor/visitor_uses_remember_token_spec.rb +13 -0
- data/spec/oath/configuration_spec.rb +11 -0
- data/spec/oath/controller_helpers_spec.rb +180 -0
- data/spec/oath/field_map_spec.rb +19 -0
- data/spec/oath/services/authentication_spec.rb +25 -0
- data/spec/oath/services/password_reset_spec.rb +24 -0
- data/spec/oath/services/sign_in_spec.rb +13 -0
- data/spec/oath/services/sign_out_spec.rb +13 -0
- data/spec/oath/services/sign_up_spec.rb +49 -0
- data/spec/oath/strategies/password_strategy_spec.rb +23 -0
- data/spec/oath/test_controller_helpers_spec.rb +63 -0
- data/spec/oath/test_helpers_spec.rb +97 -0
- data/spec/oath_spec.rb +27 -0
- data/spec/rails_app/Rakefile +7 -0
- data/spec/rails_app/app/assets/images/rails.png +0 -0
- data/spec/rails_app/app/assets/javascripts/application.js +13 -0
- data/spec/rails_app/app/assets/stylesheets/application.css +13 -0
- data/spec/rails_app/app/controllers/application_controller.rb +4 -0
- data/spec/rails_app/app/controllers/basic_auth_controller.rb +7 -0
- data/spec/rails_app/app/controllers/constrained_to_users_controller.rb +5 -0
- data/spec/rails_app/app/controllers/constrained_to_visitors_controller.rb +5 -0
- data/spec/rails_app/app/controllers/failures_controller.rb +5 -0
- data/spec/rails_app/app/controllers/invalid_sessions_controller.rb +2 -0
- data/spec/rails_app/app/controllers/posts_controller.rb +6 -0
- data/spec/rails_app/app/controllers/sessions_controller.rb +26 -0
- data/spec/rails_app/app/controllers/users_controller.rb +23 -0
- data/spec/rails_app/app/helpers/application_helper.rb +2 -0
- data/spec/rails_app/app/models/user.rb +10 -0
- data/spec/rails_app/app/views/invalid_sessions/new.html.erb +4 -0
- data/spec/rails_app/app/views/layouts/application.html.erb +18 -0
- data/spec/rails_app/app/views/posts/index.html.erb +1 -0
- data/spec/rails_app/app/views/sessions/new.html.erb +5 -0
- data/spec/rails_app/app/views/users/new.html.erb +5 -0
- data/spec/rails_app/config.ru +4 -0
- data/spec/rails_app/config/application.rb +58 -0
- data/spec/rails_app/config/boot.rb +6 -0
- data/spec/rails_app/config/database.yml +25 -0
- data/spec/rails_app/config/environment.rb +5 -0
- data/spec/rails_app/config/environments/development.rb +29 -0
- data/spec/rails_app/config/environments/production.rb +54 -0
- data/spec/rails_app/config/environments/test.rb +29 -0
- data/spec/rails_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/rails_app/config/initializers/inflections.rb +15 -0
- data/spec/rails_app/config/initializers/secret_token.rb +7 -0
- data/spec/rails_app/config/routes.rb +24 -0
- data/spec/rails_app/db/seeds.rb +7 -0
- data/spec/rails_app/public/404.html +26 -0
- data/spec/rails_app/public/422.html +26 -0
- data/spec/rails_app/public/500.html +25 -0
- data/spec/rails_app/public/favicon.ico +0 -0
- data/spec/rails_app/script/rails +6 -0
- data/spec/spec_helper.rb +37 -0
- metadata +325 -0
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'warden'
|
2
|
+
require "oath/strategies/password_strategy"
|
3
|
+
|
4
|
+
module Oath
|
5
|
+
# Sets up warden specifics for working with oath
|
6
|
+
class WardenSetup
|
7
|
+
def initialize(warden_config)
|
8
|
+
@warden_config = warden_config
|
9
|
+
end
|
10
|
+
|
11
|
+
# Sets up warden specifics for working with oath:
|
12
|
+
# * Session serialization
|
13
|
+
# * Strategy
|
14
|
+
# * Failure app
|
15
|
+
def call
|
16
|
+
setup_warden_manager
|
17
|
+
setup_warden_strategies
|
18
|
+
setup_warden_config
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
attr_reader :warden_config
|
23
|
+
|
24
|
+
def setup_warden_manager
|
25
|
+
Warden::Manager.serialize_into_session(&serialize_into_session_method)
|
26
|
+
Warden::Manager.serialize_from_session(&serialize_from_session_method)
|
27
|
+
end
|
28
|
+
|
29
|
+
def setup_warden_strategies
|
30
|
+
Warden::Strategies.add(:password_strategy, Oath.config.authentication_strategy)
|
31
|
+
end
|
32
|
+
|
33
|
+
def setup_warden_config
|
34
|
+
warden_config.tap do |config|
|
35
|
+
config.failure_app = Oath.config.failure_app
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def serialize_into_session_method
|
40
|
+
Oath.config.warden_serialize_into_session
|
41
|
+
end
|
42
|
+
|
43
|
+
def serialize_from_session_method
|
44
|
+
Oath.config.warden_serialize_from_session
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/oath.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'oath/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "oath"
|
8
|
+
gem.version = Oath::VERSION
|
9
|
+
gem.authors = ["halogenandtoast", "calebthompson"]
|
10
|
+
gem.email = ["halogenandtoast@gmail.com"]
|
11
|
+
gem.description = %q{simple rails authentication}
|
12
|
+
gem.summary = %q{Making rails authentication as simple as possible}
|
13
|
+
gem.homepage = "https://github.com/halogenandtoast/oath"
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.add_dependency 'rails'
|
21
|
+
gem.add_dependency 'bcrypt'
|
22
|
+
gem.add_dependency 'warden'
|
23
|
+
|
24
|
+
gem.add_development_dependency 'rake'
|
25
|
+
gem.add_development_dependency 'rspec'
|
26
|
+
gem.add_development_dependency 'rspec-rails'
|
27
|
+
gem.add_development_dependency 'capybara'
|
28
|
+
gem.add_development_dependency 'sqlite3'
|
29
|
+
gem.add_development_dependency 'active_hash'
|
30
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'User signs in' do
|
4
|
+
scenario 'with mismatched email case' do
|
5
|
+
user = User.create!(email: "example@example.com", password_digest: "password")
|
6
|
+
|
7
|
+
visit sign_in_path
|
8
|
+
fill_in "session[email]", with: "Example@example.com"
|
9
|
+
fill_in "session[password]", with: "password"
|
10
|
+
click_button "go"
|
11
|
+
|
12
|
+
expect(current_path).to eq posts_path
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'User signs in through the back-door' do
|
4
|
+
scenario 'with the configured lookup field' do
|
5
|
+
user = User.create!
|
6
|
+
|
7
|
+
visit constrained_to_users_path(as: user)
|
8
|
+
|
9
|
+
expect(current_path).to eq constrained_to_users_path
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'User tries to access constrained routes' do
|
4
|
+
scenario 'they can access a route constrained to users' do
|
5
|
+
sign_in User.new
|
6
|
+
|
7
|
+
visit constrained_to_users_path
|
8
|
+
expect(page.status_code).to eq(200)
|
9
|
+
end
|
10
|
+
|
11
|
+
scenario 'they cannot access a route constrained to visitors' do
|
12
|
+
sign_in User.new
|
13
|
+
|
14
|
+
expect {
|
15
|
+
visit constrained_to_visitors_path
|
16
|
+
}.to raise_error ActionController::RoutingError
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'User tries to access constrained routes' do
|
4
|
+
scenario 'they can access a route constrained to users' do
|
5
|
+
page.driver.browser.basic_authorize("admin", "password")
|
6
|
+
visit basic_auth_path
|
7
|
+
expect(page.status_code).to eq(200)
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'Visitor signs in with invalid form' do
|
4
|
+
scenario 'is not signed in' do
|
5
|
+
Oath::Services::SignUp.new(email: 'email@example.com', password: 'password').perform
|
6
|
+
visit invalid_sign_in_path
|
7
|
+
fill_in "session_password", with: 'password'
|
8
|
+
click_button 'go'
|
9
|
+
expect(page).to have_content("Sign in")
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'Visitor signs up' do
|
4
|
+
scenario 'with an email and password' do
|
5
|
+
visit sign_up_path
|
6
|
+
fill_in 'user_email', with: 'email@example.com'
|
7
|
+
fill_in 'user_password', with: 'password'
|
8
|
+
click_on 'go'
|
9
|
+
|
10
|
+
expect(page.current_path).to eq(posts_path)
|
11
|
+
end
|
12
|
+
|
13
|
+
scenario 'with uppercase email' do
|
14
|
+
visit sign_up_path
|
15
|
+
fill_in 'user_email', with: 'Email@example.com'
|
16
|
+
fill_in 'user_password', with: 'password'
|
17
|
+
click_on 'go'
|
18
|
+
|
19
|
+
expect(User.last.email).to eq('email@example.com')
|
20
|
+
end
|
21
|
+
|
22
|
+
scenario 'multiple users' do
|
23
|
+
visit sign_up_path
|
24
|
+
fill_in 'user_email', with: 'email@example.com'
|
25
|
+
fill_in 'user_password', with: 'password'
|
26
|
+
click_on 'go'
|
27
|
+
click_on 'Sign out'
|
28
|
+
visit sign_up_path
|
29
|
+
fill_in 'user_email', with: 'email2@example.com'
|
30
|
+
fill_in 'user_password', with: 'password2'
|
31
|
+
click_on 'go'
|
32
|
+
click_on 'Sign out'
|
33
|
+
visit sign_in_path
|
34
|
+
fill_in 'session_email', with: 'email@example.com'
|
35
|
+
fill_in 'session_password', with: 'password'
|
36
|
+
click_on 'go'
|
37
|
+
|
38
|
+
expect(page.current_path).to eq(posts_path)
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'Visitor tries to access constrained routes' do
|
4
|
+
scenario 'they can access a route constrained to visitors' do
|
5
|
+
visit constrained_to_visitors_path
|
6
|
+
expect(page.status_code).to eq(200)
|
7
|
+
end
|
8
|
+
|
9
|
+
scenario 'they cannot access a route constrained to users' do
|
10
|
+
expect {
|
11
|
+
visit constrained_to_users_path
|
12
|
+
}.to raise_error ActionController::RoutingError
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'Visitor signs in' do
|
4
|
+
scenario 'with remember token' do
|
5
|
+
pending
|
6
|
+
Oath::SignUp.new(email: "email@example.com", password: "password").perform
|
7
|
+
visit sign_in_path
|
8
|
+
fill_in 'session_email', with: 'email@example.com'
|
9
|
+
fill_in 'session_password', with: 'password'
|
10
|
+
check 'Remember me'
|
11
|
+
click_on 'go'
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'warden'
|
3
|
+
|
4
|
+
module Oath
|
5
|
+
describe Configuration do
|
6
|
+
it 'sets the no login redirect to a resonable default' do
|
7
|
+
configuration = Configuration.new
|
8
|
+
expect(configuration.no_login_redirect).to eq({ controller: "/sessions", action: "new" })
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,180 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'warden'
|
3
|
+
|
4
|
+
module Oath
|
5
|
+
describe ControllerHelpers do
|
6
|
+
class WardenMock
|
7
|
+
def user; end
|
8
|
+
end
|
9
|
+
class Flash < Struct.new(:notice)
|
10
|
+
end
|
11
|
+
class FakeRequest
|
12
|
+
attr_reader :env
|
13
|
+
def initialize(env)
|
14
|
+
@env = env
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Dummy
|
19
|
+
attr_reader :redirected, :redirected_to, :flash, :request
|
20
|
+
def initialize warden
|
21
|
+
@warden = warden
|
22
|
+
@flash = Flash.new
|
23
|
+
@redirected = false
|
24
|
+
@request = FakeRequest.new(env)
|
25
|
+
end
|
26
|
+
def redirect_to path
|
27
|
+
@redirected = true
|
28
|
+
@redirected_to = path
|
29
|
+
end
|
30
|
+
def env
|
31
|
+
{ "warden" => @warden }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
before(:each) do
|
36
|
+
@warden = WardenMock.new
|
37
|
+
@dummy = Dummy.new(@warden)
|
38
|
+
@dummy.extend(ControllerHelpers)
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'performs a sign in' do
|
42
|
+
user = stub_sign_in
|
43
|
+
@dummy.sign_in user
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'runs the block when user is signed in' do
|
47
|
+
user = stub_sign_in
|
48
|
+
expectation = double()
|
49
|
+
allow(expectation).to receive(:success)
|
50
|
+
@dummy.sign_in(user) { expectation.success }
|
51
|
+
expect(expectation).to have_received(:success)
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'does not run the block when user can not be signed in' do
|
55
|
+
user = stub_sign_in(false)
|
56
|
+
expectation = double()
|
57
|
+
allow(expectation).to receive(:failure)
|
58
|
+
@dummy.sign_in(user) { expectation.failure }
|
59
|
+
expect(expectation).not_to have_received(:failure)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'performs a sign out' do
|
63
|
+
sign_out = double()
|
64
|
+
allow(sign_out).to receive(:perform)
|
65
|
+
allow(Services::SignOut).to receive(:new).with(@warden).and_return(sign_out)
|
66
|
+
@dummy.sign_out
|
67
|
+
expect(sign_out).to have_received(:perform)
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'performs a sign_up' do
|
71
|
+
user_params = stub_sign_up
|
72
|
+
@dummy.sign_up user_params
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'runs the block when user is signed up' do
|
76
|
+
user_params = stub_sign_up
|
77
|
+
expectation = double()
|
78
|
+
allow(expectation).to receive(:success)
|
79
|
+
@dummy.sign_up(user_params) { expectation.success }
|
80
|
+
expect(expectation).to have_received(:success)
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'does not run the block when user can not be signed up' do
|
84
|
+
user_params = stub_sign_up(false)
|
85
|
+
expectation = double()
|
86
|
+
allow(expectation).to receive(:failure)
|
87
|
+
@dummy.sign_up(user_params) { expectation.failure }
|
88
|
+
expect(expectation).not_to have_received(:failure)
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'authenticates a session' do
|
92
|
+
session_params = { password: 'password', email: 'a@b.com' }
|
93
|
+
user = double()
|
94
|
+
authentication = double()
|
95
|
+
allow(authentication).to receive(:perform).and_return(user)
|
96
|
+
allow(Oath).to receive(:lookup).with({email: 'a@b.com'}, nil).and_return(user)
|
97
|
+
allow(Services::Authentication).to receive(:new).with(user, 'password').and_return(authentication)
|
98
|
+
expect(@dummy.authenticate_session(session_params)).to eq user
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'authenticates a session against multiple fields' do
|
102
|
+
session_params = { email_or_username: 'foo', password: 'password' }
|
103
|
+
field_map = { email_or_username: [:email, :username] }
|
104
|
+
user = double()
|
105
|
+
authentication = double()
|
106
|
+
allow(authentication).to receive(:perform).and_return(user)
|
107
|
+
allow(Oath).to receive(:lookup).with(session_params.except(:password), field_map).and_return(user)
|
108
|
+
allow(Services::Authentication).to receive(:new).with(user, 'password').and_return(authentication)
|
109
|
+
expect(@dummy.authenticate_session(session_params, field_map)).to eq user
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'returns false when it could not authenticate the user' do
|
113
|
+
session_params = { password: "password", lookup_key: "lookup_key" }
|
114
|
+
user = double()
|
115
|
+
authentication = double()
|
116
|
+
allow(authentication).to receive(:perform).and_return(false)
|
117
|
+
allow(Oath).to receive(:lookup).with({ lookup_key: "lookup_key" }, nil).and_return(user)
|
118
|
+
allow(Services::Authentication).to receive(:new).with(user, 'password').and_return(authentication)
|
119
|
+
expect(@dummy.authenticate_session(session_params)).to be_falsey
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'performs an authenticate' do
|
123
|
+
user = double()
|
124
|
+
password = double()
|
125
|
+
authentication = double()
|
126
|
+
allow(authentication).to receive(:perform)
|
127
|
+
allow(Services::Authentication).to receive(:new).with(user, password).and_return(authentication)
|
128
|
+
@dummy.authenticate user, password
|
129
|
+
expect(authentication).to have_received(:perform)
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'returns the current user' do
|
133
|
+
current_user = double()
|
134
|
+
allow(@warden).to receive(:user).and_return(current_user)
|
135
|
+
expect(@dummy.current_user).to eq current_user
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'returns signed_in?' do
|
139
|
+
allow(@warden).to receive(:user)
|
140
|
+
allow(@dummy).to receive(:current_user)
|
141
|
+
@dummy.signed_in?
|
142
|
+
expect(@warden).to have_received(:user)
|
143
|
+
expect(@dummy).not_to have_received(:current_user)
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'redirects when not signed_in' do
|
147
|
+
allow(@warden).to receive(:user).and_return(false)
|
148
|
+
@dummy.require_login
|
149
|
+
expect(@dummy.redirected).to eq(true)
|
150
|
+
expect(@dummy.redirected_to).to eq(Oath.config.no_login_redirect)
|
151
|
+
expect(@dummy.flash.notice).to eq(Oath.config.sign_in_notice.call)
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'does not redirect when signed_in' do
|
155
|
+
allow(@warden).to receive(:user).and_return(true)
|
156
|
+
@dummy.require_login
|
157
|
+
expect(@dummy.redirected).to eq(false)
|
158
|
+
end
|
159
|
+
|
160
|
+
it 'returns warden' do
|
161
|
+
expect(@dummy.warden).to eq @warden
|
162
|
+
end
|
163
|
+
|
164
|
+
def stub_sign_in(success = true)
|
165
|
+
user = double()
|
166
|
+
sign_in = double()
|
167
|
+
allow(sign_in).to receive(:perform).and_return(success)
|
168
|
+
allow(Services::SignIn).to receive(:new).with(user, @warden).and_return(sign_in)
|
169
|
+
user
|
170
|
+
end
|
171
|
+
|
172
|
+
def stub_sign_up(success = true)
|
173
|
+
user_params = double()
|
174
|
+
sign_up = double()
|
175
|
+
allow(sign_up).to receive(:perform).and_return(success)
|
176
|
+
allow(Services::SignUp).to receive(:new).with(user_params).and_return(sign_up)
|
177
|
+
user_params
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Oath
|
4
|
+
describe FieldMap do
|
5
|
+
it 'returns the params with symbolized keys without a field map' do
|
6
|
+
params = double()
|
7
|
+
allow(params).to receive(:inject).and_return(params)
|
8
|
+
field_map = FieldMap.new(params, nil)
|
9
|
+
expect(field_map.to_fields).to eq(params)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'returns mapped params with a field map' do
|
13
|
+
params = { email_or_username: 'foo' }
|
14
|
+
map = { email_or_username: [:email, :username] }
|
15
|
+
field_map = FieldMap.new(params, map)
|
16
|
+
expect(field_map.to_fields).to eq(["email = ? OR username = ?", 'foo', 'foo'])
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|