login & reg bootstrap styled, reg as live form, login & reg tests revised

This commit is contained in:
Adam Piontek 2021-03-01 13:42:26 -05:00
parent e9a1dba607
commit db796812ae
22 changed files with 499 additions and 246 deletions

View file

@ -7,9 +7,9 @@ defmodule Bones73kWeb.UserRegistrationControllerTest do
test "renders registration page", %{conn: conn} do
conn = get(conn, Routes.user_registration_path(conn, :new))
response = html_response(conn, 200)
assert response =~ "<h1>Register</h1>"
assert response =~ "Log in</a>"
assert response =~ "Register</a>"
assert response =~ "Register\n </h3>"
assert response =~ "Log in\n</a>"
assert response =~ "Register\n</a>"
end
test "redirects if already logged in", %{conn: conn} do
@ -17,38 +17,4 @@ defmodule Bones73kWeb.UserRegistrationControllerTest do
assert redirected_to(conn) == "/"
end
end
describe "POST /users/register" do
@tag :capture_log
test "creates account and logs the user in", %{conn: conn} do
email = unique_user_email()
conn =
post(conn, Routes.user_registration_path(conn, :create), %{
"user" => %{"email" => email, "password" => valid_user_password()}
})
assert get_session(conn, :user_token)
assert redirected_to(conn) =~ "/"
# Now do a logged in request and assert on the menu
conn = get(conn, "/")
response = html_response(conn, 200)
assert response =~ email
assert response =~ "Settings</a>"
assert response =~ "Log out</a>"
end
test "render errors for invalid data", %{conn: conn} do
conn =
post(conn, Routes.user_registration_path(conn, :create), %{
"user" => %{"email" => "with spaces", "password" => "too short"}
})
response = html_response(conn, 200)
assert response =~ "<h1>Register</h1>"
assert response =~ "must have the @ sign and no spaces"
assert response =~ "should be at least 12 character"
end
end
end

View file

@ -11,9 +11,9 @@ defmodule Bones73kWeb.UserSessionControllerTest do
test "renders log in page", %{conn: conn} do
conn = get(conn, Routes.user_session_path(conn, :new))
response = html_response(conn, 200)
assert response =~ "<h1>Log in</h1>"
assert response =~ "Log in</a>"
assert response =~ "Register</a>"
assert response =~ "\n Log in\n </h3>"
assert response =~ "Register\n</a>"
assert response =~ "Log in\n</a>"
end
test "redirects if already logged in", %{conn: conn, user: user} do
@ -22,8 +22,8 @@ defmodule Bones73kWeb.UserSessionControllerTest do
end
end
describe "POST /users/log_in" do
test "logs the user in", %{conn: conn, user: user} do
describe "POST /users/log_in with credential params" do
test "credential params logs the user in", %{conn: conn, user: user} do
conn =
post(conn, Routes.user_session_path(conn, :create), %{
"user" => %{"email" => user.email, "password" => valid_user_password()}
@ -36,8 +36,8 @@ defmodule Bones73kWeb.UserSessionControllerTest do
conn = get(conn, "/")
response = html_response(conn, 200)
assert response =~ user.email
assert response =~ "Settings</a>"
assert response =~ "Log out</a>"
assert response =~ "Settings\n</a>"
assert response =~ "Log out\n</a>"
end
test "logs the user in with remember me", %{conn: conn, user: user} do
@ -61,7 +61,54 @@ defmodule Bones73kWeb.UserSessionControllerTest do
})
response = html_response(conn, 200)
assert response =~ "<h1>Log in</h1>"
assert response =~ "\n Log in\n </h3>"
assert response =~ "Invalid email or password"
end
end
describe "POST /users/log_in with params token" do
test "params token logs the user in", %{conn: conn, user: user} do
params_token = login_params_token(user, "/users/settings")
conn =
post(conn, Routes.user_session_path(conn, :create), %{
"user" => %{"params_token" => params_token}
})
assert get_session(conn, :user_token)
assert redirected_to(conn) =~ "/"
# Now do a logged in request and assert on the menu
conn = get(conn, "/")
response = html_response(conn, 200)
assert response =~ user.email
assert response =~ "Settings\n</a>"
assert response =~ "Log out\n</a>"
end
test "logs the user in with remember me", %{conn: conn, user: user} do
params_token = login_params_token(user, "/users/settings")
conn =
post(conn, Routes.user_session_path(conn, :create), %{
"user" => %{
"params_token" => params_token,
"remember_me" => "true"
}
})
assert conn.resp_cookies["user_remember_me"]
assert redirected_to(conn) =~ "/"
end
test "emits error message with invalid params token", %{conn: conn} do
conn =
post(conn, Routes.user_session_path(conn, :create), %{
"user" => %{"params_token" => "invalid params token"}
})
response = html_response(conn, 200)
assert response =~ "\n Log in\n </h3>"
assert response =~ "Invalid email or password"
end
end

View file

@ -0,0 +1,72 @@
defmodule Bones73kWeb.UserLive.RegistrationTest do
use Bones73kWeb.ConnCase
# import Plug.Conn
# import Phoenix.ConnTest
import Phoenix.LiveViewTest
import Bones73k.AccountsFixtures
alias Bones73k.Accounts
alias Bones73k.Accounts.User
describe "Registration" do
setup %{conn: conn} do
user_return_to = "/path-requires-auth"
conn = init_test_session(conn, %{"user_return_to" => user_return_to})
%{conn: conn, user_return_to: user_return_to}
end
test "displays registration form", %{conn: conn} do
{:ok, _view, html} = live_isolated(conn, Bones73kWeb.UserLive.Registration)
assert html =~ "Register\n </h3>"
assert html =~ "Email</label>"
end
test "render errors for invalid data", %{conn: conn} do
{:ok, view, _html} = live_isolated(conn, Bones73kWeb.UserLive.Registration)
html =
view
|> form("#reg_form", %{"user" => %{"email" => "abc", "password" => "abc"}})
|> render_change()
assert html =~ "Register\n </h3>"
assert html =~ "must be a valid email address"
assert html =~ "should be at least #{User.min_password()} character(s)"
end
@tag :capture_log
test "creates account and sets login params_token and phx-trigger-action", %{
conn: conn,
user_return_to: user_return_to
} do
{:ok, view, html} = live_isolated(conn, Bones73kWeb.UserLive.Registration)
# Login trigger form not triggered yet
refute html =~ "phx-trigger-action=\"phx-trigger-action\""
# Render registering a new user
email = unique_user_email()
form_data = %{"user" => %{"email" => email, "password" => valid_user_password()}}
html = form(view, "#reg_form", form_data) |> render_submit()
# Confirm user was registered
%User{email: new_user_email, id: new_user_id} = Accounts.get_user_by_email(email)
assert new_user_email == email
# Login trigger form activated?
assert html =~ "phx-trigger-action=\"phx-trigger-action\""
# Collect the rendered login params token
[params_token] = Floki.attribute(html, "input#user_params_token", "value")
{:ok, params} = Phoenix.Token.decrypt(Bones73kWeb.Endpoint, "login_params", params_token)
%{user_id: param_user_id, user_return_to: param_return_path} = params
# Token in login trigger form has correct user ID?
assert new_user_id == param_user_id
# ... and correct user_return_to path?
assert user_return_to == param_return_path
end
end
end

View file

@ -23,10 +23,11 @@ defmodule Bones73k.AccountsFixtures do
{:ok, user} =
attrs
|> Enum.into(%{
role: :admin,
email: unique_user_email(),
password: valid_user_password()
})
|> Bones73k.Accounts.register_admin()
|> Bones73k.Accounts.register_user()
user
end
@ -39,4 +40,15 @@ defmodule Bones73k.AccountsFixtures do
[_, token, _] = String.split(email.text_body, "[TOKEN]")
token
end
def login_params_token(user, return_path) do
Phoenix.Token.encrypt(Bones73kWeb.Endpoint, "login_params", %{
user_id: user.id,
user_return_to: return_path,
messages: [
success: "A message of success!",
info: "Some information as well."
]
})
end
end