Skip to content

Commit 257506f

Browse files
committed
Add Tests for Hosting Live Views
1 parent 865e7fb commit 257506f

5 files changed

Lines changed: 320 additions & 11 deletions

File tree

test/dev_round/hosting_test.exs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,7 @@ defmodule DevRound.HostingTest do
77

88
import DevRound.EventsFixtures
99
import DevRound.AccountsFixtures
10-
11-
defp team_name_fixture(attrs \\ %{}) do
12-
{:ok, team_name} =
13-
attrs
14-
|> Enum.into(%{
15-
name: "some name #{System.unique_integer()}"
16-
})
17-
|> Hosting.create_team_name()
18-
19-
team_name
20-
end
10+
import DevRound.HostingFixtures
2111

2212
describe "team_names" do
2313
test "list_team_names/0 returns all team_names" do
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
defmodule DevRoundWeb.HostingLectureLive.ShowTest do
2+
use DevRoundWeb.ConnCase
3+
import Phoenix.LiveViewTest
4+
import DevRound.EventsFixtures
5+
import DevRound.AccountsFixtures
6+
7+
setup %{conn: conn} do
8+
user = user_fixture()
9+
event = event_fixture(%{live: false})
10+
11+
# Add user as host
12+
Ecto.Changeset.change(event)
13+
|> Ecto.Changeset.put_assoc(:event_hosts, [%DevRound.Events.EventHost{user_id: user.id}])
14+
|> DevRound.Repo.update!()
15+
16+
conn = log_in_user(conn, user)
17+
18+
%{conn: conn, event: event, host: user}
19+
end
20+
21+
describe "Hosting Lecture Show" do
22+
test "loads correctly", %{conn: conn, event: event} do
23+
assert {:ok, _view, html} = live(conn, ~p"/events/#{event}/hosting/lecture")
24+
assert html =~ "Hosting Lecture"
25+
end
26+
27+
test "denies access to non-host users", %{conn: conn, event: event} do
28+
conn = log_in_user(conn, user_fixture())
29+
30+
assert_raise DevRoundWeb.PermissionError, fn ->
31+
live(conn, ~p"/events/#{event}/hosting/lecture")
32+
end
33+
end
34+
35+
test "can start and stop presentation", %{conn: conn, event: event} do
36+
{:ok, view, _html} = live(conn, ~p"/events/#{event}/hosting/lecture")
37+
38+
# Start Presentation
39+
view |> element("button", "Start Presentation") |> render_click(%{live: true})
40+
assert render(view) =~ "Presentation started."
41+
assert view |> element("button", "Start Presentation") |> render() =~ "disabled"
42+
43+
# Stop Presentation
44+
view |> element("button", "Stop Presentation") |> render_click(%{live: false})
45+
assert render(view) =~ "Presentation stopped."
46+
end
47+
end
48+
end
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
defmodule DevRoundWeb.HostingLobbyLive.ShowTest do
2+
use DevRoundWeb.ConnCase
3+
import Phoenix.LiveViewTest
4+
import DevRound.EventsFixtures
5+
import DevRound.AccountsFixtures
6+
7+
defp register_attendee(event, name, is_remote, langs, checked) do
8+
user =
9+
user_fixture(%{
10+
name: name,
11+
full_name: name,
12+
email: "#{String.replace(name, " ", "")}@example.com",
13+
experience_level: 5
14+
})
15+
16+
{:ok, attendee} =
17+
DevRound.Events.create_event_attendee(event, user, %{
18+
"is_remote" => is_remote,
19+
"lang_ids" => Enum.map(langs, & &1.id)
20+
})
21+
22+
{:ok, updated} = DevRound.Hosting.update_event_attendee_checked(attendee, checked)
23+
updated
24+
end
25+
26+
setup %{conn: conn} do
27+
user = user_fixture()
28+
lang = lang_fixture()
29+
30+
# Set registration deadline to future
31+
future_deadline = NaiveDateTime.add(NaiveDateTime.local_now(), 12, :hour)
32+
33+
event =
34+
event_fixture(%{
35+
put_langs: [lang],
36+
registration_deadline_local: future_deadline
37+
})
38+
39+
# Add user as host
40+
Ecto.Changeset.change(event)
41+
|> Ecto.Changeset.put_assoc(:event_hosts, [%DevRound.Events.EventHost{user_id: user.id}])
42+
|> DevRound.Repo.update!()
43+
44+
conn = log_in_user(conn, user)
45+
46+
%{conn: conn, event: event, host: user, lang: lang}
47+
end
48+
49+
describe "Hosting Lobby Show" do
50+
test "loads correctly and lists attendees", %{conn: conn, event: event, lang: lang} do
51+
register_attendee(event, "User 1", false, [lang], false)
52+
53+
{:ok, _view, html} = live(conn, ~p"/events/#{event}/hosting/lobby")
54+
55+
assert html =~ "User 1"
56+
end
57+
58+
test "denies access to non-host users", %{conn: conn, event: event} do
59+
conn = log_in_user(conn, user_fixture())
60+
61+
assert_raise DevRoundWeb.PermissionError, fn ->
62+
live(conn, ~p"/events/#{event}/hosting/lobby")
63+
end
64+
end
65+
66+
test "allows checking in and checking out attendees", %{conn: conn, event: event, lang: lang} do
67+
_attendee = register_attendee(event, "User 1", false, [lang], false)
68+
69+
{:ok, view, _html} = live(conn, ~p"/events/#{event}/hosting/lobby")
70+
71+
assert view |> element("button", "Check in") |> render()
72+
# In the template, "Check out" is disabled initially if not checked in.
73+
assert view |> element("button", "Check out") |> render() =~ "disabled"
74+
75+
# Check in
76+
view |> element("button", "Check in") |> render_click()
77+
refute view |> element("button", "Check out") |> render() =~ "disabled"
78+
79+
# Check out
80+
view |> element("button", "Check out") |> render_click()
81+
82+
assert view |> element("button", "Check in") |> render()
83+
end
84+
end
85+
end
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
defmodule DevRoundWeb.HostingSessionLive.ShowTest do
2+
use DevRoundWeb.ConnCase
3+
import Phoenix.LiveViewTest
4+
import DevRound.EventsFixtures
5+
import DevRound.AccountsFixtures
6+
import DevRound.HostingFixtures
7+
8+
defp team_fixture(session, lang, attrs) do
9+
%DevRound.Hosting.Team{}
10+
|> Ecto.Changeset.change(%{
11+
name: "some team #{System.unique_integer()}",
12+
slug: "some-team-#{System.unique_integer()}",
13+
session_id: session.id,
14+
lang_id: lang.id
15+
})
16+
|> Ecto.Changeset.change(attrs)
17+
|> DevRound.Repo.insert!()
18+
end
19+
20+
defp register_attendee(event, name, is_remote, langs, checked \\ true, experience \\ nil) do
21+
experience = experience || Enum.random(0..9)
22+
23+
user =
24+
user_fixture(%{
25+
name: name,
26+
full_name: name,
27+
email: "#{String.replace(name, " ", "")}@example.com",
28+
experience_level: experience
29+
})
30+
31+
{:ok, attendee} =
32+
DevRound.Events.create_event_attendee(event, user, %{
33+
"is_remote" => is_remote,
34+
"lang_ids" => Enum.map(langs, & &1.id)
35+
})
36+
37+
{:ok, _updated} = DevRound.Hosting.update_event_attendee_checked(attendee, checked)
38+
end
39+
40+
setup %{conn: conn} do
41+
user = user_fixture()
42+
lang = lang_fixture()
43+
44+
future_deadline = NaiveDateTime.add(NaiveDateTime.local_now(), 12, :hour)
45+
46+
event =
47+
event_fixture(%{
48+
put_langs: [lang],
49+
main_video_conference_room_url: "https://lecture.com",
50+
registration_deadline_local: future_deadline
51+
})
52+
53+
# Add user as host
54+
Ecto.Changeset.change(event)
55+
|> Ecto.Changeset.put_assoc(:event_hosts, [%DevRound.Events.EventHost{user_id: user.id}])
56+
|> DevRound.Repo.update!()
57+
58+
# Manually insert video conference rooms
59+
%DevRound.Events.TeamVideoConferenceRoom{}
60+
|> Ecto.Changeset.change(%{url: "https://room1.com", event_id: event.id})
61+
|> DevRound.Repo.insert!()
62+
63+
session = hd(event.sessions)
64+
conn = log_in_user(conn, user)
65+
66+
%{conn: conn, event: event, session: session, host: user, lang: lang}
67+
end
68+
69+
describe "Hosting Session Show" do
70+
test "loads correctly with video conference rooms preloaded", %{
71+
conn: conn,
72+
event: event,
73+
session: session
74+
} do
75+
assert {:ok, _view, _html} = live(conn, ~p"/events/#{event}/hosting/session/#{session}")
76+
end
77+
78+
test "denies access to non-host users", %{conn: conn, event: event, session: session} do
79+
conn = log_in_user(conn, user_fixture())
80+
81+
assert_raise DevRoundWeb.PermissionError, fn ->
82+
live(conn, ~p"/events/#{event}/hosting/session/#{session}")
83+
end
84+
end
85+
86+
test "can build teams and manage session lifecycle", %{
87+
conn: conn,
88+
event: event,
89+
session: session,
90+
lang: lang
91+
} do
92+
team_name_fixture()
93+
94+
# Register 2 checked-in attendees to satisfy team generation constraints
95+
register_attendee(event, "User 1", false, [lang])
96+
register_attendee(event, "User 2", false, [lang])
97+
98+
{:ok, view, html} = live(conn, ~p"/events/#{event}/hosting/session/#{session}")
99+
100+
assert html =~ "Build Teams"
101+
refute view |> element("button", "Build Teams") |> render() =~ "disabled"
102+
103+
# Build Teams
104+
view |> element("button", "Build Teams") |> render_click()
105+
106+
html = render(view)
107+
assert html =~ "Teams generated. You may start the session now."
108+
109+
# Start Session
110+
view |> element("button", "Start Session") |> render_click()
111+
112+
html = render(view)
113+
assert html =~ "started."
114+
# Countdown should be visible
115+
assert html =~ "Time Remaining"
116+
117+
# Stop/Return to Lecture
118+
view |> element("button", "Return to Lecture") |> render_click()
119+
assert_redirected(view, ~p"/events/#{event}/hosting/lecture")
120+
121+
# Re-visit the session liveview
122+
{:ok, view, _html} = live(conn, ~p"/events/#{event}/hosting/session/#{session}")
123+
124+
# Now it should be stopped natively but teams are still assigned.
125+
# Reset Session
126+
view |> element("button", "Reset Session") |> render_click()
127+
128+
html = render(view)
129+
assert html =~ "Session reset. You may build new teams now."
130+
assert html =~ "The teams for this session have not been assigned yet."
131+
end
132+
end
133+
134+
describe "PubSub events" do
135+
test "handles event update (title change)", %{conn: conn, event: event, session: session} do
136+
{:ok, view, _html} = live(conn, ~p"/events/#{event}/hosting/session/#{session}")
137+
138+
# Broadcast event update with new title
139+
# Changing event title (the event itself)
140+
new_event_title = "New Event Title"
141+
142+
updated_event =
143+
Ecto.Changeset.change(event, %{title: new_event_title})
144+
|> DevRound.Repo.update!(force: true)
145+
146+
# The view handler updates itself
147+
send(view.pid, {"updated", updated_event})
148+
assert render(view) =~ new_event_title
149+
end
150+
151+
test "handles team_built event", %{conn: conn, event: event, session: session, lang: lang} do
152+
{:ok, view, _html} = live(conn, ~p"/events/#{event}/hosting/session/#{session}")
153+
refute render(view) =~ "Team Bravo"
154+
155+
_team = team_fixture(session, lang, %{name: "Team Bravo"})
156+
157+
send(view.pid, %{
158+
topic: "event_sessions",
159+
event: "teams_built",
160+
payload: %{event_session_id: session.id}
161+
})
162+
163+
assert render(view) =~ "Team Bravo"
164+
end
165+
end
166+
end
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
defmodule DevRound.HostingFixtures do
2+
@moduledoc """
3+
This module defines test helpers for creating
4+
entities via the `DevRound.Hosting` context.
5+
"""
6+
7+
@doc """
8+
Generate a team_name.
9+
"""
10+
def team_name_fixture(attrs \\ %{}) do
11+
{:ok, team_name} =
12+
attrs
13+
|> Enum.into(%{
14+
name: "some name #{System.unique_integer()}"
15+
})
16+
|> DevRound.Hosting.create_team_name()
17+
18+
team_name
19+
end
20+
end

0 commit comments

Comments
 (0)