mori 0.0.1 → 0.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 +4 -4
- data/MIT-LICENSE +1 -1
- data/README.md +51 -1
- data/Rakefile +1 -0
- data/app/controllers/mori/base_controller.rb +3 -0
- data/app/controllers/mori/invites_controller.rb +37 -0
- data/app/controllers/mori/passwords_controller.rb +59 -0
- data/app/controllers/mori/registrations_controller.rb +32 -7
- data/app/controllers/mori/sessions_controller.rb +10 -6
- data/app/helpers/mori_helper.rb +1 -1
- data/app/mailers/mori_mailer.rb +18 -0
- data/app/views/invites/new.html.erb +1 -0
- data/app/views/invites/show.html.erb +1 -0
- data/app/views/layouts/mori/application.html.erb +7 -1
- data/app/views/layouts/mori/form.html.erb +15 -0
- data/app/views/mori_forms/_accept_invite.html.erb +16 -0
- data/app/views/mori_forms/_change_password.html.erb +22 -0
- data/app/views/mori_forms/_forgot_password.html.erb +14 -0
- data/app/views/mori_forms/_invite_new_user_form.html.erb +14 -0
- data/app/views/mori_forms/_password_reset.html.erb +20 -0
- data/app/views/mori_forms/_registration.html.erb +22 -0
- data/app/views/mori_forms/_sessions.html.erb +18 -0
- data/app/views/mori_mailer/confirm_email.html.erb +4 -0
- data/app/views/mori_mailer/forgot_password.html.erb +7 -0
- data/app/views/mori_mailer/invite_user.html.erb +5 -0
- data/app/views/passwords/change.html.erb +1 -0
- data/app/views/passwords/forgot.html.erb +2 -0
- data/app/views/passwords/reset.html.erb +1 -0
- data/app/views/passwords/send_reset.html.erb +1 -0
- data/app/views/registrations/new.html.erb +2 -0
- data/app/views/sessions/new.html.erb +2 -0
- data/app/views/shared/_links.html.erb +11 -0
- data/config/database.travis.yml +3 -25
- data/config/initializers/warden.rb +5 -5
- data/config/locales/mori.en.yml +20 -16
- data/config/routes.rb +22 -2
- data/db/migrate/20140128055658_create_users.rb +29 -0
- data/lib/assets/javascripts/bootstrap.min.js +6 -0
- data/lib/assets/stylesheets/bootstrap.min.css +7 -0
- data/lib/generators/mori/install/install_generator.rb +130 -0
- data/lib/generators/mori/install/templates/db/migrate/add_mori_to_users.rb +23 -0
- data/{db/migrate/20140128055658_create_mori_users.rb → lib/generators/mori/install/templates/db/migrate/create_users.rb} +6 -9
- data/lib/generators/mori/install/templates/mori.rb +32 -0
- data/lib/generators/mori/install/templates/user.rb +3 -0
- data/lib/generators/mori/views/USAGE +12 -0
- data/lib/generators/mori/views/views_generator.rb +39 -0
- data/lib/mori/configuration.rb +17 -10
- data/lib/mori/controller.rb +25 -0
- data/lib/mori/engine.rb +2 -6
- data/lib/mori/password.rb +21 -0
- data/lib/mori/token.rb +3 -12
- data/lib/mori/user.rb +124 -0
- data/lib/mori/version.rb +1 -1
- data/lib/mori.rb +3 -3
- data/spec/dummy/app/assets/javascripts/application.js +2 -0
- data/spec/dummy/app/controllers/application_controller.rb +1 -0
- data/spec/dummy/app/models/user.rb +4 -0
- data/spec/dummy/app/views/application/index.html.erb +13 -0
- data/spec/dummy/app/views/application/test_login.html.erb +1 -0
- data/spec/dummy/app/views/layouts/application.html.erb +2 -2
- data/spec/dummy/config/application.rb +9 -7
- data/spec/dummy/config/database.yml +6 -24
- data/spec/dummy/config/environments/production.rb +2 -2
- data/spec/dummy/config/environments/test.rb +3 -3
- data/spec/dummy/config/initializers/mime_types.rb +2 -2
- data/spec/dummy/config/initializers/mori.rb +12 -1
- data/spec/dummy/config/initializers/secret_token.rb +6 -1
- data/spec/dummy/config/locales/en.yml +1 -1
- data/spec/dummy/config/routes.rb +2 -1
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/{20140209071716_create_users.mori_engine.rb → 20140421045106_create_users.mori_engine.rb} +2 -6
- data/spec/dummy/db/schema.rb +14 -21
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +14442 -21478
- data/spec/dummy/log/test.log +128933 -76950
- data/spec/dummy/public/404.html +1 -1
- data/spec/dummy/public/422.html +1 -1
- data/spec/dummy/public/500.html +1 -1
- data/spec/dummy/tmp/cache/assets/development/sprockets/07db4022ed50ebf1535599a3e2344037 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/09f817f5fe8888d5c59a3b285c3ef605 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/19f899de0e04ccfd931a7a11e36aca13 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/1b98ef3337306536c2890a74951d225c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2000a2ad47f8e201455b785beb7b1384 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/22de1150643c428d3f508171d74347a3 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3453364cd811fec54cae0a92adc719e4 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/4462cfec451130aa58d88b3da13913c3 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/45753608d28d02693f8f6277074589a1 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/56b349da612a4be9d5e6733778ce17e4 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/5b3ef4ce70e1da7b1afd392754613726 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/770ff8b64985dd08cab8c32a1fa76438 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/8e4cef792c949716da8fe3e9ee0cda70 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a6374c002de146da5c25b8cfd375ce6c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/b085c718dd9381a5d4036f00b47d1b91 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/c207a30f2b33f7df2c5336aed05485a2 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/cf4d7483cd5aff334d69dd3173f9b953 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/e2b0bfc208732a6cf47d67c1be32e54f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/07db4022ed50ebf1535599a3e2344037 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/09f817f5fe8888d5c59a3b285c3ef605 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/1143c7a241c19613744d1a2be3ad7cd1 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/19f899de0e04ccfd931a7a11e36aca13 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/1b98ef3337306536c2890a74951d225c +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/39cd89cab4906d24583c876a477cf098 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/4462cfec451130aa58d88b3da13913c3 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/45753608d28d02693f8f6277074589a1 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/56b349da612a4be9d5e6733778ce17e4 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/5b3ef4ce70e1da7b1afd392754613726 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/770ff8b64985dd08cab8c32a1fa76438 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/8e4cef792c949716da8fe3e9ee0cda70 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/9d5b4060cdb29606bd153ef2ca742a22 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/a6374c002de146da5c25b8cfd375ce6c +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/b085c718dd9381a5d4036f00b47d1b91 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/c1fb58de0c271425746c77af9e101750 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/c207a30f2b33f7df2c5336aed05485a2 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/e2b0bfc208732a6cf47d67c1be32e54f +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/factories/mori_users.rb +8 -8
- data/spec/features/invites_spec.rb +64 -0
- data/spec/features/passwords_spec.rb +101 -0
- data/spec/features/registrations_spec.rb +37 -10
- data/spec/features/sessions_spec.rb +24 -28
- data/spec/helpers/mori_helper_spec.rb +3 -12
- data/spec/helpers.rb +10 -0
- data/spec/mailers/mori/mailer_spec.rb +24 -4
- data/spec/models/mori/user_spec.rb +187 -167
- data/spec/spec_helper.rb +17 -6
- metadata +108 -53
- data/app/assets/javascripts/mori/application.js +0 -13
- data/app/assets/stylesheets/mori/application.css +0 -13
- data/app/controllers/mori_controller.rb +0 -8
- data/app/mailers/mori/mailer.rb +0 -17
- data/app/models/mori/user.rb +0 -85
- data/app/views/mori/mailer/confirm_email.html.erb +0 -1
- data/app/views/mori/mailer/invite_user.html.erb +0 -1
- data/app/views/mori/mailer/password_reset_notification.html.erb +0 -1
- data/app/views/mori/registrations/new.slim +0 -9
- data/app/views/mori/sessions/new.slim +0 -8
- data/db/migrate/20140126052000_enable_hstore.rb +0 -9
- data/lib/mori/string.rb +0 -20
- data/spec/dummy/app/views/application/index.slim +0 -2
- data/spec/dummy/db/migrate/20140128055553_enable_hstore.mori.rb +0 -10
- data/spec/dummy/log/user.log +0 -43
- data/spec/dummy/tmp/pids/server.pid +0 -1
- data/spec/mailer_matcher.rb +0 -33
- data/spec/views/mori/registrations/create.html.erb_spec.rb +0 -5
- data/spec/views/mori/registrations/new.html.erb_spec.rb +0 -5
- data/spec/views/mori/sessions/create.html.erb_spec.rb +0 -5
- data/spec/views/mori/sessions/destroy.html.erb_spec.rb +0 -5
- data/spec/views/mori/sessions/new.html.erb_spec.rb +0 -5
data/spec/dummy/public/404.html
CHANGED
data/spec/dummy/public/422.html
CHANGED
data/spec/dummy/public/500.html
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
# Read about factories at https://github.com/thoughtbot/factory_girl
|
|
2
2
|
|
|
3
3
|
FactoryGirl.define do
|
|
4
|
-
factory :mori_minimal_user, :class => '
|
|
5
|
-
email
|
|
6
|
-
password
|
|
4
|
+
factory :mori_minimal_user, :class => 'User' do
|
|
5
|
+
email 'email@example.com'
|
|
6
|
+
password '123456789sdf'
|
|
7
7
|
end
|
|
8
|
-
factory :mori_invited_user, :class => '
|
|
9
|
-
email
|
|
10
|
-
invitation_token
|
|
8
|
+
factory :mori_invited_user, :class => 'User' do
|
|
9
|
+
email 'email@example.com'
|
|
10
|
+
invitation_token 'sdflkjadfsd24rec2'
|
|
11
11
|
end
|
|
12
|
-
factory :mori_random_user, :class => '
|
|
12
|
+
factory :mori_random_user, :class => 'User' do
|
|
13
13
|
email Faker::Internet.email
|
|
14
|
-
password
|
|
14
|
+
password 'password'
|
|
15
15
|
end
|
|
16
16
|
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe 'Inviting Users', :type => :feature do
|
|
4
|
+
before(:each) do
|
|
5
|
+
@user = create(:mori_minimal_user, :password => 'password123')
|
|
6
|
+
end
|
|
7
|
+
describe 'Sending an invite' do
|
|
8
|
+
it 'should require you to be logged in' do
|
|
9
|
+
visit '/invites/new'
|
|
10
|
+
page.has_content?('Log In').should eq true
|
|
11
|
+
end
|
|
12
|
+
it 'should not invite a user that already exists' do
|
|
13
|
+
log_in(@user.email, 'password123')
|
|
14
|
+
visit '/invites/new'
|
|
15
|
+
within(:css, '#invite_new_user_form') do
|
|
16
|
+
fill_in 'E-mail', :with => @user.email
|
|
17
|
+
click_button 'Invite User'
|
|
18
|
+
end
|
|
19
|
+
page.has_content?(I18n.t('flashes.could_not_invite_user')).should eq true
|
|
20
|
+
end
|
|
21
|
+
it 'should send an invite' do
|
|
22
|
+
log_in(@user.email, 'password123')
|
|
23
|
+
visit '/invites/new'
|
|
24
|
+
MoriMailer.should_receive(:invite_user).exactly(1).times
|
|
25
|
+
within(:css, '#invite_new_user_form') do
|
|
26
|
+
fill_in 'E-mail', :with => 'imanewemail@email.com'
|
|
27
|
+
click_button 'Invite User'
|
|
28
|
+
end
|
|
29
|
+
page.current_path.should eq Mori.configuration.dashboard_path
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
describe 'Accepting an invite' do
|
|
33
|
+
before(:each) do
|
|
34
|
+
_valid, message = Mori.configuration.user_model.invite('new_email@email.com')
|
|
35
|
+
@user = User.find_by_email('new_email@email.com')
|
|
36
|
+
end
|
|
37
|
+
it 'should redirect to the homepage if the invite token is not found' do
|
|
38
|
+
visit '/invites/asd234fdsasd234'
|
|
39
|
+
page.current_path.should eq root_path
|
|
40
|
+
end
|
|
41
|
+
it 'should redirect to the invites path if validation fails' do
|
|
42
|
+
visit "/invites/#{@user.invitation_token}"
|
|
43
|
+
User.should_receive(:accept_invitation).exactly(1).times.and_call_original
|
|
44
|
+
within(:css, '.edit_user') do
|
|
45
|
+
fill_in 'Password', :with => 'passwoasdfasdfasdasdf'
|
|
46
|
+
fill_in 'Password confirmation', :with => 'password123'
|
|
47
|
+
end
|
|
48
|
+
click_button 'Accept'
|
|
49
|
+
page.current_path.should eq "/invites/#{@user.invitation_token}"
|
|
50
|
+
page.has_content?(I18n.t('flashes.passwords_dont_match')).should eq true
|
|
51
|
+
end
|
|
52
|
+
it 'should accept the invite and log the new user in' do
|
|
53
|
+
visit "/invites/#{@user.invitation_token}"
|
|
54
|
+
User.should_receive(:accept_invitation).exactly(1).times.and_call_original
|
|
55
|
+
within(:css, '.edit_user') do
|
|
56
|
+
fill_in 'Password', :with => 'password123'
|
|
57
|
+
fill_in 'Password confirmation', :with => 'password123'
|
|
58
|
+
end
|
|
59
|
+
click_button 'Accept'
|
|
60
|
+
page.current_path.should eq Mori.configuration.dashboard_path
|
|
61
|
+
page.has_content?(I18n.t('flashes.logged_in')).should be true
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe 'Password Management', :type => :feature do
|
|
4
|
+
before(:each) do
|
|
5
|
+
@user = create(:mori_minimal_user, :password => 'password123')
|
|
6
|
+
end
|
|
7
|
+
describe 'Resetting/Forgetting your Password' do
|
|
8
|
+
it 'when you submit a forgotten password' do
|
|
9
|
+
MoriMailer.should_receive(:forgot_password).exactly(1).times.and_call_original
|
|
10
|
+
visit '/passwords/forgot'
|
|
11
|
+
within '#forgot_password_form' do
|
|
12
|
+
fill_in 'email', :with => @user.email
|
|
13
|
+
end
|
|
14
|
+
click_button 'Reset Password'
|
|
15
|
+
current_url.should eq send_reset_passwords_url
|
|
16
|
+
page.has_content?('Password Reset Sent').should be true
|
|
17
|
+
end
|
|
18
|
+
it 'shouldn\'t send a forgotten password for a user that doesn\'t exist' do
|
|
19
|
+
visit '/passwords/forgot'
|
|
20
|
+
within '#forgot_password_form' do
|
|
21
|
+
fill_in 'email', :with => 'imaemail@email.com'
|
|
22
|
+
end
|
|
23
|
+
click_button 'Reset Password'
|
|
24
|
+
page.has_content?('Reset My Password').should be true
|
|
25
|
+
end
|
|
26
|
+
it 'should change a users password when they go to the link from the email' do
|
|
27
|
+
Mori.configuration.user_model.forgot_password(@user.email)
|
|
28
|
+
user = Mori.configuration.user_model.find_by_email(@user.email)
|
|
29
|
+
visit "/passwords/reset?token=#{user.password_reset_token}"
|
|
30
|
+
within '.edit_user' do
|
|
31
|
+
fill_in 'user_password', :with => 'password123'
|
|
32
|
+
fill_in 'user_password_confirmation', :with => 'password123'
|
|
33
|
+
end
|
|
34
|
+
click_button 'Update Password'
|
|
35
|
+
page.current_path.should eq Mori.configuration.dashboard_path
|
|
36
|
+
end
|
|
37
|
+
it 'should render the reset form again if the change failed' do
|
|
38
|
+
Timecop.freeze(Date.today - 3.weeks) do
|
|
39
|
+
Mori.configuration.user_model.forgot_password(@user.email)
|
|
40
|
+
end
|
|
41
|
+
user = Mori.configuration.user_model.find_by_email(@user.email)
|
|
42
|
+
visit "/passwords/reset?token=#{user.password_reset_token}"
|
|
43
|
+
within '.edit_user' do
|
|
44
|
+
fill_in 'user_password', :with => 'password123'
|
|
45
|
+
fill_in 'user_password_confirmation', :with => 'password123'
|
|
46
|
+
end
|
|
47
|
+
click_button 'Update Password'
|
|
48
|
+
page.has_content?('Expired Reset Token').should be true
|
|
49
|
+
end
|
|
50
|
+
it 'should redirect if no user is found' do
|
|
51
|
+
visit '/passwords/reset?token=123asdf123'
|
|
52
|
+
page.current_path.should eq root_path
|
|
53
|
+
end
|
|
54
|
+
it 'should redirect if I\'m already logged in' do
|
|
55
|
+
log_in(@user.email, 'password123')
|
|
56
|
+
visit '/passwords/forgot'
|
|
57
|
+
page.current_path.should eq Mori.configuration.dashboard_path
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
describe 'Changing your Password' do
|
|
61
|
+
it 'should require you to be logged in' do
|
|
62
|
+
visit '/passwords/change'
|
|
63
|
+
page.has_content?('Log In').should be true
|
|
64
|
+
end
|
|
65
|
+
it 'should change a users password' do
|
|
66
|
+
new_pass = 'potato'
|
|
67
|
+
log_in(@user.email, 'password123')
|
|
68
|
+
visit '/passwords/change'
|
|
69
|
+
within '#password_change_form' do
|
|
70
|
+
fill_in 'password', :with => 'password123'
|
|
71
|
+
fill_in 'new_password', :with => new_pass
|
|
72
|
+
fill_in 'new_password_confirmation', :with => new_pass
|
|
73
|
+
end
|
|
74
|
+
click_button 'Change Password'
|
|
75
|
+
::BCrypt::Password.new(Mori.configuration.user_model.find(@user.id).password).should eq new_pass
|
|
76
|
+
current_path.should eq Mori.configuration.dashboard_path
|
|
77
|
+
end
|
|
78
|
+
it 'should fail if the current password is not correct' do
|
|
79
|
+
log_in(@user.email, 'password123')
|
|
80
|
+
visit '/passwords/change'
|
|
81
|
+
within '#password_change_form' do
|
|
82
|
+
fill_in 'password', :with => 'passw123'
|
|
83
|
+
fill_in 'new_password', :with => 'pass'
|
|
84
|
+
fill_in 'new_password_confirmation', :with => 'pass'
|
|
85
|
+
end
|
|
86
|
+
click_button 'Change Password'
|
|
87
|
+
page.has_content?(I18n.t('flashes.password_change_failed')).should be true
|
|
88
|
+
end
|
|
89
|
+
it 'should fail when the password confirmations don\'t match' do
|
|
90
|
+
log_in(@user.email, 'password123')
|
|
91
|
+
visit '/passwords/change'
|
|
92
|
+
within '#password_change_form' do
|
|
93
|
+
fill_in 'password', :with => 'password123'
|
|
94
|
+
fill_in 'new_password', :with => 'potato'
|
|
95
|
+
fill_in 'new_password_confirmation', :with => 'potatwo'
|
|
96
|
+
end
|
|
97
|
+
click_button 'Change Password'
|
|
98
|
+
page.has_content?(I18n.t('flashes.passwords_did_not_match')).should be true
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
@@ -1,23 +1,50 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
|
-
describe
|
|
4
|
-
it
|
|
3
|
+
describe 'The registration process', :type => :feature do
|
|
4
|
+
it 'should be able to register' do
|
|
5
5
|
visit '/sign_up'
|
|
6
|
-
within('#
|
|
6
|
+
within('#new_user') do
|
|
7
7
|
fill_in 'Email', :with => Faker::Internet.email
|
|
8
|
-
fill_in 'Password', :with =>
|
|
8
|
+
fill_in 'Password', :with => 'imapassword123'
|
|
9
9
|
end
|
|
10
|
-
click_button '
|
|
11
|
-
current_path.should eq Mori.configuration.
|
|
10
|
+
click_button 'Sign Up'
|
|
11
|
+
current_path.should eq Mori.configuration.after_sign_up_path
|
|
12
12
|
end
|
|
13
|
-
it
|
|
13
|
+
it 'should redirect them if already signed up' do
|
|
14
14
|
visit '/sign_up'
|
|
15
|
-
within '#
|
|
15
|
+
within '#new_user' do
|
|
16
16
|
fill_in 'Email', :with => Faker::Internet.email
|
|
17
17
|
fill_in 'Password', :with => 'password123'
|
|
18
18
|
end
|
|
19
|
-
click_button '
|
|
19
|
+
click_button 'Sign Up'
|
|
20
20
|
visit '/sign_up'
|
|
21
|
-
current_path.should eq Mori.configuration.
|
|
21
|
+
current_path.should eq Mori.configuration.after_sign_up_path
|
|
22
|
+
end
|
|
23
|
+
it 'should not allow invalid credentials' do
|
|
24
|
+
visit '/sign_up'
|
|
25
|
+
within('#new_user') do
|
|
26
|
+
fill_in 'Email', :with => 'namenamename'
|
|
27
|
+
fill_in 'Password', :with => 'imapassword123'
|
|
28
|
+
end
|
|
29
|
+
click_button 'Sign Up'
|
|
30
|
+
current_path.should eq '/registrations'
|
|
31
|
+
end
|
|
32
|
+
describe 'confirming your email' do
|
|
33
|
+
before :each do
|
|
34
|
+
@user = create(:mori_minimal_user)
|
|
35
|
+
end
|
|
36
|
+
it 'should confirm their email' do
|
|
37
|
+
visit "/registrations/confirmation?token=#{@user.confirmation_token}"
|
|
38
|
+
@user.reload.confirmed.should eq true
|
|
39
|
+
current_path.should eq Mori.configuration.dashboard_path
|
|
40
|
+
end
|
|
41
|
+
it 'should redirect if confirmation is not found' do
|
|
42
|
+
visit '/registrations/confirmation?token=123123'
|
|
43
|
+
current_path.should eq root_path
|
|
44
|
+
end
|
|
45
|
+
it 'should redirect if no confirmation token' do
|
|
46
|
+
visit '/registrations/confirmation'
|
|
47
|
+
current_path.should eq root_path
|
|
48
|
+
end
|
|
22
49
|
end
|
|
23
50
|
end
|
|
@@ -1,31 +1,27 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
|
-
describe
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
click_link 'Log Out'
|
|
28
|
-
visit '/login'
|
|
29
|
-
current_path.should eq '/login'
|
|
30
|
-
end
|
|
3
|
+
describe 'Sessions controller', :type => :feature do
|
|
4
|
+
let(:password) { 'password123' }
|
|
5
|
+
before :each do
|
|
6
|
+
@user = create(:mori_random_user, :password => 'password123')
|
|
7
|
+
end
|
|
8
|
+
it 'should be able to log in' do
|
|
9
|
+
log_in(@user.email, password)
|
|
10
|
+
current_path.should eq Mori.configuration.dashboard_path
|
|
11
|
+
end
|
|
12
|
+
it 'should redirect to the after login url if already logged in' do
|
|
13
|
+
log_in(@user.email, password)
|
|
14
|
+
visit '/login'
|
|
15
|
+
current_path.should eq Mori.configuration.dashboard_path
|
|
16
|
+
end
|
|
17
|
+
it 'should not log in with invalid credentials' do
|
|
18
|
+
log_in(@user.email, 'imapassword!')
|
|
19
|
+
current_path.should eq '/sessions'
|
|
20
|
+
end
|
|
21
|
+
it 'should be able to log out' do
|
|
22
|
+
log_in(@user.email, password)
|
|
23
|
+
click_link 'Log Out'
|
|
24
|
+
visit '/login'
|
|
25
|
+
current_path.should eq '/login'
|
|
26
|
+
end
|
|
31
27
|
end
|
|
@@ -1,15 +1,6 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
# Specs in this file have access to a helper object that includes
|
|
4
|
-
# the MoriHelper. For example:
|
|
5
|
-
#
|
|
6
|
-
# describe MoriHelper do
|
|
7
|
-
# describe "string concat" do
|
|
8
|
-
# it "concats two strings with spaces" do
|
|
9
|
-
# expect(helper.concat_strings("this","that")).to eq("this that")
|
|
10
|
-
# end
|
|
11
|
-
# end
|
|
12
|
-
# end
|
|
13
2
|
describe MoriHelper do
|
|
14
|
-
|
|
3
|
+
it 'should return the logout link' do
|
|
4
|
+
logout_link.should eq link_to('Log Out', '/logout', :method => :delete)
|
|
5
|
+
end
|
|
15
6
|
end
|
data/spec/helpers.rb
ADDED
|
@@ -1,7 +1,27 @@
|
|
|
1
|
-
require
|
|
1
|
+
require 'spec_helper'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
describe MoriMailer do
|
|
4
|
+
before :each do
|
|
5
|
+
@user = create(:mori_minimal_user, :invitation_token => "67ssdf67a67sdf76", :password_reset_token => "s7df8s7sd8d")
|
|
6
|
+
@host = ::ActionMailer::Base.default_url_options[:host]
|
|
7
|
+
end
|
|
8
|
+
it "is from configuration email" do
|
|
9
|
+
email = MoriMailer.forgot_password(@user)
|
|
10
|
+
Mori.configuration.from_email.should eq email.from[0]
|
|
11
|
+
end
|
|
12
|
+
it "should contain an invite url in invite email" do
|
|
13
|
+
email = MoriMailer.invite_user(@user)
|
|
14
|
+
regexp = %r{http://#{@host}/invites/#{@user.invitation_token}}
|
|
15
|
+
email.body.to_s.should =~ regexp
|
|
16
|
+
end
|
|
17
|
+
it "should contain password reset URL in forgot password email" do
|
|
18
|
+
email = MoriMailer.forgot_password(@user)
|
|
19
|
+
regexp = %r{http://#{@host}/passwords/forgot\?token=#{@user.password_reset_token}}
|
|
20
|
+
email.body.to_s.should =~ regexp
|
|
21
|
+
end
|
|
22
|
+
it "should contain confirmation URL in confirmation email" do
|
|
23
|
+
email = MoriMailer.confirm_email(@user)
|
|
24
|
+
regexp = %r{http://#{@host}/registrations/confirmation\?token=#{@user.confirmation_token}}
|
|
25
|
+
email.body.to_s.should =~ regexp
|
|
6
26
|
end
|
|
7
27
|
end
|