mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-25 20:46:48 +00:00
Rails 4.1 added time helpers but we never bothered using them. But now I'm getting rid of the Timecop dependency and use standard helpers. Beware though that the new helpers always freeze time. When you travel to a certain date then the clock stops ticking while Timecop maintained the passing of time. The freezing of time could cause problems if you are trying to enforce a timeout. But all current specs don't seem affected. In most cases, the freezing will make it easier to avoid flaky specs.
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
|
|
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"
|
|
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
|