class ResetPasswordFlow < BaseFlow
  private getter user, authentication_flow
  delegate sign_in, sign_out, should_have_password_error, should_be_signed_in,
    to: authentication_flow
  delegate email, to: user

  def initialize(@user : User)
    @authentication_flow = AuthenticationFlow.new(user.email)
  end

  def request_password_reset
    with_fake_token do
      visit PasswordResetRequests::New
      fill_form RequestPasswordReset,
        email: email
      click "@request-password-reset-button"
    end
  end

  def should_have_sent_reset_email
    with_fake_token do
      user = UserQuery.new.email(email).first
      sleep 0.2
      PasswordResetRequestEmail.new(user).should be_delivered
    end
  end

  def reset_password(password)
    user = UserQuery.new.email(email).first
    token = Authentic.generate_password_reset_token(user)
    visit PasswordResets::New.with(user.id, token)
    fill_form ResetPassword,
      password: password,
      password_confirmation: password
    click "@update-password-button"
  end

  private def with_fake_token
    PasswordResetRequestEmail.temp_config(stubbed_token: "fake") do
      yield
    end
  end
end
