DEV: Use Capybara::Session#using_wait_time instead (#32116)

When `Capybara.threadsafe` has been set to `true` as in our case, we
have to use `Capybara::Session#using_wait_time` instead of
`Capybara.using_wait_time`. The latter sets `default_max_wait_time` on
`Capybara.default_max_wait_time` while the former sets
`default_max_wait_time` on the session.
This commit is contained in:
Alan Guo Xiang Tan 2025-04-02 09:11:26 +08:00 committed by GitHub
parent 72c837bc98
commit 0f3d61b463
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 110 additions and 100 deletions

View File

@ -52,8 +52,8 @@ describe "Changing email", type: :system do
end
it "works when user has totp 2fa", dump_threads_on_failure: true do
# Tests is flaky so trying with a longer wait time as a workaround
Capybara.using_wait_time(Capybara.default_max_wait_time * 2) do
# Test is flaky so trying with a longer wait time as a workaround
using_wait_time(Capybara.default_max_wait_time * 2) do
SiteSetting.hide_email_address_taken = false
second_factor = Fabricate(:user_second_factor_totp, user: user)
@ -70,8 +70,8 @@ describe "Changing email", type: :system do
end
it "works when user has webauthn 2fa" do
# Tests is flaky so trying with a longer wait time as a workaround
Capybara.using_wait_time(Capybara.default_max_wait_time * 2) do
# Test is flaky so trying with a longer wait time as a workaround
using_wait_time(Capybara.default_max_wait_time * 2) do
begin
# enforced 2FA flow needs a user created > 5 minutes ago
user.created_at = 6.minutes.ago

View File

