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. diff --git a/lib/cadet_web/admin_controllers/admin_teams_controller.ex b/lib/cadet_web/admin_controllers/admin_teams_controller.ex index c91974404..30349e772 100644 --- a/lib/cadet_web/admin_controllers/admin_teams_controller.ex +++ b/lib/cadet_web/admin_controllers/admin_teams_controller.ex @@ -5,11 +5,8 @@ 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 + teams = Teams.all_teams_for_course(course_id) team_formation_overviews = teams 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