From 9a1e2d1d24dab6a33713024239e17cc6271b4565 Mon Sep 17 00:00:00 2001 From: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Tue, 1 Jul 2025 11:05:27 +0800 Subject: [PATCH 1/4] Add new method --- lib/cadet/accounts/teams.ex | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/lib/cadet/accounts/teams.ex b/lib/cadet/accounts/teams.ex index 131b9ca24..f8248fd68 100644 --- a/lib/cadet/accounts/teams.ex +++ b/lib/cadet/accounts/teams.ex @@ -12,6 +12,26 @@ defmodule Cadet.Accounts.Teams do alias Cadet.Accounts.{Team, TeamMember, Notification} alias Cadet.Assessments.{Answer, Submission} + @doc """ + Returns all teams for a given course. + + ## Parameters + + * `course_id` - The ID of the course. + + ## Returns + + Returns a list of teams. + + """ + def all_teams_for_course(course_id) do + Team + |> join(:inner, [t], a in assoc(t, :assessment)) + |> where([t, a], a.course_id == ^course_id) + |> Repo.all() + |> Repo.preload(assessment: [:config], team_members: [student: [:user]]) + end + @doc """ Creates a new team and assigns an assessment and team members to it. From 912285802752c3387e93f825266811d8a210f696 Mon Sep 17 00:00:00 2001 From: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Tue, 1 Jul 2025 11:05:46 +0800 Subject: [PATCH 2/4] Use new method --- .../admin_controllers/admin_teams_controller.ex | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/lib/cadet_web/admin_controllers/admin_teams_controller.ex b/lib/cadet_web/admin_controllers/admin_teams_controller.ex index c91974404..9c70b8e87 100644 --- a/lib/cadet_web/admin_controllers/admin_teams_controller.ex +++ b/lib/cadet_web/admin_controllers/admin_teams_controller.ex @@ -5,14 +5,9 @@ defmodule CadetWeb.AdminTeamsController do alias Cadet.Accounts.{Teams, Team} - def index(conn, _params) do - teams = - Team - |> Repo.all() - |> Repo.preload(assessment: [:config], team_members: [student: [:user]]) - + def index(conn, %{"course_id" => course_id}) do team_formation_overviews = - teams + Teams.all_teams_for_course(course_id) |> Enum.map(&team_to_team_formation_overview/1) conn From bf52f8231ca4ea30b9a5e9d22c95b5facdcf5cc3 Mon Sep 17 00:00:00 2001 From: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Tue, 1 Jul 2025 13:05:54 +0800 Subject: [PATCH 3/4] Fix credo error --- lib/cadet_web/admin_controllers/admin_teams_controller.ex | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/cadet_web/admin_controllers/admin_teams_controller.ex b/lib/cadet_web/admin_controllers/admin_teams_controller.ex index 9c70b8e87..30349e772 100644 --- a/lib/cadet_web/admin_controllers/admin_teams_controller.ex +++ b/lib/cadet_web/admin_controllers/admin_teams_controller.ex @@ -6,8 +6,10 @@ defmodule CadetWeb.AdminTeamsController do alias Cadet.Accounts.{Teams, Team} def index(conn, %{"course_id" => course_id}) do + teams = Teams.all_teams_for_course(course_id) + team_formation_overviews = - Teams.all_teams_for_course(course_id) + teams |> Enum.map(&team_to_team_formation_overview/1) conn From 99c50b18bbed74ae2cf0d701227d54597e476e72 Mon Sep 17 00:00:00 2001 From: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Tue, 1 Jul 2025 22:55:20 +0800 Subject: [PATCH 4/4] Fix and update tests --- .../admin_teams_controller_test.exs | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/test/cadet_web/admin_controllers/admin_teams_controller_test.exs b/test/cadet_web/admin_controllers/admin_teams_controller_test.exs index 32d2a517e..55f68a8af 100644 --- a/test/cadet_web/admin_controllers/admin_teams_controller_test.exs +++ b/test/cadet_web/admin_controllers/admin_teams_controller_test.exs @@ -28,17 +28,39 @@ defmodule CadetWeb.AdminTeamsControllerTest do end @tag authenticate: :staff - test "returns a list of teams", %{conn: conn} do + test "returns a list of teams for the specified course only", %{conn: conn} do course_id = conn.assigns.course_id - team = insert(:team) - insert(:team_member, %{team: team}) - insert(:team_member, %{team: team}) + course = Repo.get(Course, course_id) + assessment = insert(:assessment, %{course: course, max_team_size: 2}) + team1 = insert(:team, %{assessment: assessment}) + insert(:team_member, %{team: team1}) + insert(:team_member, %{team: team1}) + team2 = insert(:team, %{assessment: assessment}) + insert(:team_member, %{team: team2}) + insert(:team_member, %{team: team2}) conn = get(conn, build_url(course_id)) assert response(conn, 200) - response_body = conn.resp_body |> Jason.decode!() - assert Enum.any?(response_body, fn team_map -> team_map["teamId"] == team.id end) + # Insert other random teams to test filtering + other_course = insert(:course) + other_assessment = insert(:assessment, %{course: other_course, max_team_size: 2}) + team3 = insert(:team, %{assessment: other_assessment}) + insert(:team_member, %{team: team3}) + insert(:team_member, %{team: team3}) + + response_body = + conn.resp_body + |> Jason.decode!() + # Sort the teams by teamId for consistent testing + |> Enum.sort_by(& &1["teamId"]) + + assert is_list(response_body) + assert length(response_body) == 2 + assert response_body |> hd() |> Map.get("teamId") == team1.id + assert response_body |> hd() |> Map.get("assessmentId") == assessment.id + assert response_body |> tl() |> hd() |> Map.get("teamId") == team2.id + assert response_body |> tl() |> hd() |> Map.get("assessmentId") == assessment.id end end