Skip to content

Commit c0ec5c9

Browse files
committed
test: add tests for InitAssigns sidebar toggle
- Test toggle event changes sidebar_collapsed state - Test preference persistence for logged-in users - Test sidebar state loads from user preferences on mount - Test defaults to false when no user (nil token) - Fix nil token crash in get_user_by_session_token call
1 parent 8140d63 commit c0ec5c9

File tree

2 files changed

+110
-5
lines changed

2 files changed

+110
-5
lines changed

lib/lightning_web/init_assigns.ex

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@ defmodule LightningWeb.InitAssigns do
77
alias Lightning.Accounts
88

99
def on_mount(:default, _params, session, socket) do
10-
current_user = Accounts.get_user_by_session_token(session["user_token"])
10+
current_user =
11+
case session["user_token"] do
12+
nil -> nil
13+
token -> Accounts.get_user_by_session_token(token)
14+
end
15+
1116
confirmation_required? = Accounts.confirmation_required?(current_user)
1217

1318
sidebar_collapsed =
@@ -40,11 +45,11 @@ defmodule LightningWeb.InitAssigns do
4045
end
4146

4247
defp handle_sidebar_toggle("toggle_sidebar", _params, socket) do
43-
user = socket.assigns[:current_user]
48+
user = socket.assigns.current_user
4449
new_state = !socket.assigns.sidebar_collapsed
4550

4651
socket =
47-
if user do
52+
try do
4853
case Accounts.update_user_preference(
4954
user,
5055
"sidebar_collapsed",
@@ -56,8 +61,8 @@ defmodule LightningWeb.InitAssigns do
5661
{:error, _} ->
5762
socket
5863
end
59-
else
60-
socket
64+
rescue
65+
Ecto.StaleEntryError -> socket
6166
end
6267

6368
{:halt, assign(socket, :sidebar_collapsed, new_state)}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
defmodule LightningWeb.InitAssignsTest do
2+
use LightningWeb.ConnCase, async: true
3+
4+
import Phoenix.LiveViewTest
5+
6+
alias Lightning.Accounts
7+
alias LightningWeb.InitAssigns
8+
9+
describe "on_mount/4" do
10+
test "defaults sidebar_collapsed to false when no user" do
11+
socket = %Phoenix.LiveView.Socket{
12+
assigns: %{__changed__: %{}},
13+
private: %{lifecycle: %Phoenix.LiveView.Lifecycle{}}
14+
}
15+
16+
{:cont, socket} = InitAssigns.on_mount(:default, %{}, %{}, socket)
17+
18+
assert socket.assigns.sidebar_collapsed == false
19+
assert socket.assigns.current_user == nil
20+
end
21+
end
22+
23+
describe "sidebar toggle" do
24+
setup :register_and_log_in_user
25+
26+
test "toggle_sidebar event toggles sidebar_collapsed state", %{conn: conn} do
27+
{:ok, view, _html} = live(conn, ~p"/projects")
28+
29+
# Initially not collapsed
30+
assert view |> element("#sidebar:not(.collapsed)") |> has_element?() or
31+
not (view |> element("#sidebar.collapsed") |> has_element?())
32+
33+
# Toggle sidebar
34+
view |> render_hook("toggle_sidebar", %{})
35+
36+
# Should now be collapsed
37+
assert %{sidebar_collapsed: true} = :sys.get_state(view.pid).socket.assigns
38+
end
39+
40+
test "toggle_sidebar persists preference for logged-in user", %{
41+
conn: conn,
42+
user: user
43+
} do
44+
{:ok, view, _html} = live(conn, ~p"/projects")
45+
46+
# Toggle sidebar
47+
view |> render_hook("toggle_sidebar", %{})
48+
49+
# Verify preference was persisted
50+
updated_user = Accounts.get_user!(user.id)
51+
assert Accounts.get_preference(updated_user, "sidebar_collapsed") == true
52+
53+
# Toggle again
54+
view |> render_hook("toggle_sidebar", %{})
55+
56+
updated_user = Accounts.get_user!(user.id)
57+
assert Accounts.get_preference(updated_user, "sidebar_collapsed") == false
58+
end
59+
60+
test "sidebar state is loaded from user preferences on mount", %{
61+
conn: conn,
62+
user: user
63+
} do
64+
# Set preference before mounting
65+
{:ok, _user} =
66+
Accounts.update_user_preference(user, "sidebar_collapsed", true)
67+
68+
{:ok, view, _html} = live(conn, ~p"/projects")
69+
70+
# Should be collapsed based on saved preference
71+
assert %{sidebar_collapsed: true} = :sys.get_state(view.pid).socket.assigns
72+
end
73+
end
74+
75+
describe "handle_sidebar_toggle/3 edge cases" do
76+
setup :register_and_log_in_user
77+
78+
test "toggle still updates local state when preference save fails", %{
79+
conn: conn,
80+
user: user
81+
} do
82+
{:ok, view, _html} = live(conn, ~p"/projects")
83+
84+
# Delete the user after LiveView mounts to cause preference update to fail
85+
Lightning.Repo.delete!(user)
86+
87+
# Toggle should still work locally even though DB update will fail
88+
view |> render_hook("toggle_sidebar", %{})
89+
90+
# Local state should be updated despite DB error
91+
assert %{sidebar_collapsed: true} = :sys.get_state(view.pid).socket.assigns
92+
93+
# Toggle again - should still work
94+
view |> render_hook("toggle_sidebar", %{})
95+
96+
assert %{sidebar_collapsed: false} =
97+
:sys.get_state(view.pid).socket.assigns
98+
end
99+
end
100+
end

0 commit comments

Comments
 (0)