2023-03-05 16:13:00 +01:00
|
|
|
defmodule ChiyaWeb.UserResetPasswordLiveTest do
|
|
|
|
use ChiyaWeb.ConnCase
|
|
|
|
|
|
|
|
import Phoenix.LiveViewTest
|
|
|
|
import Chiya.AccountsFixtures
|
|
|
|
|
|
|
|
alias Chiya.Accounts
|
|
|
|
|
|
|
|
setup do
|
|
|
|
user = user_fixture()
|
|
|
|
|
|
|
|
token =
|
|
|
|
extract_user_token(fn url ->
|
|
|
|
Accounts.deliver_user_reset_password_instructions(user, url)
|
|
|
|
end)
|
|
|
|
|
|
|
|
%{token: token, user: user}
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "Reset password page" do
|
|
|
|
test "renders reset password with valid token", %{conn: conn, token: token} do
|
2023-03-07 21:15:26 +01:00
|
|
|
{:ok, _lv, html} = live(conn, ~p"/user/reset_password/#{token}")
|
2023-03-05 16:13:00 +01:00
|
|
|
|
|
|
|
assert html =~ "Reset Password"
|
|
|
|
end
|
|
|
|
|
|
|
|
test "does not render reset password with invalid token", %{conn: conn} do
|
2023-03-07 21:15:26 +01:00
|
|
|
{:error, {:redirect, to}} = live(conn, ~p"/user/reset_password/invalid")
|
2023-03-05 16:13:00 +01:00
|
|
|
|
|
|
|
assert to == %{
|
|
|
|
flash: %{"error" => "Reset password link is invalid or it has expired."},
|
|
|
|
to: ~p"/"
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
test "renders errors for invalid data", %{conn: conn, token: token} do
|
2023-03-07 21:15:26 +01:00
|
|
|
{:ok, lv, _html} = live(conn, ~p"/user/reset_password/#{token}")
|
2023-03-05 16:13:00 +01:00
|
|
|
|
|
|
|
result =
|
|
|
|
lv
|
|
|
|
|> element("#reset_password_form")
|
|
|
|
|> render_change(
|
|
|
|
user: %{"password" => "secret12", "confirmation_password" => "secret123456"}
|
|
|
|
)
|
|
|
|
|
|
|
|
assert result =~ "should be at least 12 character"
|
|
|
|
assert result =~ "does not match password"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "Reset Password" do
|
|
|
|
test "resets password once", %{conn: conn, token: token, user: user} do
|
2023-03-07 21:15:26 +01:00
|
|
|
{:ok, lv, _html} = live(conn, ~p"/user/reset_password/#{token}")
|
2023-03-05 16:13:00 +01:00
|
|
|
|
|
|
|
{:ok, conn} =
|
|
|
|
lv
|
|
|
|
|> form("#reset_password_form",
|
|
|
|
user: %{
|
|
|
|
"password" => "new valid password",
|
|
|
|
"password_confirmation" => "new valid password"
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|> render_submit()
|
2023-03-07 21:15:26 +01:00
|
|
|
|> follow_redirect(conn, ~p"/user/log_in")
|
2023-03-05 16:13:00 +01:00
|
|
|
|
|
|
|
refute get_session(conn, :user_token)
|
|
|
|
assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Password reset successfully"
|
|
|
|
assert Accounts.get_user_by_email_and_password(user.email, "new valid password")
|
|
|
|
end
|
|
|
|
|
|
|
|
test "does not reset password on invalid data", %{conn: conn, token: token} do
|
2023-03-07 21:15:26 +01:00
|
|
|
{:ok, lv, _html} = live(conn, ~p"/user/reset_password/#{token}")
|
2023-03-05 16:13:00 +01:00
|
|
|
|
|
|
|
result =
|
|
|
|
lv
|
|
|
|
|> form("#reset_password_form",
|
|
|
|
user: %{
|
|
|
|
"password" => "too short",
|
|
|
|
"password_confirmation" => "does not match"
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|> render_submit()
|
|
|
|
|
|
|
|
assert result =~ "Reset Password"
|
|
|
|
assert result =~ "should be at least 12 character(s)"
|
|
|
|
assert result =~ "does not match password"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "Reset password navigation" do
|
|
|
|
test "redirects to login page when the Log in button is clicked", %{conn: conn, token: token} do
|
2023-03-07 21:15:26 +01:00
|
|
|
{:ok, lv, _html} = live(conn, ~p"/user/reset_password/#{token}")
|
2023-03-05 16:13:00 +01:00
|
|
|
|
|
|
|
{:ok, conn} =
|
|
|
|
lv
|
|
|
|
|> element(~s|main a:fl-contains("Log in")|)
|
|
|
|
|> render_click()
|
2023-03-07 21:15:26 +01:00
|
|
|
|> follow_redirect(conn, ~p"/user/log_in")
|
2023-03-05 16:13:00 +01:00
|
|
|
|
2023-06-22 21:08:59 +02:00
|
|
|
assert conn.resp_body =~ "Sign in"
|
2023-03-05 16:13:00 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
test "redirects to password reset page when the Register button is clicked", %{
|
|
|
|
conn: conn,
|
|
|
|
token: token
|
|
|
|
} do
|
2023-03-07 21:15:26 +01:00
|
|
|
{:ok, lv, _html} = live(conn, ~p"/user/reset_password/#{token}")
|
2023-03-05 16:13:00 +01:00
|
|
|
|
|
|
|
{:ok, conn} =
|
|
|
|
lv
|
|
|
|
|> element(~s|main a:fl-contains("Register")|)
|
|
|
|
|> render_click()
|
2023-03-07 21:15:26 +01:00
|
|
|
|> follow_redirect(conn, ~p"/user/register")
|
2023-03-05 16:13:00 +01:00
|
|
|
|
|
|
|
assert conn.resp_body =~ "Register"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|