Skip to content

Commit 41026f5

Browse files
authored
fix: Filter team formation list (#1268)
* Add new method * Use new method * Fix credo error * Fix and update tests
1 parent 8466108 commit 41026f5

File tree

3 files changed

+50
-11
lines changed

3 files changed

+50
-11
lines changed

lib/cadet/accounts/teams.ex

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,26 @@ defmodule Cadet.Accounts.Teams do
1212
alias Cadet.Accounts.{Team, TeamMember, Notification}
1313
alias Cadet.Assessments.{Answer, Submission}
1414

15+
@doc """
16+
Returns all teams for a given course.
17+
18+
## Parameters
19+
20+
* `course_id` - The ID of the course.
21+
22+
## Returns
23+
24+
Returns a list of teams.
25+
26+
"""
27+
def all_teams_for_course(course_id) do
28+
Team
29+
|> join(:inner, [t], a in assoc(t, :assessment))
30+
|> where([t, a], a.course_id == ^course_id)
31+
|> Repo.all()
32+
|> Repo.preload(assessment: [:config], team_members: [student: [:user]])
33+
end
34+
1535
@doc """
1636
Creates a new team and assigns an assessment and team members to it.
1737

lib/cadet_web/admin_controllers/admin_teams_controller.ex

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,8 @@ defmodule CadetWeb.AdminTeamsController do
55

66
alias Cadet.Accounts.{Teams, Team}
77

8-
def index(conn, _params) do
9-
teams =
10-
Team
11-
|> Repo.all()
12-
|> Repo.preload(assessment: [:config], team_members: [student: [:user]])
8+
def index(conn, %{"course_id" => course_id}) do
9+
teams = Teams.all_teams_for_course(course_id)
1310

1411
team_formation_overviews =
1512
teams

test/cadet_web/admin_controllers/admin_teams_controller_test.exs

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,39 @@ defmodule CadetWeb.AdminTeamsControllerTest do
2828
end
2929

3030
@tag authenticate: :staff
31-
test "returns a list of teams", %{conn: conn} do
31+
test "returns a list of teams for the specified course only", %{conn: conn} do
3232
course_id = conn.assigns.course_id
33-
team = insert(:team)
34-
insert(:team_member, %{team: team})
35-
insert(:team_member, %{team: team})
33+
course = Repo.get(Course, course_id)
34+
assessment = insert(:assessment, %{course: course, max_team_size: 2})
35+
team1 = insert(:team, %{assessment: assessment})
36+
insert(:team_member, %{team: team1})
37+
insert(:team_member, %{team: team1})
38+
team2 = insert(:team, %{assessment: assessment})
39+
insert(:team_member, %{team: team2})
40+
insert(:team_member, %{team: team2})
3641

3742
conn = get(conn, build_url(course_id))
3843
assert response(conn, 200)
3944

40-
response_body = conn.resp_body |> Jason.decode!()
41-
assert Enum.any?(response_body, fn team_map -> team_map["teamId"] == team.id end)
45+
# Insert other random teams to test filtering
46+
other_course = insert(:course)
47+
other_assessment = insert(:assessment, %{course: other_course, max_team_size: 2})
48+
team3 = insert(:team, %{assessment: other_assessment})
49+
insert(:team_member, %{team: team3})
50+
insert(:team_member, %{team: team3})
51+
52+
response_body =
53+
conn.resp_body
54+
|> Jason.decode!()
55+
# Sort the teams by teamId for consistent testing
56+
|> Enum.sort_by(& &1["teamId"])
57+
58+
assert is_list(response_body)
59+
assert length(response_body) == 2
60+
assert response_body |> hd() |> Map.get("teamId") == team1.id
61+
assert response_body |> hd() |> Map.get("assessmentId") == assessment.id
62+
assert response_body |> tl() |> hd() |> Map.get("teamId") == team2.id
63+
assert response_body |> tl() |> hd() |> Map.get("assessmentId") == assessment.id
4264
end
4365
end
4466

0 commit comments

Comments
 (0)