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_button "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
