Files
grecia/spec/system/verification/letter_spec.rb
Javi Martín 1b8a079727 Don't reload records in system tests
As mentioned in commits like a586ba806, a7664ad81, 006128da5, b41fbfa52
and c480cdd91, accessing the database after starting the browser with
the `visit` method sometimes results in database corruption and failing
tests on our CI due to the process running the test accessing the
database after the process running the browser has started.

For example, one of these tests has recently failed on our CI:

```
3) Users Create a level 3 user with email from scratch
   Failure/Error: expect(user.reload).to be_confirmed
     expected `#<User id: 2060, email: "pepe@gmail.com", created_at:
     "2025-03-12 19:51:03.688867000 +0100", updated_...d_debates: true,
     recommended_proposals: true, subscriptions_token: nil,
     registering_from_web: false>.confirmed?` to be truthy, got false
```

IMHO this is also a bad practice for system tests, since these tests
should be checking what users experience.

So we're modifying the tests to check the results of users interaction
from the point of view of the users. For example, instead of checking
that a user is now level 3 verified in the database, we're checking that
the user interface states that the user is level 3 verified.

Note we're adding an offset when editing the map marker by clicking on
`map-location` with `.click(x: 30, y: 30)`. This way we make sure that
both the latitude and longitude change from the original values; we used
to clicking in the middle (no offset), which didn't change the longitude
and changed the latitude just by coincidence.

Also note we aren't changing tests with the `:no_js` tag, since these
tests don't run a real browser in a separate process. In the future, we
should also change most of these tests so they don't access the database
and they use a real browser.
2025-04-01 14:53:26 +02:00

139 lines
4.7 KiB
Ruby

require "rails_helper"
describe "Verify Letter" do
scenario "Request a letter" do
user = create(:user, residence_verified_at: Time.current,
confirmed_phone: "611111111")
login_as(user)
visit new_letter_path
click_link "Send me a letter with the code"
expect(page).to have_content "Thank you for requesting your maximum security code " \
"(only required for the final votes). In a few days " \
"we will send it to the address featuring in the data " \
"we have on file."
visit verification_path
expect(page).to have_field "Code you received in letter"
end
scenario "Deny access unless verified residence" do
user = create(:user)
login_as(user)
visit new_letter_path
expect(page).to have_content "You have not yet confirmed your residency"
expect(page).to have_current_path(new_residence_path)
end
scenario "Deny access unless verified phone/email" do
user = create(:user, residence_verified_at: Time.current)
login_as(user)
visit new_letter_path
expect(page).to have_content "You have not yet entered the confirmation code"
expect(page).to have_current_path(new_sms_path)
end
context "Code verification" do
scenario "Valid verification user logged in" do
user = create(:user, residence_verified_at: Time.current,
confirmed_phone: "611111111",
letter_verification_code: "123456")
login_as(user)
visit edit_letter_path
fill_in "verification_letter_email", with: user.email
fill_in "verification_letter_password", with: user.password
fill_in "verification_letter_verification_code", with: user.letter_verification_code
click_button "Verify my account"
expect(page).to have_content "Code correct. Your account is now verified"
expect(page).to have_current_path(account_path)
end
scenario "Valid verification of user failing to add trailing zeros" do
user = create(:user, residence_verified_at: Time.current,
confirmed_phone: "611111111",
letter_verification_code: "012345")
login_as(user)
visit edit_letter_path
fill_in "verification_letter_email", with: user.email
fill_in "verification_letter_password", with: user.password
fill_in "verification_letter_verification_code", with: "12345"
click_button "Verify my account"
expect(page).to have_content "Account verified"
expect(page).to have_current_path(account_path)
end
scenario "Valid verification user not logged in" do
user = create(:user, residence_verified_at: Time.current,
confirmed_phone: "611111111",
letter_verification_code: "123456")
visit edit_letter_path
fill_in "verification_letter_email", with: user.email
fill_in "verification_letter_password", with: user.password
fill_in "verification_letter_verification_code", with: user.letter_verification_code
click_button "Verify my account"
expect(page).to have_content "Code correct. Your account is now verified"
expect(page).to have_current_path(account_path)
end
scenario "Error messages on authentication" do
visit edit_letter_path
click_button "Verify my account"
expect(page).to have_content "Invalid email or password."
end
scenario "Error messages on verification" do
user = create(:user, residence_verified_at: Time.current,
confirmed_phone: "611111111")
visit edit_letter_path
fill_in "verification_letter_email", with: user.email
fill_in "verification_letter_password", with: user.password
click_button "Verify my account"
expect(page).to have_content "can't be blank"
end
scenario "6 tries allowed" do
user = create(:user, residence_verified_at: Time.current,
confirmed_phone: "611111111",
letter_verification_code: "123456")
visit edit_letter_path
5.times do |n|
fill_in "Email", with: user.email
fill_in "Password", with: user.password
fill_in "Code you received in letter", with: "1"
click_button "Verify my account"
expect(page).to have_field "Password", with: ""
expect(page).to have_content "Verification code incorrect"
end
fill_in "Password", with: user.password
click_button "Verify my account"
expect(page).to have_content "You have reached the maximum number of attempts. Please try again later."
expect(page).to have_current_path(account_path)
end
end
end