mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-25 20:46:48 +00:00
300 lines
10 KiB
Ruby
300 lines
10 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'system_helper'
|
|
|
|
RSpec.describe "Authentication" do
|
|
include AuthenticationHelper
|
|
include UIComponentHelper
|
|
|
|
describe "login" do
|
|
let(:user) { create(:user, password: "password", password_confirmation: "password") }
|
|
|
|
describe "With redirects" do
|
|
it "logging in with a redirect set" do
|
|
visit groups_path(anchor: "/login", after_login: producers_path)
|
|
fill_in "Email", with: user.email
|
|
fill_in "Password", with: user.password
|
|
click_login_button
|
|
expect(page).to have_content "Find local producers"
|
|
expect(page).to have_current_path producers_path
|
|
end
|
|
end
|
|
|
|
describe "Loggin in from the home page" do
|
|
before do
|
|
visit root_path
|
|
end
|
|
describe "with default large screen" do
|
|
before do
|
|
open_login_modal
|
|
end
|
|
|
|
describe "logging in" do
|
|
it "showing login" do
|
|
expect(page).to have_login_modal
|
|
end
|
|
|
|
it "failing to login" do
|
|
fill_in "Email", with: user.email
|
|
click_login_button
|
|
expect(page).to have_content "Invalid email or password"
|
|
end
|
|
|
|
it "logging in successfully" do
|
|
fill_in "Email", with: user.email
|
|
fill_in "Password", with: user.password
|
|
click_login_button
|
|
expect(page).to be_logged_in_as user
|
|
end
|
|
|
|
context "using keyboard" do
|
|
it "logging in successfully" do
|
|
fill_in_using_keyboard
|
|
expect(page).to be_logged_in_as user
|
|
end
|
|
end
|
|
|
|
context "with an unconfirmed email" do
|
|
let!(:user) {
|
|
Spree::User.create(email: "test@example.com", unconfirmed_email: "test@example.com",
|
|
password: "password")
|
|
}
|
|
|
|
it "shows an error and an option to resend the confirmation email" do
|
|
fill_in "Email", with: user.email
|
|
fill_in "Password", with: user.password
|
|
click_login_button
|
|
|
|
expect(page).to have_content 'You must confirm your email address before you can ' \
|
|
'reset your password.'
|
|
expect do
|
|
page.find("a", text: 'Resend confirmation email.').click
|
|
end.to enqueue_job ActionMailer::MailDeliveryJob
|
|
expect(enqueued_jobs.last.to_s).to match "confirmation_instructions"
|
|
|
|
expect(page).to have_content 'You will receive an email with instructions about ' \
|
|
'how to confirm your account in a few minutes.'
|
|
|
|
visit spree.spree_user_confirmation_path(confirmation_token: user.confirmation_token)
|
|
expect(user.reload.confirmed?).to be true
|
|
expect(page).to have_text 'Thanks for confirming your email! You can now log in.'
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "signing up" do
|
|
before do
|
|
select_login_tab "Sign up"
|
|
end
|
|
|
|
it "Failing to sign up because password is too short" do
|
|
fill_in "Your email", with: "test@foo.com"
|
|
fill_in "Choose a password", with: "short"
|
|
click_signup_button
|
|
expect(page).to have_content "too short"
|
|
end
|
|
|
|
it "Failing to sign up because email is already registered" do
|
|
fill_in "Your email", with: user.email
|
|
fill_in "Choose a password", with: "foobarino"
|
|
click_signup_button
|
|
expect(page).to have_content "There's already an account for this email."
|
|
end
|
|
|
|
it "Failing to sign up because password confirmation doesn't match or is blank" do
|
|
fill_in "Your email", with: "test@foo.com"
|
|
fill_in "Choose a password", with: "ForgotToRetype"
|
|
click_signup_button
|
|
expect(page).to have_content "doesn't match"
|
|
end
|
|
|
|
it "Signing up successfully" do
|
|
fill_in "Your email", with: "test@foo.com"
|
|
fill_in "Choose a password", with: "test12345"
|
|
fill_in "Confirm password", with: "test12345"
|
|
|
|
expect do
|
|
click_signup_button
|
|
expect(page).to have_content 'A message with a confirmation link has been sent to ' \
|
|
'your email address. Please open the link to activate ' \
|
|
'your account.'
|
|
end.to enqueue_job ActionMailer::MailDeliveryJob
|
|
end
|
|
|
|
describe "invisible_captcha gem" do
|
|
around do |example|
|
|
InvisibleCaptcha.timestamp_enabled = true
|
|
InvisibleCaptcha.timestamp_threshold = 30
|
|
example.run
|
|
InvisibleCaptcha.timestamp_enabled = false
|
|
end
|
|
|
|
it "Failing to sign up because the user is too quick" do
|
|
fill_in "Your email", with: "test@foo.com"
|
|
fill_in "Choose a password", with: "test12345"
|
|
fill_in "Confirm password", with: "test12345"
|
|
click_signup_button
|
|
|
|
expect(page).to have_content "Please try again after 5 seconds."
|
|
end
|
|
|
|
it "succeeding after time threshold" do
|
|
Timecop.travel(30.seconds.from_now) do
|
|
fill_in "Your email", with: "test@foo.com"
|
|
fill_in "Choose a password", with: "test12345"
|
|
fill_in "Confirm password", with: "test12345"
|
|
click_signup_button
|
|
|
|
expect(page).to have_content 'A message with a confirmation link has been sent'
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "forgetting passwords" do
|
|
before do
|
|
select_login_tab "Forgot Password?"
|
|
end
|
|
|
|
it "failing to reset password" do
|
|
fill_in "Your email", with: "notanemail@myemail.com"
|
|
click_reset_password_button
|
|
expect(page).to have_content "Email address not found"
|
|
end
|
|
|
|
it "resetting password" do
|
|
fill_in "Your email", with: user.email
|
|
expect do
|
|
click_reset_password_button
|
|
expect(page).to have_reset_password
|
|
end.to enqueue_job ActionMailer::MailDeliveryJob
|
|
|
|
expect(enqueued_jobs.last.to_s).to match "reset_password_instructions"
|
|
end
|
|
|
|
context "user with unconfirmed email" do
|
|
let(:email) { "test@example.org" }
|
|
let!(:user) {
|
|
Spree::User.create(email:, unconfirmed_email: email, password: "secret")
|
|
}
|
|
|
|
it "cannot reset password before confirming email" do
|
|
fill_in "Your email", with: email
|
|
click_reset_password_button
|
|
expect(page).to have_content 'You must confirm your email address before you can ' \
|
|
'reset your password.'
|
|
page.find("a", text: 'Resend confirmation email.').click
|
|
expect(page).to have_content 'You will receive an email with instructions about ' \
|
|
'how to confirm your account in a few minutes.'
|
|
|
|
visit spree.spree_user_confirmation_path(confirmation_token: user.confirmation_token)
|
|
expect(user.reload.confirmed?).to be true
|
|
expect(page).to have_text 'Thanks for confirming your email! You can now log in.'
|
|
|
|
select_login_tab "Forgot Password?"
|
|
fill_in "Your email", with: email
|
|
click_reset_password_button
|
|
expect(page).to have_reset_password
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "as medium" do
|
|
around { |example| browse_as_medium { example.run } }
|
|
|
|
it "showing login" do
|
|
open_off_canvas
|
|
open_login_modal
|
|
expect(page).to have_login_modal
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "Logging in from the private shop page" do
|
|
let(:distributor) { create(:distributor_enterprise, require_login: true) }
|
|
let!(:order_cycle) {
|
|
create(:simple_order_cycle, distributors: [distributor],
|
|
coordinator: create(:distributor_enterprise))
|
|
}
|
|
before do
|
|
visit enterprise_shop_path(distributor)
|
|
end
|
|
|
|
it "clicking login triggers the login modal" do
|
|
within "#shop-tabs" do
|
|
find("a", text: "login").click
|
|
end
|
|
expect(page).to have_selector("a.active", text: "Login")
|
|
expect(page).to have_button("Login")
|
|
end
|
|
end
|
|
|
|
describe "after following email confirmation link" do
|
|
it "shows confirmed message in modal" do
|
|
visit root_path(anchor: "/login", validation: "confirmed")
|
|
expect(page).to have_login_modal
|
|
expect(page).to have_content 'Thanks for confirming your email! You can now log in.'
|
|
end
|
|
end
|
|
|
|
it "Loggin by typing login/ redirects to /#/login" do
|
|
visit "/login"
|
|
uri = URI.parse(current_url)
|
|
expect("#{uri.path}##{uri.fragment}").to eq('/#/login')
|
|
end
|
|
|
|
describe "with user locales" do
|
|
before do
|
|
visit root_path
|
|
open_login_modal
|
|
end
|
|
|
|
context "when the user has a valid locale saved" do
|
|
before do
|
|
user.update!(locale: "es")
|
|
end
|
|
|
|
it "logs in successfully, applying the saved locale" do
|
|
fill_in_and_submit_login_form(user)
|
|
expect_logged_in
|
|
|
|
expect(page).to have_content 'COMPRAR AHORA'
|
|
end
|
|
end
|
|
|
|
context "when the user has an unavailable locale saved" do
|
|
before do
|
|
user.update!(locale: "xx")
|
|
end
|
|
|
|
it "logs in successfully and resets the user's locale to the default" do
|
|
fill_in_and_submit_login_form(user)
|
|
expect_logged_in
|
|
|
|
expect(page).to have_content 'SHOP NOW'
|
|
expect(user.reload.locale).to eq "en"
|
|
end
|
|
end
|
|
|
|
context "when the user has never selected a locale, but one has been selected before login" do
|
|
before do
|
|
user.update!(locale: nil)
|
|
end
|
|
|
|
it "logs in successfully and uses the locale from cookies" do
|
|
page.driver.set_cookie("locale", "es")
|
|
|
|
fill_in_and_submit_login_form(user)
|
|
expect_logged_in
|
|
|
|
expect(page).to have_content 'COMPRAR AHORA'
|
|
expect(user.reload.locale).to eq "es"
|
|
|
|
page.driver.remove_cookie("locale")
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|