pillowfort 0.1.2 → 0.2.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.
- checksums.yaml +4 -4
- data/Rakefile +10 -0
- data/app/controllers/pillowfort/concerns/controller_activation.rb +27 -0
- data/app/controllers/pillowfort/concerns/controller_authentication.rb +2 -9
- data/app/models/pillowfort/concerns/model_activation.rb +84 -0
- data/app/models/pillowfort/concerns/model_authentication.rb +10 -25
- data/app/models/pillowfort/concerns/model_password_reset.rb +62 -0
- data/lib/pillowfort/controller_methods.rb +12 -0
- data/lib/pillowfort/model_finder.rb +7 -0
- data/lib/pillowfort/token_generator.rb +19 -0
- data/lib/pillowfort/version.rb +1 -1
- data/spec/{dummy/spec/controllers → controllers}/accounts_controller_spec.rb +19 -1
- data/spec/dummy/app/controllers/accounts_controller.rb +2 -0
- data/spec/dummy/app/models/account.rb +2 -0
- data/spec/dummy/config/database.yml +5 -1
- data/spec/dummy/config/environments/development.rb +42 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20150210215727_add_password_reset_tokens.rb +8 -0
- data/spec/dummy/db/migrate/20150211185152_add_activation_token_to_account.rb +9 -0
- data/spec/dummy/db/migrate/20150413161345_add_auth_token_ttl_to_account.rb +7 -0
- data/spec/dummy/db/schema.rb +9 -3
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/test.log +15233 -1641
- data/spec/dummy/spec/spec_helper.rb +1 -10
- data/spec/factories/accounts.rb +19 -0
- data/spec/models/account_spec.rb +531 -0
- data/spec/{dummy/spec/rails_helper.rb → rails_helper.rb} +1 -1
- data/spec/spec_helper.rb +25 -0
- data/spec/{dummy/spec/support → support}/helpers/authentication_helper.rb +0 -0
- metadata +62 -17
- data/spec/dummy/log/development.log +0 -0
- data/spec/dummy/spec/factories/accounts.rb +0 -10
- data/spec/dummy/spec/models/account_spec.rb +0 -276
@@ -1,7 +1,7 @@
|
|
1
1
|
# This file is copied to spec/ when you run 'rails generate rspec:install'
|
2
2
|
ENV["RAILS_ENV"] ||= 'test'
|
3
3
|
require 'spec_helper'
|
4
|
-
require File.expand_path("
|
4
|
+
require File.expand_path("../dummy/config/environment", __FILE__)
|
5
5
|
require 'rspec/rails'
|
6
6
|
require 'factory_girl_rails'
|
7
7
|
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
ENV['RAILS_ENV'] ||= 'test'
|
2
|
+
|
3
|
+
require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
4
|
+
|
5
|
+
require 'rspec/rails'
|
6
|
+
require 'rspec/autorun'
|
7
|
+
require 'factory_girl_rails'
|
8
|
+
require 'rspec/its'
|
9
|
+
|
10
|
+
Rails.backtrace_cleaner.remove_silencers!
|
11
|
+
|
12
|
+
# Load support files
|
13
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
14
|
+
|
15
|
+
RSpec.configure do |config|
|
16
|
+
config.mock_with :rspec
|
17
|
+
config.use_transactional_fixtures = true
|
18
|
+
config.infer_base_class_for_anonymous_controllers = false
|
19
|
+
config.expect_with :rspec do |expectations|
|
20
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
21
|
+
end
|
22
|
+
config.mock_with :rspec do |mocks|
|
23
|
+
mocks.verify_partial_doubles = true
|
24
|
+
end
|
25
|
+
end
|
File without changes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pillowfort
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Lowrimore
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec-its
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: factory_girl_rails
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +94,20 @@ dependencies:
|
|
80
94
|
- - ">="
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry-nav
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
83
111
|
description: Opinionated, session-less API authentication
|
84
112
|
email:
|
85
113
|
- tlowrimore@coroutine.com
|
@@ -89,15 +117,22 @@ extra_rdoc_files: []
|
|
89
117
|
files:
|
90
118
|
- MIT-LICENSE
|
91
119
|
- Rakefile
|
120
|
+
- app/controllers/pillowfort/concerns/controller_activation.rb
|
92
121
|
- app/controllers/pillowfort/concerns/controller_authentication.rb
|
122
|
+
- app/models/pillowfort/concerns/model_activation.rb
|
93
123
|
- app/models/pillowfort/concerns/model_authentication.rb
|
124
|
+
- app/models/pillowfort/concerns/model_password_reset.rb
|
94
125
|
- config/routes.rb
|
95
126
|
- lib/pillowfort.rb
|
127
|
+
- lib/pillowfort/controller_methods.rb
|
96
128
|
- lib/pillowfort/engine.rb
|
97
129
|
- lib/pillowfort/model_context.rb
|
130
|
+
- lib/pillowfort/model_finder.rb
|
98
131
|
- lib/pillowfort/pillow_fight.rb
|
132
|
+
- lib/pillowfort/token_generator.rb
|
99
133
|
- lib/pillowfort/version.rb
|
100
134
|
- lib/tasks/pillowfort_tasks.rake
|
135
|
+
- spec/controllers/accounts_controller_spec.rb
|
101
136
|
- spec/dummy/README.rdoc
|
102
137
|
- spec/dummy/Rakefile
|
103
138
|
- spec/dummy/app/assets/javascripts/accounts.js
|
@@ -121,6 +156,7 @@ files:
|
|
121
156
|
- spec/dummy/config/boot.rb
|
122
157
|
- spec/dummy/config/database.yml
|
123
158
|
- spec/dummy/config/environment.rb
|
159
|
+
- spec/dummy/config/environments/development.rb
|
124
160
|
- spec/dummy/config/environments/test.rb
|
125
161
|
- spec/dummy/config/initializers/assets.rb
|
126
162
|
- spec/dummy/config/initializers/backtrace_silencers.rb
|
@@ -133,21 +169,24 @@ files:
|
|
133
169
|
- spec/dummy/config/locales/en.yml
|
134
170
|
- spec/dummy/config/routes.rb
|
135
171
|
- spec/dummy/config/secrets.yml
|
172
|
+
- spec/dummy/db/development.sqlite3
|
136
173
|
- spec/dummy/db/migrate/20150127045508_create_accounts.rb
|
174
|
+
- spec/dummy/db/migrate/20150210215727_add_password_reset_tokens.rb
|
175
|
+
- spec/dummy/db/migrate/20150211185152_add_activation_token_to_account.rb
|
176
|
+
- spec/dummy/db/migrate/20150413161345_add_auth_token_ttl_to_account.rb
|
137
177
|
- spec/dummy/db/schema.rb
|
138
178
|
- spec/dummy/db/test.sqlite3
|
139
|
-
- spec/dummy/log/development.log
|
140
179
|
- spec/dummy/log/test.log
|
141
180
|
- spec/dummy/public/404.html
|
142
181
|
- spec/dummy/public/422.html
|
143
182
|
- spec/dummy/public/500.html
|
144
183
|
- spec/dummy/public/favicon.ico
|
145
|
-
- spec/dummy/spec/controllers/accounts_controller_spec.rb
|
146
|
-
- spec/dummy/spec/factories/accounts.rb
|
147
|
-
- spec/dummy/spec/models/account_spec.rb
|
148
|
-
- spec/dummy/spec/rails_helper.rb
|
149
184
|
- spec/dummy/spec/spec_helper.rb
|
150
|
-
- spec/
|
185
|
+
- spec/factories/accounts.rb
|
186
|
+
- spec/models/account_spec.rb
|
187
|
+
- spec/rails_helper.rb
|
188
|
+
- spec/spec_helper.rb
|
189
|
+
- spec/support/helpers/authentication_helper.rb
|
151
190
|
homepage: https://github.com/coroutine/pillowfort
|
152
191
|
licenses:
|
153
192
|
- MIT
|
@@ -158,9 +197,9 @@ require_paths:
|
|
158
197
|
- lib
|
159
198
|
required_ruby_version: !ruby/object:Gem::Requirement
|
160
199
|
requirements:
|
161
|
-
- - "
|
200
|
+
- - "~>"
|
162
201
|
- !ruby/object:Gem::Version
|
163
|
-
version:
|
202
|
+
version: 2.2.0
|
164
203
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
165
204
|
requirements:
|
166
205
|
- - ">="
|
@@ -168,11 +207,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
168
207
|
version: '0'
|
169
208
|
requirements: []
|
170
209
|
rubyforge_project:
|
171
|
-
rubygems_version: 2.4.
|
210
|
+
rubygems_version: 2.4.6
|
172
211
|
signing_key:
|
173
212
|
specification_version: 4
|
174
213
|
summary: Opinionated, session-less API authentication
|
175
214
|
test_files:
|
215
|
+
- spec/controllers/accounts_controller_spec.rb
|
176
216
|
- spec/dummy/app/assets/javascripts/accounts.js
|
177
217
|
- spec/dummy/app/assets/javascripts/application.js
|
178
218
|
- spec/dummy/app/assets/stylesheets/accounts.css
|
@@ -193,6 +233,7 @@ test_files:
|
|
193
233
|
- spec/dummy/config/boot.rb
|
194
234
|
- spec/dummy/config/database.yml
|
195
235
|
- spec/dummy/config/environment.rb
|
236
|
+
- spec/dummy/config/environments/development.rb
|
196
237
|
- spec/dummy/config/environments/test.rb
|
197
238
|
- spec/dummy/config/initializers/assets.rb
|
198
239
|
- spec/dummy/config/initializers/backtrace_silencers.rb
|
@@ -206,10 +247,13 @@ test_files:
|
|
206
247
|
- spec/dummy/config/routes.rb
|
207
248
|
- spec/dummy/config/secrets.yml
|
208
249
|
- spec/dummy/config.ru
|
250
|
+
- spec/dummy/db/development.sqlite3
|
209
251
|
- spec/dummy/db/migrate/20150127045508_create_accounts.rb
|
252
|
+
- spec/dummy/db/migrate/20150210215727_add_password_reset_tokens.rb
|
253
|
+
- spec/dummy/db/migrate/20150211185152_add_activation_token_to_account.rb
|
254
|
+
- spec/dummy/db/migrate/20150413161345_add_auth_token_ttl_to_account.rb
|
210
255
|
- spec/dummy/db/schema.rb
|
211
256
|
- spec/dummy/db/test.sqlite3
|
212
|
-
- spec/dummy/log/development.log
|
213
257
|
- spec/dummy/log/test.log
|
214
258
|
- spec/dummy/public/404.html
|
215
259
|
- spec/dummy/public/422.html
|
@@ -217,9 +261,10 @@ test_files:
|
|
217
261
|
- spec/dummy/public/favicon.ico
|
218
262
|
- spec/dummy/Rakefile
|
219
263
|
- spec/dummy/README.rdoc
|
220
|
-
- spec/dummy/spec/controllers/accounts_controller_spec.rb
|
221
|
-
- spec/dummy/spec/factories/accounts.rb
|
222
|
-
- spec/dummy/spec/models/account_spec.rb
|
223
|
-
- spec/dummy/spec/rails_helper.rb
|
224
264
|
- spec/dummy/spec/spec_helper.rb
|
225
|
-
- spec/
|
265
|
+
- spec/factories/accounts.rb
|
266
|
+
- spec/models/account_spec.rb
|
267
|
+
- spec/rails_helper.rb
|
268
|
+
- spec/spec_helper.rb
|
269
|
+
- spec/support/helpers/authentication_helper.rb
|
270
|
+
has_rdoc:
|
File without changes
|
@@ -1,276 +0,0 @@
|
|
1
|
-
require 'rails_helper'
|
2
|
-
|
3
|
-
# ------------------------------------------------------------------------------
|
4
|
-
# Shared Examples
|
5
|
-
# ------------------------------------------------------------------------------
|
6
|
-
|
7
|
-
RSpec.shared_examples 'an auth token resetter' do
|
8
|
-
describe 'its affect on the auth_token' do
|
9
|
-
subject { account.auth_token }
|
10
|
-
|
11
|
-
describe 'before the call' do
|
12
|
-
it { should eq(auth_token) }
|
13
|
-
end
|
14
|
-
|
15
|
-
describe 'after the call' do
|
16
|
-
before { call_the_method }
|
17
|
-
it { should_not eq(auth_token) }
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
describe 'its affect on the auth_token_expires_at' do
|
22
|
-
subject { account.auth_token_expires_at }
|
23
|
-
|
24
|
-
describe 'before the call' do
|
25
|
-
it { should eq(auth_token_expires_at) }
|
26
|
-
end
|
27
|
-
|
28
|
-
describe 'after the call' do
|
29
|
-
before { call_the_method }
|
30
|
-
it { should be > auth_token_expires_at }
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
# ------------------------------------------------------------------------------
|
36
|
-
# The Spec!
|
37
|
-
# ------------------------------------------------------------------------------
|
38
|
-
|
39
|
-
RSpec.describe Account, :type => :model do
|
40
|
-
|
41
|
-
describe 'its validations' do
|
42
|
-
before { account.save }
|
43
|
-
subject { account.errors.messages }
|
44
|
-
|
45
|
-
describe 'email validations' do
|
46
|
-
let(:account) { FactoryGirl.build(:account, email: email) }
|
47
|
-
|
48
|
-
context 'presence_of' do
|
49
|
-
let(:email) { nil }
|
50
|
-
|
51
|
-
it { should include(email: ["can't be blank"]) }
|
52
|
-
end
|
53
|
-
|
54
|
-
context 'uniqueness' do
|
55
|
-
let(:email) { 'foobar@baz.com' }
|
56
|
-
let(:dup_account) { FactoryGirl.build(:account, email: email) }
|
57
|
-
before { dup_account.save }
|
58
|
-
subject { dup_account.errors.messages}
|
59
|
-
|
60
|
-
it { should include(email: ["has already been taken"]) }
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
describe 'password validations' do
|
65
|
-
let(:account) { FactoryGirl.build(:account, password: password) }
|
66
|
-
|
67
|
-
context 'presence_of' do
|
68
|
-
let(:password) { nil }
|
69
|
-
|
70
|
-
it { should include(password: [/can't be blank/, /is too short/]) }
|
71
|
-
end
|
72
|
-
|
73
|
-
context 'length of' do
|
74
|
-
context "when it's too short" do
|
75
|
-
let(:password) { "x"*3 }
|
76
|
-
|
77
|
-
it { should include(password: [/is too short/])}
|
78
|
-
end
|
79
|
-
|
80
|
-
context "when it's too long" do
|
81
|
-
let(:password) { "x"*80 }
|
82
|
-
|
83
|
-
it { should include(password: [/is too long/])}
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
describe 'the instance methods' do
|
90
|
-
let(:account) {
|
91
|
-
FactoryGirl.create :account,
|
92
|
-
auth_token: auth_token,
|
93
|
-
auth_token_expires_at: auth_token_expires_at
|
94
|
-
}
|
95
|
-
|
96
|
-
let(:auth_token) { 'abc123def456' }
|
97
|
-
let(:auth_token_expires_at) { 1.day.from_now }
|
98
|
-
|
99
|
-
describe '#ensure_auth_token' do
|
100
|
-
subject { account.auth_token }
|
101
|
-
before { account.ensure_auth_token }
|
102
|
-
|
103
|
-
context 'when the token is nil' do
|
104
|
-
let(:auth_token) { nil }
|
105
|
-
it { should_not be_nil }
|
106
|
-
end
|
107
|
-
|
108
|
-
context 'when the token is not nil' do
|
109
|
-
let(:auth_token) { 'deadbeef' }
|
110
|
-
it { should eq('deadbeef') }
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
describe '#reset_auth_token' do
|
115
|
-
let(:call_the_method) { account.reset_auth_token }
|
116
|
-
it_behaves_like 'an auth token resetter'
|
117
|
-
|
118
|
-
describe 'its persistence' do
|
119
|
-
subject { account }
|
120
|
-
after { call_the_method }
|
121
|
-
it { should_not receive(:save) }
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
describe '#reset_auth_token!' do
|
126
|
-
let(:call_the_method) { account.reset_auth_token! }
|
127
|
-
it_behaves_like 'an auth token resetter'
|
128
|
-
|
129
|
-
describe 'its persistence' do
|
130
|
-
subject { account }
|
131
|
-
after { call_the_method }
|
132
|
-
it { should receive(:save) }
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
describe '#token_expired?' do
|
137
|
-
subject { account.token_expired? }
|
138
|
-
|
139
|
-
context 'when the token expiration is in the future' do
|
140
|
-
let(:auth_token_expires_at) { 1.minute.from_now }
|
141
|
-
it { should be_falsey }
|
142
|
-
end
|
143
|
-
|
144
|
-
context 'when the token expiration is in the past' do
|
145
|
-
let(:auth_token_expires_at) { 1.minute.ago }
|
146
|
-
it { should be_truthy }
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
describe '#password=' do
|
151
|
-
let!(:current_password) { account.password.to_s }
|
152
|
-
subject { account.password.to_s }
|
153
|
-
|
154
|
-
describe 'before the call' do
|
155
|
-
it { should == (current_password) }
|
156
|
-
end
|
157
|
-
|
158
|
-
describe 'after the call' do
|
159
|
-
before { account.password = 'fudge_knuckles_45' }
|
160
|
-
it { should_not eq(current_password) }
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
describe 'the class methods' do
|
166
|
-
let(:email) { 'foobar@baz.com' }
|
167
|
-
let(:token) { 'deadbeef' }
|
168
|
-
let(:password) { 'admin4lolz' }
|
169
|
-
let(:auth_token_expires_at) { 1.day.from_now }
|
170
|
-
|
171
|
-
let!(:account) {
|
172
|
-
FactoryGirl.create :account,
|
173
|
-
email: email,
|
174
|
-
auth_token: token,
|
175
|
-
password: password,
|
176
|
-
auth_token_expires_at: auth_token_expires_at
|
177
|
-
}
|
178
|
-
|
179
|
-
describe '.authenticate_securely' do
|
180
|
-
let(:email_param) { email }
|
181
|
-
let(:token_param) { token }
|
182
|
-
let(:block) { ->(resource) {} }
|
183
|
-
|
184
|
-
subject { Account.authenticate_securely(email_param, token_param, &block) }
|
185
|
-
|
186
|
-
context 'when email is nil' do
|
187
|
-
let(:email_param) { nil }
|
188
|
-
it { should be_falsey }
|
189
|
-
end
|
190
|
-
|
191
|
-
context 'when token is nil' do
|
192
|
-
let(:token_param) { nil }
|
193
|
-
it { should be_falsey }
|
194
|
-
end
|
195
|
-
|
196
|
-
context 'when email and token are provided' do
|
197
|
-
|
198
|
-
context 'email case-sensitivity' do
|
199
|
-
describe 'when an uppercased email address is provided' do
|
200
|
-
let(:email_param) { email.upcase }
|
201
|
-
|
202
|
-
it 'should yield the matched account' do
|
203
|
-
expect { |b| Account.authenticate_securely(email_param, token_param, &b) }.to yield_with_args(account)
|
204
|
-
end
|
205
|
-
end
|
206
|
-
|
207
|
-
describe 'when a downcased email address is provided' do
|
208
|
-
let(:email_param) { email.downcase }
|
209
|
-
|
210
|
-
it 'should yield the matched account' do
|
211
|
-
expect { |b| Account.authenticate_securely(email_param, token_param, &b) }.to yield_with_args(account)
|
212
|
-
end
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
context 'when the resource is located' do
|
217
|
-
|
218
|
-
context 'when the auth_token is expired' do
|
219
|
-
let(:auth_token_expires_at) { 1.week.ago }
|
220
|
-
|
221
|
-
it 'should reset the account auth_token' do
|
222
|
-
allow(Account).to receive(:find_by_email_case_insensitive) { account }
|
223
|
-
expect(account).to receive(:reset_auth_token!)
|
224
|
-
subject
|
225
|
-
end
|
226
|
-
|
227
|
-
it { should be_falsey }
|
228
|
-
end
|
229
|
-
|
230
|
-
context 'when the auth_token is current' do
|
231
|
-
|
232
|
-
context 'when the auth_token matches' do
|
233
|
-
it 'should yield the matched account' do
|
234
|
-
expect { |b| Account.authenticate_securely(email_param, token_param, &b) }.to yield_with_args(account)
|
235
|
-
end
|
236
|
-
end
|
237
|
-
|
238
|
-
context 'when the auth_token does not match' do
|
239
|
-
it { should be_falsey }
|
240
|
-
end
|
241
|
-
end
|
242
|
-
end
|
243
|
-
|
244
|
-
context 'when the resource is not located' do
|
245
|
-
it { should be_falsey }
|
246
|
-
end
|
247
|
-
|
248
|
-
end
|
249
|
-
end
|
250
|
-
|
251
|
-
describe '.find_and_authenticate' do
|
252
|
-
let(:email_param) { email }
|
253
|
-
let(:password_param) { password }
|
254
|
-
|
255
|
-
subject { Account.find_and_authenticate(email_param, password_param) }
|
256
|
-
|
257
|
-
|
258
|
-
context 'when the resource is located' do
|
259
|
-
|
260
|
-
context 'when the password matches' do
|
261
|
-
it { should eq(account) }
|
262
|
-
end
|
263
|
-
|
264
|
-
context 'when the password does not match' do
|
265
|
-
let(:password_param) { "#{password}_bad" }
|
266
|
-
it { should be_falsey }
|
267
|
-
end
|
268
|
-
end
|
269
|
-
|
270
|
-
context 'when the resource is not located' do
|
271
|
-
let(:email_param) { "#{email}_evil" }
|
272
|
-
it { should be_falsey }
|
273
|
-
end
|
274
|
-
end
|
275
|
-
end
|
276
|
-
end
|