@ -42,11 +42,14 @@ shared_examples "forgot password scenarios" do
context "when user does not have any multi-factor authentication configured" do
it "should allow a user to reset their password" do
visit_reset_password_link
# Test is flaky so trying with a longer wait time as a workaround
using_wait_time(Capybara.default_max_wait_time * 2) do
visit_reset_password_link
user_reset_password_page.fill_in_new_password("newsuperpassword").submit_new_password
user_reset_password_page.fill_in_new_password("newsuperpassword").submit_new_password
expect(user_reset_password_page).to have_logged_in_user
expect(user_reset_password_page).to have_logged_in_user
end
end
end
@ -55,42 +58,46 @@ shared_examples "forgot password scenarios" do
fab!(:user_second_factor_totp) { Fabricate(:user_second_factor_totp, user:) }
it "should allow a user to reset password with TOTP" do
visit_reset_password_link
# Test is flaky so trying with a longer wait time as a workaround
using_wait_time(Capybara.default_max_wait_time * 2) do
visit_reset_password_link
expect(user_reset_password_page).to have_no_toggle_button_to_second_factor_form
expect(user_reset_password_page).to have_no_toggle_button_to_second_factor_form
user_reset_password_page
.fill_in_totp(ROTP::TOTP.new(user_second_factor_totp.data).now)
.submit_totp
.fill_in_new_password("newsuperpassword")
.submit_new_password
user_reset_password_page
.fill_in_totp(ROTP::TOTP.new(user_second_factor_totp.data).now)
.submit_totp
.fill_in_new_password("newsuperpassword")
.submit_new_password
expect(user_reset_password_page).to have_logged_in_user
expect(user_reset_password_page).to have_logged_in_user
end
end
end
context "when user only has security key configured" do
before do
@authenticator =
page.driver.browser.add_virtual_authenticator(
Selenium::WebDriver::VirtualAuthenticatorOptions.new,
)
create_user_security_key(user)
end
after { @authenticator.remove! }
it "should allow a user to reset password with a security key" do
visit_reset_password_link
# Test is flaky so trying with a longer wait time as a workaround
using_wait_time(Capybara.default_max_wait_time * 2) do
authenticator =
page.driver.browser.add_virtual_authenticator(
Selenium::WebDriver::VirtualAuthenticatorOptions.new,
)
expect(user_reset_password_page).to have_no_toggle_button_to_second_factor_form
create_user_security_key(user)
user_reset_password_page.submit_security_key
visit_reset_password_link
user_reset_password_page.fill_in_new_password("newsuperpassword").submit_new_password
expect(user_reset_password_page).to have_no_toggle_button_to_second_factor_form
expect(user_reset_password_page).to have_logged_in_user
user_reset_password_page.submit_security_key
user_reset_password_page.fill_in_new_password("newsuperpassword").submit_new_password
expect(user_reset_password_page).to have_logged_in_user
ensure
authenticator.remove!
end
end
end
@ -99,47 +106,51 @@ shared_examples "forgot password scenarios" do
fab!(:user_second_factor_totp) { Fabricate(:user_second_factor_totp, user:) }
it "should allow a user to reset password with backup code" do
visit_reset_password_link
# Test is flaky so trying with a longer wait time as a workaround
using_wait_time(Capybara.default_max_wait_time * 2) do
visit_reset_password_link
user_reset_password_page
.use_backup_codes
.fill_in_backup_code("iAmValidBackupCode")
.submit_backup_code
.fill_in_new_password("newsuperpassword")
.submit_new_password
user_reset_password_page
.use_backup_codes
.fill_in_backup_code("iAmValidBackupCode")
.submit_backup_code
.fill_in_new_password("newsuperpassword")
.submit_new_password
expect(user_reset_password_page).to have_logged_in_user
expect(user_reset_password_page).to have_logged_in_user
end
end
end
context "when user has security key and backup codes configured" do
fab!(:user_second_factor_backup) { Fabricate(:user_second_factor_backup, user:) }
before do
@authenticator =
page.driver.browser.add_virtual_authenticator(
Selenium::WebDriver::VirtualAuthenticatorOptions.new,
)
create_user_security_key(user)
end
after { @authenticator.remove! }
it "should allow a user to reset password with backup code instead of security key" do
visit_reset_password_link
# Test is flaky so trying with a longer wait time as a workaround
using_wait_time(Capybara.default_max_wait_time * 2) do
authenticator =
page.driver.browser.add_virtual_authenticator(
Selenium::WebDriver::VirtualAuthenticatorOptions.new,
)
user_reset_password_page.try_another_way
create_user_security_key(user)
expect(user_reset_password_page).to have_no_toggle_button_in_second_factor_form
visit_reset_password_link
user_reset_password_page
.fill_in_backup_code("iAmValidBackupCode")
.submit_backup_code
.fill_in_new_password("newsuperpassword")
.submit_new_password
user_reset_password_page.try_another_way
expect(user_reset_password_page).to have_logged_in_user
expect(user_reset_password_page).to have_no_toggle_button_in_second_factor_form
user_reset_password_page
.fill_in_backup_code("iAmValidBackupCode")
.submit_backup_code
.fill_in_new_password("newsuperpassword")
.submit_new_password
expect(user_reset_password_page).to have_logged_in_user
ensure
authenticator.remove!
end
end
end
@ -147,71 +158,70 @@ shared_examples "forgot password scenarios" do
fab!(:user_second_factor_totp) { Fabricate(:user_second_factor_totp, user:) }
fab!(:user_second_factor_backup) { Fabricate(:user_second_factor_backup, user:) }
before do
@authenticator =
page.driver.browser.add_virtual_authenticator(
Selenium::WebDriver::VirtualAuthenticatorOptions.new,
)
create_user_security_key(user)
end
after { @authenticator.remove! }
it "should allow a user to toggle from security key to TOTP and between TOTP and backup codes" do
visit_reset_password_link
# Test is flaky so trying with a longer wait time as a workaround
using_wait_time(Capybara.default_max_wait_time * 2) do
authenticator =
page.driver.browser.add_virtual_authenticator(
Selenium::WebDriver::VirtualAuthenticatorOptions.new,
)
user_reset_password_page.try_another_way
create_user_security_key(user)
expect(user_reset_password_page).to have_totp_description
visit_reset_password_link
user_reset_password_page.use_backup_codes
user_reset_password_page.try_another_way
expect(user_reset_password_page).to have_backup_codes_description
expect(user_reset_password_page).to have_totp_description
user_reset_password_page.use_totp
user_reset_password_page.use_backup_codes
expect(user_reset_password_page).to have_totp_description
expect(user_reset_password_page).to have_backup_codes_description
user_reset_password_page.use_totp
expect(user_reset_password_page).to have_totp_description
ensure
authenticator.remove!
end
end
end
context "when user has TOTP and security key configured but no backup codes" do
fab!(:user_second_factor_totp) { Fabricate(:user_second_factor_totp, user:) }
before do
@authenticator =
page.driver.browser.add_virtual_authenticator(
Selenium::WebDriver::VirtualAuthenticatorOptions.new,
)
create_user_security_key(user)
end
after { @authenticator.remove! }
it "should allow a user to reset password with TOTP instead of security key" do
visit_reset_password_link
# Test is flaky so trying with a longer wait time as a workaround
using_wait_time(Capybara.default_max_wait_time * 2) do
authenticator =
page.driver.browser.add_virtual_authenticator(
Selenium::WebDriver::VirtualAuthenticatorOptions.new,
)
user_reset_password_page.try_another_way
create_user_security_key(user)
expect(user_reset_password_page).to have_no_toggle_button_in_second_factor_form
visit_reset_password_link
user_reset_password_page
.fill_in_totp(ROTP::TOTP.new(user_second_factor_totp.data).now)
.submit_totp
.fill_in_new_password("newsuperpassword")
.submit_new_password
user_reset_password_page.try_another_way
expect(user_reset_password_page).to have_logged_in_user
expect(user_reset_password_page).to have_no_toggle_button_in_second_factor_form
user_reset_password_page
.fill_in_totp(ROTP::TOTP.new(user_second_factor_totp.data).now)
.submit_totp
.fill_in_new_password("newsuperpassword")
.submit_new_password
expect(user_reset_password_page).to have_logged_in_user
ensure
authenticator.remove!
end
end
end
end
end
describe "User resetting password", type: :system, dump_threads_on_failure: true do
# Tests are flaky so trying with a longer wait time as a workaround
around { |example| Capybara.using_wait_time(Capybara.default_max_wait_time * 2) { example.run } }
describe "when desktop" do
include_examples "forgot password scenarios"
end