Files
openfoodnetwork/spec/system/consumer/authentication_spec.rb
Maikel Linke 63988fff4f Configure test locales like other envs
The locale config is set in application.rb from environment variables
already. We don't need to repeat that logic in test.rb. And because it
was outdated, the language switcher was actually broken in the test
environment. We did have an English selector for the fallback `en` even
though we were already displaying English as en_TST. And after
switchting to Spanish, we could switch back because en_TST was not in
the available locales.

I now fixed the test with the right assumption and the config to solve
the problem.
2026-03-18 14:49:15 +11:00

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
travel(30.seconds) 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_TST"
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