From 858d020746cea46eab9576780313b55716132ca6 Mon Sep 17 00:00:00 2001 From: timmi Date: Sun, 23 Mar 2025 17:38:04 -0700 Subject: [PATCH 1/3] Implemented getTeamTasks service method and controller method. Added all tests required. Created repository method in TaskRepository. --- .../controller/TeamController.java | 14 + .../repository/TaskRepository.java | 3 + .../task_manager/service/TeamService.java | 244 +++++++++++------- .../controller_tests/TeamControllerTest.java | 54 +++- .../repository_tests/TaskRepositoryTest.java | 43 +++ .../service_tests/TeamServiceTest.java | 76 ++++-- 6 files changed, 302 insertions(+), 132 deletions(-) diff --git a/backend/task-manager/src/main/java/com/example/task_manager/controller/TeamController.java b/backend/task-manager/src/main/java/com/example/task_manager/controller/TeamController.java index 4705daca..65b2b2b9 100644 --- a/backend/task-manager/src/main/java/com/example/task_manager/controller/TeamController.java +++ b/backend/task-manager/src/main/java/com/example/task_manager/controller/TeamController.java @@ -4,10 +4,14 @@ import com.example.task_manager.DTO.TeamMemberDTO; import com.example.task_manager.DTO.TeamRequestDTO; import com.example.task_manager.service.TeamService; + import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; + import java.util.List; +import com.example.task_manager.DTO.TaskDTO; + @RestController @RequestMapping("/api/teams") public class TeamController { @@ -60,4 +64,14 @@ public ResponseEntity> getTeamMembers(@PathVariable int team return ResponseEntity.badRequest().build(); } } + + // Get all tasks assigned to a team + @GetMapping("/{teamId}/tasks") + public ResponseEntity> getTeamTasks(@PathVariable int teamId) { + try { + return ResponseEntity.ok(teamService.getTeamTasks(teamId)); + } catch (RuntimeException e) { + return ResponseEntity.badRequest().build(); + } + } } diff --git a/backend/task-manager/src/main/java/com/example/task_manager/repository/TaskRepository.java b/backend/task-manager/src/main/java/com/example/task_manager/repository/TaskRepository.java index 0c109006..ca284ddb 100644 --- a/backend/task-manager/src/main/java/com/example/task_manager/repository/TaskRepository.java +++ b/backend/task-manager/src/main/java/com/example/task_manager/repository/TaskRepository.java @@ -1,5 +1,7 @@ package com.example.task_manager.repository; +import java.util.List; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -8,4 +10,5 @@ @Repository public interface TaskRepository extends JpaRepository { + public List findByTeam_TeamId(int teamId); } diff --git a/backend/task-manager/src/main/java/com/example/task_manager/service/TeamService.java b/backend/task-manager/src/main/java/com/example/task_manager/service/TeamService.java index e94ac9b2..d8478ed8 100644 --- a/backend/task-manager/src/main/java/com/example/task_manager/service/TeamService.java +++ b/backend/task-manager/src/main/java/com/example/task_manager/service/TeamService.java @@ -5,120 +5,164 @@ import org.springframework.stereotype.Service; +import com.example.task_manager.DTO.TaskDTO; import com.example.task_manager.DTO.TeamDTO; import com.example.task_manager.DTO.TeamMemberDTO; +import com.example.task_manager.entity.IsAssigned; import com.example.task_manager.entity.IsMemberOf; +import com.example.task_manager.entity.Task; import com.example.task_manager.entity.Team; import com.example.task_manager.entity.TeamMember; import com.example.task_manager.repository.IsMemberOfRepository; +import com.example.task_manager.repository.TaskRepository; import com.example.task_manager.repository.TeamMemberRepository; import com.example.task_manager.repository.TeamRepository; +import com.sun.source.util.TaskListener; import jakarta.transaction.Transactional; @Service // Marks this class as a Spring service, allowing it to be injected where needed @Transactional public class TeamService { - - private final TeamMemberRepository teamMemberRepository; - private final TeamRepository teamRepository; - private final IsMemberOfRepository isMemberOfRepository; - - // Constructor injection for required repositories - public TeamService(TeamMemberRepository teamMemberRepository, - TeamRepository teamRepository, - IsMemberOfRepository isMemberOfRepository) { - this.teamMemberRepository = teamMemberRepository; - this.teamRepository = teamRepository; - this.isMemberOfRepository = isMemberOfRepository; - } - - /** - * Creates a new team with the specified team name and team lead. - * - * @param teamName The name of the team. - * @param teamLeadId The ID of the team lead. - * @return The created Team entity. - */ - public TeamDTO createTeam(String teamName, int teamLeadId) { - if (teamName == null || teamName.trim().isEmpty()) { - throw new RuntimeException("Team name cannot be empty"); - } - - TeamMember teamLead = teamMemberRepository.findById(teamLeadId) - .orElseThrow(() -> new RuntimeException("Team Lead not found with ID: " + teamLeadId)); - - Team team = new Team(); - team.setTeamName(teamName); - team.setTeamLead(teamLead); - - team = teamRepository.save(team); - return convertToDTO(team); - } - - /** - * Deletes a team by its ID. - * - * @param teamId The ID of the team to delete. - */ - public void deleteTeam(int teamId) { - Team team = teamRepository.findById(teamId) - .orElseThrow(() -> new RuntimeException("Team not found with ID: " + teamId)); - - teamRepository.delete(team); - } - - /** - * Changes the team lead of an existing team. - * - * @param teamId The ID of the team whose lead should be changed. - * @param teamLeadId The ID of the new team lead. - */ - public TeamDTO changeTeamLead(int teamId, String teamName, int teamLeadId) { - Team team = teamRepository.findById(teamId) - .orElseThrow(() -> new RuntimeException("Team not found with ID: " + teamId)); - - TeamMember teamMember = teamMemberRepository.findById(teamLeadId) - .orElseThrow(() -> new RuntimeException("Team Lead not found with ID: " + teamLeadId)); - - team.setTeamLead(teamMember); - team.setTeamName(teamName); - teamRepository.save(team); - - return new TeamDTO(team.getTeamId(), team.getTeamName(), team.getTeamLead().getAccountId()); - } - - /** - * Retrieves all members of a specified team. - * - * @param teamId The ID of the team. - * @return A list of TeamMembers belonging to the team. - */ - public List getTeamMembers(int teamId) { - Team team = teamRepository.findById(teamId) - .orElseThrow(() -> new RuntimeException("Team not found with ID: " + teamId)); - return isMemberOfRepository.findMembersByTeamId(teamId).stream() - .map(IsMemberOf::getTeamMember) - .map(this::convertToDTO) - .collect(Collectors.toList()); - } - - /** - * Converts a Team entity to a TeamDTO. - */ - private TeamDTO convertToDTO(Team team) { - return new TeamDTO( - team.getTeamId(), - team.getTeamName(), - team.getTeamLead() != null ? team.getTeamLead().getAccountId() : null - ); - } - - /** - * Converts a TeamMember entity to a TeamMemberDTO. - */ - private TeamMemberDTO convertToDTO(TeamMember teamMember) { + + private final TaskRepository taskRepository; + private final TeamMemberRepository teamMemberRepository; + private final TeamRepository teamRepository; + private final IsMemberOfRepository isMemberOfRepository; + + // Constructor injection for required repositories + public TeamService(TaskRepository taskRepository, TeamMemberRepository teamMemberRepository, + TeamRepository teamRepository, + IsMemberOfRepository isMemberOfRepository) { + this.taskRepository = taskRepository; + this.teamMemberRepository = teamMemberRepository; + this.teamRepository = teamRepository; + this.isMemberOfRepository = isMemberOfRepository; + } + + /** + * Creates a new team with the specified team name and team lead. + * + * @param teamName The name of the team. + * @param teamLeadId The ID of the team lead. + * @return The created Team entity. + */ + public TeamDTO createTeam(String teamName, int teamLeadId) { + if (teamName == null || teamName.trim().isEmpty()) { + throw new RuntimeException("Team name cannot be empty"); + } + + TeamMember teamLead = teamMemberRepository.findById(teamLeadId) + .orElseThrow(() -> new RuntimeException("Team Lead not found with ID: " + teamLeadId)); + + Team team = new Team(); + team.setTeamName(teamName); + team.setTeamLead(teamLead); + + team = teamRepository.save(team); + return convertToDTO(team); + } + + /** + * Deletes a team by its ID. + * + * @param teamId The ID of the team to delete. + */ + public void deleteTeam(int teamId) { + Team team = teamRepository.findById(teamId) + .orElseThrow(() -> new RuntimeException("Team not found with ID: " + teamId)); + + teamRepository.delete(team); + } + + /** + * Changes the team lead of an existing team. + * + * @param teamId The ID of the team whose lead should be changed. + * @param teamLeadId The ID of the new team lead. + */ + public TeamDTO changeTeamLead(int teamId, String teamName, int teamLeadId) { + Team team = teamRepository.findById(teamId) + .orElseThrow(() -> new RuntimeException("Team not found with ID: " + teamId)); + + TeamMember teamMember = teamMemberRepository.findById(teamLeadId) + .orElseThrow(() -> new RuntimeException("Team Lead not found with ID: " + teamLeadId)); + + team.setTeamLead(teamMember); + team.setTeamName(teamName); + teamRepository.save(team); + + return new TeamDTO(team.getTeamId(), team.getTeamName(), team.getTeamLead().getAccountId()); + } + + /** + * Retrieves all members of a specified team. + * + * @param teamId The ID of the team. + * @return A list of TeamMembers belonging to the team. + */ + public List getTeamMembers(int teamId) { + Team team = teamRepository.findById(teamId) + .orElseThrow(() -> new RuntimeException("Team not found with ID: " + teamId)); + return isMemberOfRepository.findMembersByTeamId(teamId).stream() + .map(IsMemberOf::getTeamMember) + .map(this::convertToDTO) + .collect(Collectors.toList()); + } + + /* + * Returns all tasks attached to a team + */ + public List getTeamTasks(int teamId) { + Team team = teamRepository.findById(teamId) + .orElseThrow(() -> new RuntimeException("Team not found with ID: " + teamId)); + + return taskRepository.findByTeam_TeamId(teamId).stream() + .map(this::convertToDTO) + .collect(Collectors.toList()); + } + + /* + * Converts a Task entity to a TaskDTO entity + */ + private TaskDTO convertToDTO(Task task) { + List members = task.getAssignedMembers().stream() + .map(IsAssigned::getTeamMember) + .map(member -> new TeamMemberDTO( + member.getAccountId(), + member.getUserName(), + member.getUserEmail(), + member.getRole())) + .collect(Collectors.toList()); + + return new TaskDTO( + task.getTaskId(), + task.getTitle(), + task.getDescription(), + task.isLocked(), + task.getStatus(), + task.getDateCreated(), + task.getDueDate(), + task.getTeam().getTeamId(), + members + ); + } + + /** + * Converts a Team entity to a TeamDTO. + */ + private TeamDTO convertToDTO(Team team) { + return new TeamDTO( + team.getTeamId(), + team.getTeamName(), + team.getTeamLead() != null ? team.getTeamLead().getAccountId() : null + ); + } + + /** + * Converts a TeamMember entity to a TeamMemberDTO. + */ + private TeamMemberDTO convertToDTO(TeamMember teamMember) { return new TeamMemberDTO(teamMember.getAccountId(), teamMember.getUserName(), teamMember.getUserEmail(), teamMember.getRole()); } } - diff --git a/backend/task-manager/src/test/java/com/example/task_manager/controller_tests/TeamControllerTest.java b/backend/task-manager/src/test/java/com/example/task_manager/controller_tests/TeamControllerTest.java index 6ec699a1..111c8951 100644 --- a/backend/task-manager/src/test/java/com/example/task_manager/controller_tests/TeamControllerTest.java +++ b/backend/task-manager/src/test/java/com/example/task_manager/controller_tests/TeamControllerTest.java @@ -1,11 +1,14 @@ package com.example.task_manager.controller_tests; +import java.time.LocalDate; + import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import com.example.task_manager.DTO.TaskDTO; import com.example.task_manager.DTO.TeamDTO; import com.example.task_manager.DTO.TeamMemberDTO; import com.example.task_manager.DTO.TeamRequestDTO; @@ -22,9 +25,12 @@ import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; +import java.util.Arrays; import java.util.Collections; import java.util.List; +import com.example.task_manager.entity.TeamMember; + @WebMvcTest(TeamController.class) public class TeamControllerTest { @@ -48,17 +54,17 @@ void testCreateTeam() throws Exception { int uniqueId = (int) System.nanoTime(); int teamLeadId = uniqueId + 1; String teamName = "Development Team " + uniqueId; - + TeamRequestDTO requestDTO = new TeamRequestDTO(uniqueId, teamName, teamLeadId); TeamDTO mockTeam = new TeamDTO(uniqueId, teamName, teamLeadId); - + when(teamService.createTeam(anyString(), anyInt())).thenReturn(mockTeam); mockMvc.perform(post("/api/teams") - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(requestDTO))) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.teamName").value(teamName)); + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(requestDTO))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.teamName").value(teamName)); } /** @@ -82,19 +88,19 @@ void testChangeTeamLead() throws Exception { int uniqueId = (int) System.nanoTime(); int newLeadId = uniqueId + 1; String newTeamName = "Engineering Team " + uniqueId; - + TeamRequestDTO requestDTO = new TeamRequestDTO(uniqueId, newTeamName, newLeadId); TeamDTO mockResponse = new TeamDTO(uniqueId, newTeamName, newLeadId); when(teamService.changeTeamLead(uniqueId, newTeamName, newLeadId)).thenReturn(mockResponse); mockMvc.perform(put("/api/teams/" + uniqueId + "/change-lead") - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(requestDTO))) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.teamId").value(uniqueId)) - .andExpect(jsonPath("$.teamName").value(newTeamName)) - .andExpect(jsonPath("$.teamLeadId").value(newLeadId)); + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(requestDTO))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.teamId").value(uniqueId)) + .andExpect(jsonPath("$.teamName").value(newTeamName)) + .andExpect(jsonPath("$.teamLeadId").value(newLeadId)); } /** @@ -117,4 +123,26 @@ void testGetTeamMembers() throws Exception { .andExpect(status().isOk()) .andExpect(jsonPath("$[0].userName").value(memberName)); } + + /* + * test getting all tasks connected to a team + */ + @Test + void testGetTeamTasks() throws Exception { + int teamId = 1; + + List mockTasks = Arrays.asList( + new TaskDTO(1, "Task 1", "Thing 1", false, "Open", LocalDate.now(), null, teamId, null), + new TaskDTO(2, "Task 2", "Thing 2", false, "Open", LocalDate.now(), null, teamId, null) + ); + + when(teamService.getTeamTasks(teamId)).thenReturn(mockTasks); + + mockMvc.perform(get("/api/teams/1/tasks")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$[0].taskId").value(1)) + .andExpect(jsonPath("$[0].title").value("Task 1")) + .andExpect(jsonPath("$[1].status").value("Open")) + .andExpect(jsonPath("$[1].teamId").value(teamId)); + } } diff --git a/backend/task-manager/src/test/java/com/example/task_manager/repository_tests/TaskRepositoryTest.java b/backend/task-manager/src/test/java/com/example/task_manager/repository_tests/TaskRepositoryTest.java index 9ad05bea..5dbca6ee 100644 --- a/backend/task-manager/src/test/java/com/example/task_manager/repository_tests/TaskRepositoryTest.java +++ b/backend/task-manager/src/test/java/com/example/task_manager/repository_tests/TaskRepositoryTest.java @@ -1,10 +1,53 @@ package com.example.task_manager.repository_tests; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.time.LocalDate; +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; import org.springframework.boot.test.context.SpringBootTest; +import com.example.task_manager.entity.Task; +import com.example.task_manager.entity.Team; +import com.example.task_manager.entity.TeamMember; +import com.example.task_manager.repository.TaskRepository; +import com.example.task_manager.repository.TeamMemberRepository; +import com.example.task_manager.repository.TeamRepository; + @SpringBootTest @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) public class TaskRepositoryTest { + @Autowired + private TaskRepository taskRepository; + + @Autowired + private TeamMemberRepository teamMemberRepository; + + @Autowired + private TeamRepository teamRepository; + + @Test + void testFindByTeam_TeamId() { + TeamMember teamMember = new TeamMember("Rush", "spirit_of_the_radio@music.com", "rush_music"); + teamMemberRepository.save(teamMember); + + Team team = new Team("Team 1", teamMember); + teamRepository.save(team); + + Task task = new Task("Fix Bugs", "Fix all critical bugs", team, false, "Open", LocalDate.now()); + taskRepository.save(task); + + List results = taskRepository.findByTeam_TeamId(team.getTeamId()); + + assertNotNull(results); + assertEquals(1, results.size()); + assertEquals("Fix Bugs", results.get(0).getTitle()); + assertEquals(team.getTeamId(), results.get(0).getTeam().getTeamId()); + } } diff --git a/backend/task-manager/src/test/java/com/example/task_manager/service_tests/TeamServiceTest.java b/backend/task-manager/src/test/java/com/example/task_manager/service_tests/TeamServiceTest.java index d743f2fe..7429ce76 100644 --- a/backend/task-manager/src/test/java/com/example/task_manager/service_tests/TeamServiceTest.java +++ b/backend/task-manager/src/test/java/com/example/task_manager/service_tests/TeamServiceTest.java @@ -1,5 +1,7 @@ package com.example.task_manager.service_tests; +import java.time.LocalDate; + import static org.junit.jupiter.api.Assertions.*; import java.util.List; @@ -9,11 +11,16 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.core.task.support.TaskExecutorAdapter; + +import com.example.task_manager.DTO.TaskDTO; import jakarta.transaction.Transactional; import com.example.task_manager.DTO.TeamDTO; import com.example.task_manager.DTO.TeamMemberDTO; +import com.example.task_manager.entity.IsAssigned; +import com.example.task_manager.entity.Task; import com.example.task_manager.entity.Team; import com.example.task_manager.entity.TeamMember; import com.example.task_manager.repository.TeamMemberRepository; @@ -60,16 +67,16 @@ public class TeamServiceTest { private TeamMember createUniqueTeamMember(String role) { return teamMemberRepository.save(new TeamMember( - role + "_" + System.nanoTime(), - role.toLowerCase() + System.nanoTime() + "@example.com", - "defaultpw" + role + "_" + System.nanoTime(), + role.toLowerCase() + System.nanoTime() + "@example.com", + "defaultpw" )); } private Team createUniqueTeam(TeamMember teamLead) { return teamRepository.save(new Team( - "Team_" + System.nanoTime(), - teamLead + "Team_" + System.nanoTime(), + teamLead )); } @@ -77,7 +84,7 @@ private Team createUniqueTeam(TeamMember teamLead) { void testCreateTeam() { TeamMember teamLead = createUniqueTeamMember("Lead"); String teamName = "QA Team " + System.nanoTime(); - + TeamDTO newTeam = teamService.createTeam(teamName, teamLead.getAccountId()); assertNotNull(newTeam); @@ -89,16 +96,16 @@ void testCreateTeam() { void testCreateTeamWithEmptyName() { TeamMember teamLead = createUniqueTeamMember("Lead"); - Exception exception = assertThrows(RuntimeException.class, - () -> teamService.createTeam("", teamLead.getAccountId())); + Exception exception = assertThrows(RuntimeException.class, + () -> teamService.createTeam("", teamLead.getAccountId())); assertTrue(exception.getMessage().contains("Team name cannot be empty")); } @Test void testCreateTeamWithNonExistentLead() { - Exception exception = assertThrows(RuntimeException.class, - () -> teamService.createTeam("New Team", 9999)); + Exception exception = assertThrows(RuntimeException.class, + () -> teamService.createTeam("New Team", 9999)); assertTrue(exception.getMessage().contains("Team Lead not found")); } @@ -116,8 +123,8 @@ void testDeleteTeam() { @Test void testDeleteNonExistentTeam() { - Exception exception = assertThrows(RuntimeException.class, - () -> teamService.deleteTeam(9999)); + Exception exception = assertThrows(RuntimeException.class, + () -> teamService.deleteTeam(9999)); assertTrue(exception.getMessage().contains("Team not found")); } @@ -148,8 +155,8 @@ void testChangeTeamLeadToNonExistentMember() { String newTeamName = "Updated Team Name"; - Exception exception = assertThrows(RuntimeException.class, - () -> teamService.changeTeamLead(team.getTeamId(), newTeamName, 9999)); + Exception exception = assertThrows(RuntimeException.class, + () -> teamService.changeTeamLead(team.getTeamId(), newTeamName, 9999)); assertTrue(exception.getMessage().contains("Team Lead not found")); } @@ -168,13 +175,13 @@ void testGetTeamMembers() { assertFalse(teamMembers.isEmpty()); assertTrue(teamMembers.stream() - .anyMatch(t -> t.getAccountId() == member.getAccountId())); + .anyMatch(t -> t.getAccountId() == member.getAccountId())); } @Test void testGetMembersOfNonExistentTeam() { - Exception exception = assertThrows(RuntimeException.class, - () -> teamService.getTeamMembers(9999)); + Exception exception = assertThrows(RuntimeException.class, + () -> teamService.getTeamMembers(9999)); assertTrue(exception.getMessage().contains("Team not found")); } @@ -183,8 +190,8 @@ void testGetMembersOfNonExistentTeam() { void testAddMemberToNonExistentTeam() { TeamMember member = createUniqueTeamMember("Member"); - Exception exception = assertThrows(RuntimeException.class, - () -> isMemberOfService.addMemberToTeam(member.getAccountId(), 9999)); + Exception exception = assertThrows(RuntimeException.class, + () -> isMemberOfService.addMemberToTeam(member.getAccountId(), 9999)); assertTrue(exception.getMessage().contains("Team not found")); } @@ -197,4 +204,35 @@ void testGetMembersOfTeamWithNoMembers() { List members = teamService.getTeamMembers(team.getTeamId()); assertTrue(members.isEmpty()); } + + @Test + void testGetTeamTasks() { + TeamMember teamMember = createUniqueTeamMember("ADMIN"); + Team team = createUniqueTeam(teamMember); + + Task task = new Task("Dire Straits", "Die Straits fan club.", team, false, "Open", LocalDate.now()); + + taskRepository.save(task); + + IsAssigned isAssigned = new IsAssigned(task, teamMember, team); + + isAssignedRepository.save(isAssigned); + + task.getAssignedMembers().add(isAssigned); + taskRepository.save(task); + + List teamTasks = teamService.getTeamTasks(team.getTeamId()); + + TaskDTO taskDTO = teamTasks.get(0); + assertEquals(task.getTaskId(), taskDTO.getTaskId()); + assertEquals("Dire Straits", taskDTO.getTitle()); + assertEquals(team.getTeamId(), taskDTO.getTeamId()); + assertEquals(1, taskDTO.getAssignedMembers().size()); + + TeamMemberDTO teamMemberDTO = taskDTO.getAssignedMembers().get(0); + assertEquals(teamMember.getAccountId(), teamMemberDTO.getAccountId()); + assertEquals(teamMember.getUserName(), teamMemberDTO.getUserName()); + + } + } From 106949307d5f51702ae1a2702a727eb770652bf6 Mon Sep 17 00:00:00 2001 From: timmi Date: Sun, 23 Mar 2025 18:29:38 -0700 Subject: [PATCH 2/3] Implemented frontend API endpoint and new test. Updated API documentation. --- API_DOCUMENTATION.md | 38 +++++++++++++++++++ frontend/react-app/src/api/teamApi.js | 19 ++++++++++ .../src/tests/api-tests/teamApiTest.test.js | 14 ++++++- 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/API_DOCUMENTATION.md b/API_DOCUMENTATION.md index 67b072b9..84ccb46a 100644 --- a/API_DOCUMENTATION.md +++ b/API_DOCUMENTATION.md @@ -411,6 +411,44 @@ All API requests should be made to the following base URL (Spring Boot's default ``` - **Description:** Returns a list of every team member in a team. Each list item contains the team member's ID, name, and email. +- **Get Team Tasks:** `GET /{teamId}/tasks` + - **Response Body:** + ```json + [ + { + "taskId": 1, + "title": "Task 1 title", + "description": "Task 1 description.", + "isLocked": false, + "status": "Open", + "dateCreated": "2025-03-24", + "dueDate": null, + "teamId": 2, + "assignedMembers": + [ + { + "accountId": 3, + "userName": "Team Member name", + "userEmail": "team_member@example.com", + "role": "TEAM_MEMBER" + } + ] + }, + { + "taskId": 4, + "title": "Task 2 title", + "description": "Task 2 description.", + "isLocked": false, + "status": "To-Do", + "dateCreated": "2025-03-24", + "dueDate": "2025-04-01", + "teamId": 2, + "assignedMembers": [] + } + ] + ``` + - **Description:** Returns a list of tasks connected to the team through the team members. + --- ## **TeamMemberController** diff --git a/frontend/react-app/src/api/teamApi.js b/frontend/react-app/src/api/teamApi.js index 7d4f820e..411bd54f 100644 --- a/frontend/react-app/src/api/teamApi.js +++ b/frontend/react-app/src/api/teamApi.js @@ -82,4 +82,23 @@ export const getTeamMembers = async (teamId) => { console.error("Error getting all team members: ", error); return null; } +}; + +export const getTeamTasks = async (teamId) => { + try { + const response = await fetch(`${BASE_URL}/${teamId}/tasks`, { + method: 'GET' + }); + + if (!response.ok) { + console.error(`Failed to return all tasks connected to a team: ${response.status} ${response.statusText}`); + return null; + } + + return await response.json(); + } + catch (error) { + console.error("Error returning all tasks connected to a team: ", error); + return null; + } }; \ No newline at end of file diff --git a/frontend/react-app/src/tests/api-tests/teamApiTest.test.js b/frontend/react-app/src/tests/api-tests/teamApiTest.test.js index 73a8db30..349bf528 100644 --- a/frontend/react-app/src/tests/api-tests/teamApiTest.test.js +++ b/frontend/react-app/src/tests/api-tests/teamApiTest.test.js @@ -1,4 +1,4 @@ -import { createTeam, deleteTeam, changeTeamLead, getTeamMembers } from '../../api/teamApi'; +import { createTeam, deleteTeam, changeTeamLead, getTeamMembers, getTeamTasks } from '../../api/teamApi'; const BASE_URL = "http://localhost:8080/api/teams"; @@ -77,4 +77,16 @@ describe('Team API', () => { expect(result).toEqual(true); }); + + //test: get all tasks connected to a team + test('getTeamTasks should rteurn task data on success', async () => { + fetch.mockResponseOnce(JSON.stringify(true), { status: 200 }); + + const result = await getTeamTasks(1); + expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/1/tasks`, { + method: 'GET' + }); + + expect(result).toEqual(true); + }); }); \ No newline at end of file From b1562772ee3848718709a2ab9eb72cd40f7dc7a1 Mon Sep 17 00:00:00 2001 From: timmi Date: Tue, 25 Mar 2025 21:50:32 -0700 Subject: [PATCH 3/3] Fixing tests and TaskDTO fields to have the task priority. --- .../java/com/example/task_manager/service/TeamService.java | 3 ++- .../task_manager/controller_tests/TeamControllerTest.java | 5 +++-- .../task_manager/repository_tests/TaskRepositoryTest.java | 3 ++- .../example/task_manager/service_tests/TeamServiceTest.java | 3 ++- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/backend/task-manager/src/main/java/com/example/task_manager/service/TeamService.java b/backend/task-manager/src/main/java/com/example/task_manager/service/TeamService.java index d8478ed8..3aa1dcdc 100644 --- a/backend/task-manager/src/main/java/com/example/task_manager/service/TeamService.java +++ b/backend/task-manager/src/main/java/com/example/task_manager/service/TeamService.java @@ -144,7 +144,8 @@ private TaskDTO convertToDTO(Task task) { task.getDateCreated(), task.getDueDate(), task.getTeam().getTeamId(), - members + members, + task.getPriority() ); } diff --git a/backend/task-manager/src/test/java/com/example/task_manager/controller_tests/TeamControllerTest.java b/backend/task-manager/src/test/java/com/example/task_manager/controller_tests/TeamControllerTest.java index fabbbfd3..7ae2c18e 100644 --- a/backend/task-manager/src/test/java/com/example/task_manager/controller_tests/TeamControllerTest.java +++ b/backend/task-manager/src/test/java/com/example/task_manager/controller_tests/TeamControllerTest.java @@ -14,6 +14,7 @@ import com.example.task_manager.DTO.TeamRequestDTO; import com.example.task_manager.controller.TeamController; import com.example.task_manager.enums.RoleType; +import com.example.task_manager.enums.TaskPriority; import com.example.task_manager.service.TeamService; import com.fasterxml.jackson.databind.ObjectMapper; @@ -134,8 +135,8 @@ void testGetTeamTasks() throws Exception { int teamId = 1; List mockTasks = Arrays.asList( - new TaskDTO(1, "Task 1", "Thing 1", false, "Open", LocalDate.now(), null, teamId, null), - new TaskDTO(2, "Task 2", "Thing 2", false, "Open", LocalDate.now(), null, teamId, null) + new TaskDTO(1, "Task 1", "Thing 1", false, "Open", LocalDate.now(), null, teamId, null, TaskPriority.HIGH), + new TaskDTO(2, "Task 2", "Thing 2", false, "Open", LocalDate.now(), null, teamId, null, TaskPriority.HIGH) ); when(teamService.getTeamTasks(teamId)).thenReturn(mockTasks); diff --git a/backend/task-manager/src/test/java/com/example/task_manager/repository_tests/TaskRepositoryTest.java b/backend/task-manager/src/test/java/com/example/task_manager/repository_tests/TaskRepositoryTest.java index bf4f3edb..40d0f17a 100644 --- a/backend/task-manager/src/test/java/com/example/task_manager/repository_tests/TaskRepositoryTest.java +++ b/backend/task-manager/src/test/java/com/example/task_manager/repository_tests/TaskRepositoryTest.java @@ -16,6 +16,7 @@ import com.example.task_manager.entity.Task; import com.example.task_manager.entity.Team; import com.example.task_manager.entity.TeamMember; +import com.example.task_manager.enums.TaskPriority; import com.example.task_manager.repository.TaskRepository; import com.example.task_manager.repository.TeamMemberRepository; import com.example.task_manager.repository.TeamRepository; @@ -42,7 +43,7 @@ void testFindByTeam_TeamId() { Team team = new Team("Team 1", teamMember); teamRepository.save(team); - Task task = new Task("Fix Bugs", "Fix all critical bugs", team, false, "Open", LocalDate.now()); + Task task = new Task("Fix Bugs", "Fix all critical bugs", team, false, "Open", LocalDate.now(), TaskPriority.HIGH); taskRepository.save(task); List results = taskRepository.findByTeam_TeamId(team.getTeamId()); diff --git a/backend/task-manager/src/test/java/com/example/task_manager/service_tests/TeamServiceTest.java b/backend/task-manager/src/test/java/com/example/task_manager/service_tests/TeamServiceTest.java index 5cf7d302..66d82e39 100644 --- a/backend/task-manager/src/test/java/com/example/task_manager/service_tests/TeamServiceTest.java +++ b/backend/task-manager/src/test/java/com/example/task_manager/service_tests/TeamServiceTest.java @@ -23,6 +23,7 @@ import com.example.task_manager.entity.Task; import com.example.task_manager.entity.Team; import com.example.task_manager.entity.TeamMember; +import com.example.task_manager.enums.TaskPriority; import com.example.task_manager.repository.TeamMemberRepository; import com.example.task_manager.repository.TeamRepository; import com.example.task_manager.repository.AdminRepository; @@ -211,7 +212,7 @@ void testGetTeamTasks() { TeamMember teamMember = createUniqueTeamMember("ADMIN"); Team team = createUniqueTeam(teamMember); - Task task = new Task("Dire Straits", "Die Straits fan club.", team, false, "Open", LocalDate.now()); + Task task = new Task("Dire Straits", "Die Straits fan club.", team, false, "Open", LocalDate.now(), TaskPriority.HIGH); taskRepository.save(task);