blonk is a radar for your web, where you follow vibes for cool blips on the radar
1defmodule ElixirBlonkWeb.UserSessionControllerTest do
2 use ElixirBlonkWeb.ConnCase, async: true
3
4 import ElixirBlonk.AccountsFixtures
5
6 setup do
7 %{user: user_fixture()}
8 end
9
10 describe "GET /users/log_in" do
11 test "renders log in page", %{conn: conn} do
12 conn = get(conn, ~p"/users/log_in")
13 response = html_response(conn, 200)
14 assert response =~ "Log in"
15 assert response =~ ~p"/users/register"
16 assert response =~ "Forgot your password?"
17 end
18
19 test "redirects if already logged in", %{conn: conn, user: user} do
20 conn = conn |> log_in_user(user) |> get(~p"/users/log_in")
21 assert redirected_to(conn) == ~p"/"
22 end
23 end
24
25 describe "POST /users/log_in" do
26 test "logs the user in", %{conn: conn, user: user} do
27 conn =
28 post(conn, ~p"/users/log_in", %{
29 "user" => %{"email" => user.email, "password" => valid_user_password()}
30 })
31
32 assert get_session(conn, :user_token)
33 assert redirected_to(conn) == ~p"/"
34
35 # Now do a logged in request and assert on the menu
36 conn = get(conn, ~p"/")
37 response = html_response(conn, 200)
38 assert response =~ user.email
39 assert response =~ ~p"/users/settings"
40 assert response =~ ~p"/users/log_out"
41 end
42
43 test "logs the user in with remember me", %{conn: conn, user: user} do
44 conn =
45 post(conn, ~p"/users/log_in", %{
46 "user" => %{
47 "email" => user.email,
48 "password" => valid_user_password(),
49 "remember_me" => "true"
50 }
51 })
52
53 assert conn.resp_cookies["_elixir_blonk_web_user_remember_me"]
54 assert redirected_to(conn) == ~p"/"
55 end
56
57 test "logs the user in with return to", %{conn: conn, user: user} do
58 conn =
59 conn
60 |> init_test_session(user_return_to: "/foo/bar")
61 |> post(~p"/users/log_in", %{
62 "user" => %{
63 "email" => user.email,
64 "password" => valid_user_password()
65 }
66 })
67
68 assert redirected_to(conn) == "/foo/bar"
69 assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Welcome back!"
70 end
71
72 test "emits error message with invalid credentials", %{conn: conn, user: user} do
73 conn =
74 post(conn, ~p"/users/log_in", %{
75 "user" => %{"email" => user.email, "password" => "invalid_password"}
76 })
77
78 response = html_response(conn, 200)
79 assert response =~ "Log in"
80 assert response =~ "Invalid email or password"
81 end
82 end
83
84 describe "DELETE /users/log_out" do
85 test "logs the user out", %{conn: conn, user: user} do
86 conn = conn |> log_in_user(user) |> delete(~p"/users/log_out")
87 assert redirected_to(conn) == ~p"/"
88 refute get_session(conn, :user_token)
89 assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Logged out successfully"
90 end
91
92 test "succeeds even if the user is not logged in", %{conn: conn} do
93 conn = delete(conn, ~p"/users/log_out")
94 assert redirected_to(conn) == ~p"/"
95 refute get_session(conn, :user_token)
96 assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Logged out successfully"
97 end
98 end
99end