login & reg bootstrap styled, reg as live form, login & reg tests revised
This commit is contained in:
parent
e9a1dba607
commit
db796812ae
22 changed files with 499 additions and 246 deletions
test
bones73k_web
controllers
live/user
support/fixtures
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
72
test/bones73k_web/live/user/registration_test.ex
Normal file
72
test/bones73k_web/live/user/registration_test.ex
Normal 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
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue