From 9a747ccc2d7474d4e9b84b2eb315965f26a40b69 Mon Sep 17 00:00:00 2001 From: Aaron Detre Date: Mon, 7 Apr 2025 12:25:12 -0700 Subject: [PATCH] refactor(UserAPIController): Extract RunInfoController --- .../controllers/run/RunInfoAPIController.java | 92 +++++++++++++++++++ .../student/StudentAPIController.java | 9 -- .../controllers/user/UserAPIController.java | 43 --------- .../run/RunInfoAPIControllerTest.java | 77 ++++++++++++++++ .../student/StudentAPIControllerTest.java | 26 +----- .../user/UserAPIControllerTest.java | 28 ------ 6 files changed, 170 insertions(+), 105 deletions(-) create mode 100644 src/main/java/org/wise/portal/presentation/web/controllers/run/RunInfoAPIController.java create mode 100644 src/test/java/org/wise/portal/presentation/web/controllers/run/RunInfoAPIControllerTest.java diff --git a/src/main/java/org/wise/portal/presentation/web/controllers/run/RunInfoAPIController.java b/src/main/java/org/wise/portal/presentation/web/controllers/run/RunInfoAPIController.java new file mode 100644 index 0000000000..6c72a7f990 --- /dev/null +++ b/src/main/java/org/wise/portal/presentation/web/controllers/run/RunInfoAPIController.java @@ -0,0 +1,92 @@ +package org.wise.portal.presentation.web.controllers.run; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.springframework.security.core.Authentication; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.annotation.Secured; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.wise.portal.dao.ObjectNotFoundException; +import org.wise.portal.domain.group.Group; +import org.wise.portal.domain.run.Run; +import org.wise.portal.domain.user.User; +import org.wise.portal.service.run.RunService; +import org.wise.portal.service.user.UserService; + +/** + * Run Info REST API + * + * @author Hiroki Terashima + * @author Geoffrey Kwan + * @author Jonathan Lim-Breitbart + * @author Aaron Detre + */ +@RestController +@RequestMapping("/api/run-info") +public class RunInfoAPIController { + + @Autowired + private RunService runService; + + @Autowired + private UserService userService; + + @Secured("ROLE_USER") + @GetMapping("/run/info-by-id") + HashMap getRunInfoById(Authentication auth, @RequestParam("runId") Long runId) { + try { + User user = userService.retrieveUserByUsername(auth.getName()); + Run run = runService.retrieveById(runId); + if (userService.isUserAssociatedWithRun(user, run)) { + return getRunInfo(run); + } + } catch (ObjectNotFoundException e) { + } + return createRunNotFoundInfo(); + } + + private HashMap getRunInfo(Run run) { + HashMap info = new HashMap(); + info.put("id", String.valueOf(run.getId())); + info.put("name", run.getName()); + info.put("runCode", run.getRuncode()); + info.put("startTime", run.getStartTimeMilliseconds()); + info.put("endTime", run.getEndTimeMilliseconds()); + info.put("periods", getPeriodNames(run)); + User owner = run.getOwner(); + info.put("teacherFirstName", owner.getUserDetails().getFirstname()); + info.put("teacherLastName", owner.getUserDetails().getLastname()); + info.put("wiseVersion", run.getProject().getWiseVersion()); + return info; + } + + private List getPeriodNames(Run run) { + List periods = new ArrayList(); + for (Group period : run.getPeriods()) { + periods.add(period.getName()); + } + return periods; + } + + private HashMap createRunNotFoundInfo() { + HashMap info = new HashMap(); + info.put("error", "runNotFound"); + return info; + } + + @GetMapping("/run/info") + HashMap getRunInfoByRunCode(@RequestParam("runCode") String runCode) { + try { + return getRunInfo(runService.retrieveRunByRuncode(runCode)); + } catch (ObjectNotFoundException e) { + return createRunNotFoundInfo(); + } + } + +} + diff --git a/src/main/java/org/wise/portal/presentation/web/controllers/student/StudentAPIController.java b/src/main/java/org/wise/portal/presentation/web/controllers/student/StudentAPIController.java index b8fd565ad6..dbd089162c 100644 --- a/src/main/java/org/wise/portal/presentation/web/controllers/student/StudentAPIController.java +++ b/src/main/java/org/wise/portal/presentation/web/controllers/student/StudentAPIController.java @@ -112,15 +112,6 @@ List> getRuns(Authentication authentication) { return runList; } - @GetMapping("/run/info") - HashMap getRunInfoByRunCode(@RequestParam("runCode") String runCode) { - try { - return getRunInfo(runService.retrieveRunByRuncode(runCode)); - } catch (ObjectNotFoundException e) { - return createRunNotFoundInfo(); - } - } - @PostMapping("/run/launch") HashMap launchRun(Authentication auth, @RequestParam("runId") Long runId, @RequestParam(value = "workgroupId", required = false) Long workgroupId, diff --git a/src/main/java/org/wise/portal/presentation/web/controllers/user/UserAPIController.java b/src/main/java/org/wise/portal/presentation/web/controllers/user/UserAPIController.java index ddf66aab1c..b53aeb566b 100644 --- a/src/main/java/org/wise/portal/presentation/web/controllers/user/UserAPIController.java +++ b/src/main/java/org/wise/portal/presentation/web/controllers/user/UserAPIController.java @@ -230,49 +230,6 @@ List> getSupportedLanguages() { return langs; } - @Secured("ROLE_USER") - @GetMapping("/run/info-by-id") - HashMap getRunInfoById(Authentication auth, @RequestParam("runId") Long runId) { - try { - User user = userService.retrieveUserByUsername(auth.getName()); - Run run = runService.retrieveById(runId); - if (userService.isUserAssociatedWithRun(user, run)) { - return getRunInfo(run); - } - } catch (ObjectNotFoundException e) { - } - return createRunNotFoundInfo(); - } - - protected HashMap getRunInfo(Run run) { - HashMap info = new HashMap(); - info.put("id", String.valueOf(run.getId())); - info.put("name", run.getName()); - info.put("runCode", run.getRuncode()); - info.put("startTime", run.getStartTimeMilliseconds()); - info.put("endTime", run.getEndTimeMilliseconds()); - info.put("periods", getPeriodNames(run)); - User owner = run.getOwner(); - info.put("teacherFirstName", owner.getUserDetails().getFirstname()); - info.put("teacherLastName", owner.getUserDetails().getLastname()); - info.put("wiseVersion", run.getProject().getWiseVersion()); - return info; - } - - private List getPeriodNames(Run run) { - List periods = new ArrayList(); - for (Group period : run.getPeriods()) { - periods.add(period.getName()); - } - return periods; - } - - protected HashMap createRunNotFoundInfo() { - HashMap info = new HashMap(); - info.put("error", "runNotFound"); - return info; - } - private String getLanguageName(String localeString) { if (localeString.toLowerCase().equals("zh_tw")) { return "Chinese (Traditional)"; diff --git a/src/test/java/org/wise/portal/presentation/web/controllers/run/RunInfoAPIControllerTest.java b/src/test/java/org/wise/portal/presentation/web/controllers/run/RunInfoAPIControllerTest.java new file mode 100644 index 0000000000..067f148d9b --- /dev/null +++ b/src/test/java/org/wise/portal/presentation/web/controllers/run/RunInfoAPIControllerTest.java @@ -0,0 +1,77 @@ +package org.wise.portal.presentation.web.controllers.run; + +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.verify; +import static org.junit.Assert.assertEquals; + +import java.util.HashMap; + +import org.easymock.EasyMockExtension; +import org.easymock.TestSubject; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.wise.portal.dao.ObjectNotFoundException; +import org.wise.portal.domain.run.Run; +import org.wise.portal.presentation.web.controllers.APIControllerTest; + +@ExtendWith(EasyMockExtension.class) +public class RunInfoAPIControllerTest extends APIControllerTest { + + @TestSubject + private RunInfoAPIController runInfoAPIController = new RunInfoAPIController(); + + @BeforeEach + public void setUp() { + super.setUp(); + } + + @Test + public void getRunInfoById_RunExistsInDB_ReturnRunInfo() throws ObjectNotFoundException { + expect(userService.retrieveUserByUsername(TEACHER_USERNAME)).andReturn(teacher1); + expect(userService.isUserAssociatedWithRun(teacher1, run1)).andReturn(true); + replay(userService); + expect(runService.retrieveById(runId1)).andReturn(run1); + replay(runService); + HashMap info = runInfoAPIController.getRunInfoById(teacherAuth, runId1); + assertEquals("1", info.get("id")); + assertEquals(RUN1_RUNCODE, info.get("runCode")); + verify(runService); + } + + @Test + public void getRunInfoById_RunNotInDB_ReturnRunInfo() throws ObjectNotFoundException { + Long runIdNotInDB = -1L; + expect(runService.retrieveById(runIdNotInDB)) + .andThrow(new ObjectNotFoundException(runIdNotInDB, Run.class)); + replay(runService); + HashMap info = runInfoAPIController.getRunInfoById(teacherAuth, runIdNotInDB); + assertEquals(1, info.size()); + assertEquals("runNotFound", info.get("error")); + verify(runService); + } + + @Test + public void getRunInfoByRunCode_RunExistsInDB_ReturnRunInfo() throws ObjectNotFoundException { + expect(runService.retrieveRunByRuncode(RUN1_RUNCODE)).andReturn(run1); + replay(runService); + HashMap info = runInfoAPIController.getRunInfoByRunCode(RUN1_RUNCODE); + assertEquals("1", info.get("id")); + assertEquals(RUN1_RUNCODE, info.get("runCode")); + verify(runService); + } + + @Test + public void getRunInfoByRunCode_RunNotInDB_ReturnRunInfo() throws ObjectNotFoundException { + String runCodeNotInDB = "runCodeNotInDB"; + expect(runService.retrieveRunByRuncode(runCodeNotInDB)) + .andThrow(new ObjectNotFoundException(runCodeNotInDB, Run.class)); + replay(runService); + HashMap info = runInfoAPIController.getRunInfoByRunCode(runCodeNotInDB); + assertEquals(1, info.size()); + assertEquals("runNotFound", info.get("error")); + verify(runService); + } +} + diff --git a/src/test/java/org/wise/portal/presentation/web/controllers/student/StudentAPIControllerTest.java b/src/test/java/org/wise/portal/presentation/web/controllers/student/StudentAPIControllerTest.java index c302265a4e..914dee69f2 100644 --- a/src/test/java/org/wise/portal/presentation/web/controllers/student/StudentAPIControllerTest.java +++ b/src/test/java/org/wise/portal/presentation/web/controllers/student/StudentAPIControllerTest.java @@ -14,13 +14,11 @@ import java.util.Set; import org.easymock.EasyMockExtension; -import org.easymock.EasyMockRunner; import org.easymock.Mock; import org.easymock.TestSubject; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.runner.RunWith; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.util.ReflectionTestUtils; @@ -122,29 +120,7 @@ public void launchRun_OnePresentUser_LaunchRun() throws Exception { verify(request); } - @Test - public void getRunInfoByRunCode_RunExistsInDB_ReturnRunInfo() throws ObjectNotFoundException { - expect(runService.retrieveRunByRuncode(RUN1_RUNCODE)).andReturn(run1); - replay(runService); - HashMap info = studentAPIController.getRunInfoByRunCode(RUN1_RUNCODE); - assertEquals("1", info.get("id")); - assertEquals(RUN1_RUNCODE, info.get("runCode")); - verify(runService); - } - - @Test - public void getRunInfoByRunCode_RunNotInDB_ReturnRunInfo() throws ObjectNotFoundException { - String runCodeNotInDB = "runCodeNotInDB"; - expect(runService.retrieveRunByRuncode(runCodeNotInDB)) - .andThrow(new ObjectNotFoundException(runCodeNotInDB, Run.class)); - replay(runService); - HashMap info = studentAPIController.getRunInfoByRunCode(runCodeNotInDB); - assertEquals(1, info.size()); - assertEquals("runNotFound", info.get("error")); - verify(runService); - } - - @Test + @Test public void getSecurityQuestions_DefaultQuestions_ReturnSixQuestions() { expect(i18nProperties.getProperty("accountquestions.QUESTION_ONE")) .andReturn("account question 1"); diff --git a/src/test/java/org/wise/portal/presentation/web/controllers/user/UserAPIControllerTest.java b/src/test/java/org/wise/portal/presentation/web/controllers/user/UserAPIControllerTest.java index d3c24a46be..f04cbf5f7a 100644 --- a/src/test/java/org/wise/portal/presentation/web/controllers/user/UserAPIControllerTest.java +++ b/src/test/java/org/wise/portal/presentation/web/controllers/user/UserAPIControllerTest.java @@ -21,8 +21,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.core.Authentication; import org.springframework.test.util.ReflectionTestUtils; -import org.wise.portal.dao.ObjectNotFoundException; -import org.wise.portal.domain.run.Run; import org.wise.portal.presentation.web.controllers.APIControllerTest; import org.wise.portal.presentation.web.exception.IncorrectPasswordException; import org.wise.portal.service.password.impl.PasswordServiceImpl; @@ -226,30 +224,4 @@ public void createRegisterSuccessResponse_Username_ReturnSuccessResponse() { assertEquals(response.getStatusCode(), HttpStatus.OK); assertEquals(response.getBody().get("username"), username); } - - @Test - public void getRunInfoById_RunExistsInDB_ReturnRunInfo() throws ObjectNotFoundException { - expect(userService.retrieveUserByUsername(TEACHER_USERNAME)).andReturn(teacher1); - expect(userService.isUserAssociatedWithRun(teacher1, run1)).andReturn(true); - replay(userService); - expect(runService.retrieveById(runId1)).andReturn(run1); - replay(runService); - HashMap info = userAPIController.getRunInfoById(teacherAuth, runId1); - assertEquals("1", info.get("id")); - assertEquals(RUN1_RUNCODE, info.get("runCode")); - verify(runService); - } - - @Test - public void getRunInfoById_RunNotInDB_ReturnRunInfo() throws ObjectNotFoundException { - Long runIdNotInDB = -1L; - expect(runService.retrieveById(runIdNotInDB)) - .andThrow(new ObjectNotFoundException(runIdNotInDB, Run.class)); - replay(runService); - HashMap info = userAPIController.getRunInfoById(teacherAuth, runIdNotInDB); - assertEquals(1, info.size()); - assertEquals("runNotFound", info.get("error")); - verify(runService); - } - }