From f5edeffd4da8eb4022aa2ba97d669fbb26619977 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Tue, 17 Feb 2026 16:11:55 +0000 Subject: [PATCH 01/38] Prefer EasyMock over PowerMock for mocking public methods --- src/test/java/uk/ac/cam/cl/dtg/isaac/IsaacTest.java | 8 ++++---- .../dtg/isaac/api/managers/QuizAssignmentManagerTest.java | 4 ++-- .../cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java | 4 ++-- .../ac/cam/cl/dtg/isaac/api/managers/QuizManagerTest.java | 6 +++--- .../dtg/isaac/api/managers/QuizQuestionManagerTest.java | 4 ++-- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/IsaacTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/IsaacTest.java index 517bd5cab5..ac124865b5 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/IsaacTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/IsaacTest.java @@ -56,13 +56,13 @@ import static org.easymock.EasyMock.anyLong; import static org.easymock.EasyMock.anyObject; +import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.getCurrentArguments; import static org.easymock.EasyMock.partialMockBuilder; -import static org.powermock.api.easymock.PowerMock.createMock; -import static org.powermock.api.easymock.PowerMock.replay; -import static org.powermock.api.easymock.PowerMock.reset; -import static org.powermock.api.easymock.PowerMock.verify; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.reset; +import static org.easymock.EasyMock.verify; public class IsaacTest { protected static Date somePastDate = new Date(System.currentTimeMillis() - 7*24*60*60*1000); diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java index db73398b9e..4972c2fb70 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java @@ -30,13 +30,13 @@ import java.util.List; import static org.easymock.EasyMock.anyObject; +import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.resetToNice; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.powermock.api.easymock.PowerMock.createMock; -import static org.powermock.api.easymock.PowerMock.replay; import static uk.ac.cam.cl.dtg.segue.api.Constants.HOST_NAME; public class QuizAssignmentManagerTest extends AbstractManagerTest { diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java index 8d332126a9..4773efc6f6 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java @@ -28,10 +28,10 @@ import java.util.List; import java.util.Objects; +import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; import static org.junit.Assert.assertEquals; -import static org.powermock.api.easymock.PowerMock.createMock; -import static org.powermock.api.easymock.PowerMock.replay; public class QuizAttemptManagerTest extends AbstractManagerTest { private static final Long TEST_ID = 0xC0000000000L; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizManagerTest.java index b62560692f..e8e30595b9 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizManagerTest.java @@ -15,11 +15,11 @@ import java.util.List; +import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThrows; -import static org.powermock.api.easymock.PowerMock.createMock; -import static org.powermock.api.easymock.PowerMock.replayAll; public class QuizManagerTest extends AbstractManagerTest { @@ -39,7 +39,7 @@ public void setUp() { brokenQuiz = new IsaacQuizDTO(); brokenQuiz.setChildren(ImmutableList.of(quizSection1, new ContentDTO(), quizSection2)); - replayAll(); + replay(properties, contentService, contentManager, contentSummarizerService); } @Test diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java index f175bd82b0..1a16d68806 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java @@ -46,14 +46,14 @@ import static java.util.Collections.singleton; import static java.util.Collections.singletonList; +import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import static org.powermock.api.easymock.PowerMock.createMock; -import static org.powermock.api.easymock.PowerMock.replay; public class QuizQuestionManagerTest extends AbstractManagerTest { From cc757a0ecb03b00c5fdd6dcddcd38f46ae698a5e Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Tue, 17 Feb 2026 16:51:17 +0000 Subject: [PATCH 02/38] Move name ordering from group manager to utility class so that we no longer need Whitebox to test it as a private member of the manager --- .../dtg/segue/api/managers/GroupManager.java | 22 ++---------- .../uk/ac/cam/cl/dtg/util/NameOrderer.java | 36 +++++++++++++++++++ .../NameOrdererTest.java} | 26 +++++--------- 3 files changed, 47 insertions(+), 37 deletions(-) create mode 100644 src/main/java/uk/ac/cam/cl/dtg/util/NameOrderer.java rename src/test/java/uk/ac/cam/cl/dtg/{isaac/api/managers/GroupManagerTest.java => util/NameOrdererTest.java} (84%) diff --git a/src/main/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManager.java b/src/main/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManager.java index 282696c113..d6e10f3c5e 100644 --- a/src/main/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManager.java +++ b/src/main/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManager.java @@ -46,11 +46,11 @@ import uk.ac.cam.cl.dtg.segue.dao.SegueDatabaseException; import uk.ac.cam.cl.dtg.segue.dao.content.ContentManagerException; import uk.ac.cam.cl.dtg.segue.dao.users.IUserGroupPersistenceManager; +import uk.ac.cam.cl.dtg.util.NameOrderer; import uk.ac.cam.cl.dtg.util.mappers.UserMapper; import java.util.ArrayList; import java.util.Collection; -import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.LinkedList; @@ -181,7 +181,7 @@ public List getUsersInGroup(final UserGroupDTO group) throws List users = userManager.findUsers(groupMemberIds); // Sort the users by name - this.orderUsersByName(users); + NameOrderer.orderUsersByName(users); return users; } @@ -210,24 +210,6 @@ public GroupMembershipStatus getGroupMembershipStatus(Long userId, Long groupId) return this.getUserMembershipMapForGroup(groupId).get(userId).getStatus(); } - /** - * Helper method to consistently sort users by given name then family name in a case-insensitive order. - * @param users - * - list of users. - */ - private void orderUsersByName(final List users) { - // Remove apostrophes so that string containing them are ordered in the same way as in Excel. - // I.e. we want that "O'Aaa" < "Obbb" < "O'Ccc" - Comparator excelStringOrder = Comparator.nullsLast((String a, String b) -> - String.CASE_INSENSITIVE_ORDER.compare(a.replaceAll("'", ""), b.replaceAll("'", ""))); - - // If names differ only by an apostrophe (i.e. "O'A" and "Oa"), break ties using name including any apostrophes: - users.sort(Comparator - .comparing(RegisteredUserDTO::getFamilyName, excelStringOrder) - .thenComparing(RegisteredUserDTO::getGivenName, excelStringOrder) - .thenComparing(RegisteredUserDTO::getFamilyName)); - } - /** * getAllGroupsOwnedAndManagedByUser. * diff --git a/src/main/java/uk/ac/cam/cl/dtg/util/NameOrderer.java b/src/main/java/uk/ac/cam/cl/dtg/util/NameOrderer.java new file mode 100644 index 0000000000..1e40a1e930 --- /dev/null +++ b/src/main/java/uk/ac/cam/cl/dtg/util/NameOrderer.java @@ -0,0 +1,36 @@ +package uk.ac.cam.cl.dtg.util; + +import uk.ac.cam.cl.dtg.isaac.dto.users.RegisteredUserDTO; + +import java.util.Comparator; +import java.util.List; + +/** + * A utility class to order names lexicographically. + */ +public class NameOrderer { + + /** + * It does not make sense to create one of these! + */ + private NameOrderer() { + } + + /** + * Helper method to consistently sort users by given name then family name in a case-insensitive order. + * @param users + * - list of users. + */ + public static void orderUsersByName(final List users) { + // Remove apostrophes so that string containing them are ordered in the same way as in Excel. + // I.e. we want that "O'Aaa" < "Obbb" < "O'Ccc" + Comparator excelStringOrder = Comparator.nullsLast((String a, String b) -> + String.CASE_INSENSITIVE_ORDER.compare(a.replaceAll("'", ""), b.replaceAll("'", ""))); + + // If names differ only by an apostrophe (i.e. "O'A" and "Oa"), break ties using name including any apostrophes: + users.sort(Comparator + .comparing(RegisteredUserDTO::getFamilyName, excelStringOrder) + .thenComparing(RegisteredUserDTO::getGivenName, excelStringOrder) + .thenComparing(RegisteredUserDTO::getFamilyName)); + } +} diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GroupManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/util/NameOrdererTest.java similarity index 84% rename from src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GroupManagerTest.java rename to src/test/java/uk/ac/cam/cl/dtg/util/NameOrdererTest.java index 3b7c3b09e0..f761b795df 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GroupManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/util/NameOrdererTest.java @@ -1,31 +1,22 @@ -package uk.ac.cam.cl.dtg.isaac.api.managers; +package uk.ac.cam.cl.dtg.util; -import org.junit.Before; import org.junit.Test; -import uk.ac.cam.cl.dtg.segue.api.managers.GroupManager; import uk.ac.cam.cl.dtg.isaac.dos.users.EmailVerificationStatus; import uk.ac.cam.cl.dtg.isaac.dos.users.Gender; import uk.ac.cam.cl.dtg.isaac.dto.users.RegisteredUserDTO; import java.util.ArrayList; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.powermock.reflect.Whitebox; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; -import static org.easymock.EasyMock.createMock; -import static org.junit.Assert.*; - -public class GroupManagerTest extends AbstractManagerTest { - - private GroupManager groupManager; - - @Before - public final void setUp() { - this.groupManager = createMock(GroupManager.class); - } +public class NameOrdererTest { + Date somePastDate = new Date(System.currentTimeMillis() - 7 * 24 * 60 * 60 * 1000); @Test public void orderUsersByName_ordersBySurnamePrimarily() throws Exception { @@ -46,10 +37,11 @@ public void orderUsersByName_ordersBySurnamePrimarily() throws Exception { ).peek(user -> user.setId((long) ("" + user.getGivenName() + user.getFamilyName()).hashCode())).collect(Collectors.toList()); List shuffledUsers = new ArrayList<>(users); - Collections.shuffle(shuffledUsers); + Collections.shuffle(shuffledUsers); assertNotEquals(users, shuffledUsers); - Whitebox.invokeMethod(groupManager, "orderUsersByName", shuffledUsers); + + NameOrderer.orderUsersByName(shuffledUsers); assertEquals(users, shuffledUsers); } } From 1b228146a9714ae89e20ea3dfcd8ca2bcf00f827 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Wed, 18 Feb 2026 09:22:43 +0000 Subject: [PATCH 03/38] Avoid using PowerMock to mock private logger --- .../isaac/quiz/IsaacNumericValidatorTest.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java index bc8fd79628..8e5f300af4 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java @@ -21,7 +21,6 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.reflect.Whitebox; import org.slf4j.Logger; import uk.ac.cam.cl.dtg.isaac.dos.IsaacNumericQuestion; import uk.ac.cam.cl.dtg.isaac.dos.IsaacQuickQuestion; @@ -36,6 +35,7 @@ import java.util.LinkedList; import java.util.List; +import static org.easymock.EasyMock.createMock; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; @@ -47,6 +47,8 @@ */ @PowerMockIgnore({"jakarta.ws.*"}) public class IsaacNumericValidatorTest { + + private Logger log; private IsaacNumericValidator validator; private IsaacNumericQuestion numericQuestionNoUnits; private IsaacNumericQuestion numericQuestionWithUnits; @@ -64,6 +66,7 @@ public class IsaacNumericValidatorTest { */ @Before public final void setUp() { + log = createMock(Logger.class); validator = new IsaacNumericValidator(); // Set up a question object which does not require units: @@ -683,14 +686,14 @@ public final void isaacNumericValidator_CheckParsingAsNumberWorks() throws Excep List numbersToTest = Arrays.asList("42", "4.2e1", "4.2E1", "4.2x10^1", "4.2*10**1", "4.2×10^(1)", "4.2 \\times 10^{1}"); for (String numberToTest : numbersToTest) { - boolean result = ValidationUtils.numericValuesMatch(numberToMatch, numberToTest, 2, (Logger) Whitebox.getField(validator.getClass(), "log").get(validator)); + boolean result = ValidationUtils.numericValuesMatch(numberToMatch, numberToTest, 2, log); assertTrue(result); } String powerOfTenToMatch = "10000"; List powersOfTenToTest = Arrays.asList("10000", "1x10^4", "1e4", "1E4", "1 x 10**4", "10^4", "10**(4)", "10^{4}", "100x10^2"); for (String powerOfTenToTest : powersOfTenToTest) { - boolean result = ValidationUtils.numericValuesMatch(powerOfTenToMatch, powerOfTenToTest, 1, (Logger) Whitebox.getField(validator.getClass(), "log").get(validator)); + boolean result = ValidationUtils.numericValuesMatch(powerOfTenToMatch, powerOfTenToTest, 1, log); assertTrue(result); } } @@ -987,7 +990,7 @@ public final void isaacNumericValidator_correctAnswerWithDisregardSigFigs_respon // ---------- Helper methods to test internal functionality of the validator class ---------- private void testSigFigRoundingWorks(String inputValue, int sigFigToRoundTo, double expectedResult) throws Exception { - double result = ValidationUtils.roundStringValueToSigFigs(inputValue, sigFigToRoundTo, (Logger) Whitebox.getField(validator.getClass(), "log").get(validator)); + double result = ValidationUtils.roundStringValueToSigFigs(inputValue, sigFigToRoundTo, log); assertEquals("sigfig rounding failed for value '" + inputValue + "' to " + sigFigToRoundTo + "sf: expected '" + expectedResult + "', got '" + result + "'", result, expectedResult, 0.0); @@ -995,7 +998,7 @@ private void testSigFigRoundingWorks(String inputValue, int sigFigToRoundTo, dou private void testSigFigExtractionWorks(String inputValue, int minAllowedSigFigs, int maxAllowedSigFigs, int expectedResult) throws Exception { - int result = ValidationUtils.numberOfSignificantFiguresToValidateWith(inputValue, minAllowedSigFigs, maxAllowedSigFigs, (Logger) Whitebox.getField(validator.getClass(), "log").get(validator)); + int result = ValidationUtils.numberOfSignificantFiguresToValidateWith(inputValue, minAllowedSigFigs, maxAllowedSigFigs, log); assertTrue("sigfig extraction out of range for value " + inputValue + " (min allowed: " + minAllowedSigFigs + ", max allowed: " + maxAllowedSigFigs + ") got " + result, result <= maxAllowedSigFigs && result >= minAllowedSigFigs); @@ -1016,15 +1019,15 @@ private void verifyCorrectNumberOfSigFigsNoRange(List numbersToTest, Lis for (String number : numbersToTest) { for (Integer sigFig : sigFigsToPass) { - boolean tooFew = ValidationUtils.tooFewSignificantFigures(number, sigFig, (Logger) Whitebox.getField(validator.getClass(), "log").get(validator)); + boolean tooFew = ValidationUtils.tooFewSignificantFigures(number, sigFig, log); assertFalse("Unexpected too few sig fig for " + number + " @ " + sigFig + "sf", tooFew); - boolean tooMany = ValidationUtils.tooManySignificantFigures(number, sigFig, (Logger) Whitebox.getField(validator.getClass(), "log").get(validator)); + boolean tooMany = ValidationUtils.tooManySignificantFigures(number, sigFig, log); assertFalse("Unexpected too many sig fig for " + number + " @ " + sigFig + "sf", tooMany); } for (Integer sigFig : sigFigsToFail) { - boolean tooFew = ValidationUtils.tooFewSignificantFigures(number, sigFig, (Logger) Whitebox.getField(validator.getClass(), "log").get(validator)); - boolean tooMany = ValidationUtils.tooManySignificantFigures(number, sigFig, (Logger) Whitebox.getField(validator.getClass(), "log").get(validator)); + boolean tooFew = ValidationUtils.tooFewSignificantFigures(number, sigFig, log); + boolean tooMany = ValidationUtils.tooManySignificantFigures(number, sigFig, log); boolean incorrectSigFig = tooMany || tooFew; assertTrue("Expected incorrect sig fig for " + number + " @ " + sigFig + "sf", incorrectSigFig); } From 098bd0a119cad22e2a639ab698daa3229aca95e0 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Thu, 19 Feb 2026 15:32:07 +0000 Subject: [PATCH 04/38] Remove PowerMock from EmailManagerTest --- .../dtg/segue/dao/content/GitContentManager.java | 4 ++-- .../ac/cam/cl/dtg/segue/comm/EmailManagerTest.java | 14 +++----------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/main/java/uk/ac/cam/cl/dtg/segue/dao/content/GitContentManager.java b/src/main/java/uk/ac/cam/cl/dtg/segue/dao/content/GitContentManager.java index 550f465eb4..a7bcd0737c 100644 --- a/src/main/java/uk/ac/cam/cl/dtg/segue/dao/content/GitContentManager.java +++ b/src/main/java/uk/ac/cam/cl/dtg/segue/dao/content/GitContentManager.java @@ -198,7 +198,7 @@ public final ContentDTO getContentById(final String id) throws ContentManagerExc * @return the content DTO object. * @throws ContentManagerException on failure to return the object or null. */ - public final ContentDTO getContentById(final String id, final boolean failQuietly) throws ContentManagerException { + public ContentDTO getContentById(final String id, final boolean failQuietly) throws ContentManagerException { return this.contentSubclassMapper.getDTOByDO(this.getContentDOById(id, failQuietly)); } @@ -243,7 +243,7 @@ public final Content getContentDOById(final String id) throws ContentManagerExce * @return the content DTO object. * @throws ContentManagerException on failure to return the object or null. */ - public final Content getContentDOById(final String id, final boolean failQuietly) throws ContentManagerException { + public Content getContentDOById(final String id, final boolean failQuietly) throws ContentManagerException { if (null == id || id.isEmpty()) { return null; } diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java index a82d4b3d15..ed9e9ff371 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java @@ -30,11 +30,6 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.api.easymock.PowerMock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -61,9 +56,6 @@ * Test class for the EmailManager class. * */ -@RunWith(PowerMockRunner.class) -@PrepareForTest(GitContentManager.class) -@PowerMockIgnore("javax.management.*") public class EmailManagerTest { private final String CONTENT_VERSION = "liveVersion"; @@ -137,7 +129,7 @@ public final void setUp() throws Exception { // Create content manager - mockContentManager = PowerMock.createMock(GitContentManager.class); + mockContentManager = EasyMock.createMock(GitContentManager.class); // Create log manager logManager = EasyMock.createMock(ILogManager.class); @@ -492,7 +484,7 @@ public final void sendRegistrationConfirmation_checkTemplatesWithNoTagsWorks_ema EmailTemplateDTO template = createDummyEmailTemplate("this is a template with no tags"); // Create content manager - GitContentManager mockContentManager = PowerMock.createMock(GitContentManager.class); + GitContentManager mockContentManager = EasyMock.createMock(GitContentManager.class); ContentDTO htmlTemplate = createDummyContentTemplate("{{content}}"); try { @@ -508,7 +500,7 @@ public final void sendRegistrationConfirmation_checkTemplatesWithNoTagsWorks_ema EasyMock.expect(mockContentManager.getCurrentContentSHA()).andReturn(CONTENT_VERSION).atLeastOnce(); - PowerMock.replay(mockContentManager); + EasyMock.replay(mockContentManager); } catch (ContentManagerException e) { e.printStackTrace(); Assert.fail(); From b49a04d8c96abbc104f264d45d24d24b2c0cfaba Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Fri, 20 Feb 2026 09:28:58 +0000 Subject: [PATCH 05/38] Remove all PowerMock annotations --- .../uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java | 7 ------- .../uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java | 7 ------- .../java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java | 7 ------- .../ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java | 8 -------- .../uk/ac/cam/cl/dtg/isaac/app/GameboardsFacadeTest.java | 2 -- .../dtg/isaac/quiz/IsaacGraphSketcherValidatorTest.java | 2 -- .../cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java | 1 - .../cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java | 2 -- .../cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java | 2 -- .../cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java | 2 -- .../cam/cl/dtg/segue/api/managers/GroupManagerTest.java | 2 -- .../segue/api/managers/UserAssociationManagerTest.java | 2 -- .../ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java | 2 -- .../cam/cl/dtg/segue/api/monitors/MisuseMonitorTest.java | 2 -- .../ac/cam/cl/dtg/segue/comm/MailGunEmailManagerTest.java | 8 -------- .../uk/ac/cam/cl/dtg/segue/dao/GitContentManagerTest.java | 2 -- .../uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java | 3 --- src/test/java/uk/ac/cam/cl/dtg/util/YamlLoaderTest.java | 7 ------- 18 files changed, 68 deletions(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java index f6d00ed4b4..a25c588211 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java @@ -18,10 +18,6 @@ import com.google.api.client.util.Maps; import com.google.common.base.Joiner; import org.junit.Before; -import org.junit.runner.RunWith; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; import uk.ac.cam.cl.dtg.isaac.IsaacTest; import uk.ac.cam.cl.dtg.isaac.dto.SegueErrorResponse; import uk.ac.cam.cl.dtg.isaac.dto.users.RegisteredUserDTO; @@ -83,9 +79,6 @@ * * @deprecated in favour of IsaacIntegrationTest */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({UserAccountManager.class}) -@PowerMockIgnore({ "jakarta.ws.*", "jakarta.management.*", "jakarta.script.*" }) @Deprecated abstract public class AbstractFacadeTest extends IsaacTest { protected Request request; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java index 22a345f300..73e31891b8 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java @@ -16,10 +16,6 @@ package uk.ac.cam.cl.dtg.isaac.api; import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; import uk.ac.cam.cl.dtg.isaac.dos.AbstractUserPreferenceManager; import uk.ac.cam.cl.dtg.isaac.dos.IUserStreaksManager; import uk.ac.cam.cl.dtg.isaac.dos.UserPreference; @@ -52,9 +48,6 @@ import static org.powermock.api.easymock.PowerMock.replayAll; import static uk.ac.cam.cl.dtg.segue.api.Constants.*; -@RunWith(PowerMockRunner.class) -@PrepareForTest(GitContentManager.class) -@PowerMockIgnore("javax.management.*") public class QuestionFacadeTest extends AbstractFacadeTest { private AbstractConfigLoader properties; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java index 2aa25667ab..aa9ef328fa 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java @@ -20,10 +20,6 @@ import org.easymock.IAnswer; import org.junit.Before; import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; import uk.ac.cam.cl.dtg.isaac.api.managers.DueBeforeNowException; import uk.ac.cam.cl.dtg.isaac.api.managers.DuplicateAssignmentException; import uk.ac.cam.cl.dtg.isaac.api.managers.QuizAssignmentManager; @@ -79,9 +75,6 @@ import static org.powermock.api.easymock.PowerMock.replay; import static uk.ac.cam.cl.dtg.isaac.api.Constants.*; -@RunWith(PowerMockRunner.class) -@PrepareForTest(GitContentManager.class) -@PowerMockIgnore("javax.management.*") public class QuizFacadeTest extends AbstractFacadeTest { private QuizFacade quizFacade; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java index e9418bdea9..b8c68c0fcf 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java @@ -20,11 +20,7 @@ import org.easymock.EasyMock; import org.junit.Before; import org.junit.Test; -import org.junit.runner.RunWith; import org.powermock.api.easymock.PowerMock; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; import uk.ac.cam.cl.dtg.isaac.dao.GameboardPersistenceManager; import uk.ac.cam.cl.dtg.isaac.dto.GameFilter; import uk.ac.cam.cl.dtg.isaac.dto.ResultsWrapper; @@ -47,10 +43,6 @@ import static org.powermock.api.easymock.PowerMock.replay; import static uk.ac.cam.cl.dtg.segue.api.Constants.*; - -@RunWith(PowerMockRunner.class) -@PrepareForTest(GitContentManager.class) -@PowerMockIgnore("javax.management.*") public class GameManagerTest { private GitContentManager dummyContentManager; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/app/GameboardsFacadeTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/app/GameboardsFacadeTest.java index 104f1b4036..e574e56e25 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/app/GameboardsFacadeTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/app/GameboardsFacadeTest.java @@ -18,7 +18,6 @@ import org.easymock.EasyMock; import org.junit.Before; import org.junit.Test; -import org.powermock.core.classloader.annotations.PowerMockIgnore; import uk.ac.cam.cl.dtg.isaac.api.Constants; import uk.ac.cam.cl.dtg.isaac.api.GameboardsFacade; import uk.ac.cam.cl.dtg.isaac.api.managers.FastTrackManger; @@ -81,7 +80,6 @@ public final void setUp() throws Exception { * @throws ContentManagerException */ @Test - @PowerMockIgnore({ "jakarta.ws.*" }) public final void isaacEndPoint_checkEmptyGameboardCausesErrorNoUser_SegueErrorResponseShouldBeReturned() throws SegueDatabaseException, ContentManagerException { GameboardsFacade gameboardFacade = new GameboardsFacade( diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacGraphSketcherValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacGraphSketcherValidatorTest.java index d1f1aa33c8..e2f53ee0c0 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacGraphSketcherValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacGraphSketcherValidatorTest.java @@ -18,7 +18,6 @@ import com.google.api.client.util.Lists; import org.junit.Before; import org.junit.Test; -import org.powermock.core.classloader.annotations.PowerMockIgnore; import uk.ac.cam.cl.dtg.isaac.dos.IsaacGraphSketcherQuestion; import uk.ac.cam.cl.dtg.isaac.dos.QuestionValidationResponse; import uk.ac.cam.cl.dtg.isaac.dos.content.Choice; @@ -33,7 +32,6 @@ * Test class for the Graph Sketcher Validator class. * */ -@PowerMockIgnore({"jakarta.ws.*"}) public class IsaacGraphSketcherValidatorTest { private IsaacGraphSketcherValidator validator; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java index e01c3b4d58..63781264ef 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java @@ -21,7 +21,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.powermock.core.classloader.annotations.PowerMockIgnore; import uk.ac.cam.cl.dtg.isaac.dos.IsaacItemQuestion; import uk.ac.cam.cl.dtg.isaac.dos.IsaacQuickQuestion; import uk.ac.cam.cl.dtg.isaac.dos.QuestionValidationResponse; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java index 8e5f300af4..76e71555f4 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java @@ -20,7 +20,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.slf4j.Logger; import uk.ac.cam.cl.dtg.isaac.dos.IsaacNumericQuestion; import uk.ac.cam.cl.dtg.isaac.dos.IsaacQuickQuestion; @@ -45,7 +44,6 @@ * Test class for the user manager class. * */ -@PowerMockIgnore({"jakarta.ws.*"}) public class IsaacNumericValidatorTest { private Logger log; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java index e8e7f05d3a..bb45cbe506 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java @@ -21,7 +21,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.powermock.core.classloader.annotations.PowerMockIgnore; import uk.ac.cam.cl.dtg.isaac.dos.IsaacParsonsQuestion; import uk.ac.cam.cl.dtg.isaac.dos.IsaacQuickQuestion; import uk.ac.cam.cl.dtg.isaac.dos.QuestionValidationResponse; @@ -42,7 +41,6 @@ * Test class for the Parsons Question Validator class. * */ -@PowerMockIgnore({"jakarta.ws.*"}) public class IsaacParsonsValidatorTest { private IsaacParsonsValidator validator; private IsaacParsonsQuestion someParsonsQuestion; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java index 5d8f4629ce..1226056598 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java @@ -20,7 +20,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.powermock.core.classloader.annotations.PowerMockIgnore; import uk.ac.cam.cl.dtg.isaac.dos.IsaacQuickQuestion; import uk.ac.cam.cl.dtg.isaac.dos.IsaacStringMatchQuestion; import uk.ac.cam.cl.dtg.isaac.dos.QuestionValidationResponse; @@ -38,7 +37,6 @@ * Test class for the String Match Validator class. * */ -@PowerMockIgnore({"jakarta.ws.*"}) public class IsaacStringMatchValidatorTest { private IsaacStringMatchValidator validator; private IsaacStringMatchQuestion someStringMatchQuestion; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java index c6d2537fca..222587cebe 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java @@ -20,7 +20,6 @@ import org.easymock.Capture; import org.junit.Before; import org.junit.Test; -import org.powermock.core.classloader.annotations.PowerMockIgnore; import uk.ac.cam.cl.dtg.isaac.api.managers.GameManager; import uk.ac.cam.cl.dtg.segue.api.Constants; import uk.ac.cam.cl.dtg.segue.comm.EmailCommunicationMessage; @@ -47,7 +46,6 @@ * Test class for the user manager class. * */ -@PowerMockIgnore({"jakarta.ws.*"}) public class GroupManagerTest { private AbstractConfigLoader dummyPropertiesLoader; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAssociationManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAssociationManagerTest.java index 185e7b7ab7..21c84d314d 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAssociationManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAssociationManagerTest.java @@ -19,7 +19,6 @@ import org.easymock.Capture; import org.junit.Before; import org.junit.Test; -import org.powermock.core.classloader.annotations.PowerMockIgnore; import uk.ac.cam.cl.dtg.isaac.dos.AssociationToken; import uk.ac.cam.cl.dtg.isaac.dos.users.Role; import uk.ac.cam.cl.dtg.isaac.dto.UserGroupDTO; @@ -46,7 +45,6 @@ /** * Test class for the user Association class. */ -@PowerMockIgnore({"jakarta.ws.*"}) public class UserAssociationManagerTest { private IAssociationDataManager dummyAssociationDataManager; private GroupManager dummyGroupDataManager; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java index 3d3a8b08f5..4987932aa7 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java @@ -24,7 +24,6 @@ import org.easymock.EasyMock; import org.junit.Before; import org.junit.Test; -import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.reflect.Whitebox; import uk.ac.cam.cl.dtg.isaac.dos.AbstractUserPreferenceManager; import uk.ac.cam.cl.dtg.isaac.dos.users.AnonymousUser; @@ -81,7 +80,6 @@ * Test class for the user manager class. * */ -@PowerMockIgnore({"jakarta.ws.*"}) public class UserManagerTest { private QuestionManager dummyQuestionDatabase; private IUserDataManager dummyDatabase; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/api/monitors/MisuseMonitorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/api/monitors/MisuseMonitorTest.java index 08a18eca30..e044389fd9 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/api/monitors/MisuseMonitorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/api/monitors/MisuseMonitorTest.java @@ -18,7 +18,6 @@ import org.easymock.EasyMock; import org.junit.Before; import org.junit.Test; -import org.powermock.core.classloader.annotations.PowerMockIgnore; import uk.ac.cam.cl.dtg.segue.api.Constants; import uk.ac.cam.cl.dtg.segue.api.managers.SegueResourceMisuseException; import uk.ac.cam.cl.dtg.segue.comm.EmailCommunicationMessage; @@ -34,7 +33,6 @@ * Test class for the user manager class. * */ -@PowerMockIgnore({"jakarta.ws.*"}) public class MisuseMonitorTest { private AbstractConfigLoader dummyPropertiesLoader; private EmailManager dummyCommunicator; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/comm/MailGunEmailManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/comm/MailGunEmailManagerTest.java index ee6f4ec76f..8cf9ec139a 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/comm/MailGunEmailManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/comm/MailGunEmailManagerTest.java @@ -21,16 +21,11 @@ import org.easymock.EasyMock; import org.junit.Before; import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; import uk.ac.cam.cl.dtg.isaac.dos.AbstractUserPreferenceManager; import uk.ac.cam.cl.dtg.isaac.dos.PgUserPreferenceManager; import uk.ac.cam.cl.dtg.isaac.dto.content.EmailTemplateDTO; import uk.ac.cam.cl.dtg.isaac.dto.users.RegisteredUserDTO; import uk.ac.cam.cl.dtg.segue.dao.ILogManager; -import uk.ac.cam.cl.dtg.segue.dao.content.GitContentManager; import uk.ac.cam.cl.dtg.util.AbstractConfigLoader; import java.util.Collection; @@ -41,9 +36,6 @@ * Test class for the EmailManager class. * */ -@RunWith(PowerMockRunner.class) -@PrepareForTest(GitContentManager.class) -@PowerMockIgnore("javax.management.*") public class MailGunEmailManagerTest { private AbstractConfigLoader mockPropertiesLoader; private AbstractUserPreferenceManager userPreferenceManager; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/dao/GitContentManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/dao/GitContentManagerTest.java index 8e161f7484..23fb68d4ad 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/dao/GitContentManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/dao/GitContentManagerTest.java @@ -17,7 +17,6 @@ import org.junit.Before; import org.junit.Test; -import org.powermock.core.classloader.annotations.PowerMockIgnore; import uk.ac.cam.cl.dtg.segue.dao.content.ContentManagerException; import uk.ac.cam.cl.dtg.segue.dao.content.ContentSubclassMapper; import uk.ac.cam.cl.dtg.segue.dao.content.GitContentManager; @@ -37,7 +36,6 @@ * Test class for the GitContentManager class. * */ -@PowerMockIgnore({"jakarta.ws.*"}) public class GitContentManagerTest { private GitDb database; private ISearchProvider searchProvider; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java index e7554bc716..732357a0b8 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java @@ -26,13 +26,11 @@ import com.google.common.collect.ImmutableMap; import org.junit.Before; import org.junit.Test; -import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.reflect.Whitebox; import com.fasterxml.jackson.databind.ObjectMapper; import uk.ac.cam.cl.dtg.isaac.dos.IsaacNumericQuestion; -import uk.ac.cam.cl.dtg.isaac.quiz.IsaacDndValidator; import uk.ac.cam.cl.dtg.isaac.quiz.IsaacDndValidatorTest; import uk.ac.cam.cl.dtg.segue.api.Constants; import uk.ac.cam.cl.dtg.segue.dao.content.ContentSubclassMapper; @@ -46,7 +44,6 @@ * Test class for the GitContentManager class. * */ -@PowerMockIgnore({"jakarta.ws.*"}) public class ContentIndexerTest { private GitDb database; private ElasticSearchIndexer searchProvider; diff --git a/src/test/java/uk/ac/cam/cl/dtg/util/YamlLoaderTest.java b/src/test/java/uk/ac/cam/cl/dtg/util/YamlLoaderTest.java index df023f64cf..3a3203b231 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/util/YamlLoaderTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/util/YamlLoaderTest.java @@ -2,11 +2,7 @@ import org.easymock.EasyMock; import org.junit.Test; -import org.junit.runner.RunWith; import org.powermock.api.easymock.PowerMock; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; import org.yaml.snakeyaml.Yaml; import java.io.FileInputStream; @@ -16,9 +12,6 @@ import static junit.framework.TestCase.assertEquals; -@RunWith(PowerMockRunner.class) -@PrepareForTest({YamlLoader.class, FileInputStream.class, Yaml.class}) -@PowerMockIgnore({"javax.xml.datatype.*", "javax.management.*", "javax.crypto.*", "javax.net.ssl.*", "javax.net.*"}) public class YamlLoaderTest { @Test public void yamlLoader_usingSingleResourceConfigFile_loadsSuccessfully() throws IOException { From 8def6c4bed678998ae0a302a57f4b350519bb0c6 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Fri, 20 Feb 2026 09:52:14 +0000 Subject: [PATCH 06/38] Fix GameManagerTest EasyMock cannot mock final methods. --- .../uk/ac/cam/cl/dtg/segue/dao/content/GitContentManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/uk/ac/cam/cl/dtg/segue/dao/content/GitContentManager.java b/src/main/java/uk/ac/cam/cl/dtg/segue/dao/content/GitContentManager.java index a7bcd0737c..4123ca3277 100644 --- a/src/main/java/uk/ac/cam/cl/dtg/segue/dao/content/GitContentManager.java +++ b/src/main/java/uk/ac/cam/cl/dtg/segue/dao/content/GitContentManager.java @@ -592,7 +592,7 @@ public final ResultsWrapper findByFieldNamesRandomOrder( } @Deprecated - public final ResultsWrapper findByFieldNamesRandomOrder( + public ResultsWrapper findByFieldNamesRandomOrder( final List fieldsToMatch, final Integer startIndex, final Integer limit, @Nullable final Long randomSeed ) throws ContentManagerException { From 66b280d66b459fc6ed03b3d9e40efa9ca65c4c85 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Fri, 20 Feb 2026 10:57:54 +0000 Subject: [PATCH 07/38] Fix QuestionFacadeTest via GroupManagerTest. --- .../segue/api/managers/UserAccountManager.java | 2 +- .../dtg/segue/api/managers/GroupManagerTest.java | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAccountManager.java b/src/main/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAccountManager.java index d34729803c..e76c15c7e6 100644 --- a/src/main/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAccountManager.java +++ b/src/main/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAccountManager.java @@ -875,7 +875,7 @@ public List findUsers(final Collection userIds) throws * @throws SegueDatabaseException - If there is another database error */ @Override - public final RegisteredUserDTO getUserDTOById(final Long id) throws NoUserException, SegueDatabaseException { + public RegisteredUserDTO getUserDTOById(final Long id) throws NoUserException, SegueDatabaseException { return this.getUserDTOById(id, false); } diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java index 222587cebe..115ea99608 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java @@ -22,6 +22,7 @@ import org.junit.Test; import uk.ac.cam.cl.dtg.isaac.api.managers.GameManager; import uk.ac.cam.cl.dtg.segue.api.Constants; +import uk.ac.cam.cl.dtg.segue.auth.exceptions.NoUserException; import uk.ac.cam.cl.dtg.segue.comm.EmailCommunicationMessage; import uk.ac.cam.cl.dtg.segue.comm.ICommunicator; import uk.ac.cam.cl.dtg.segue.dao.SegueDatabaseException; @@ -91,6 +92,11 @@ public final void groupManager_createValidGroup_aGroupShouldBeCreated() { RegisteredUserDTO someGroupOwner = new RegisteredUserDTO(); someGroupOwner.setId(5339L); someGroupOwner.setEmail("test@test.com"); + + UserSummaryWithEmailAddressDTO someGroupOwnerSummary = new UserSummaryWithEmailAddressDTO(); + someGroupOwnerSummary.setId(5339L); + someGroupOwnerSummary.setEmail("test@test.com"); + Set someSetOfManagers = Sets.newHashSet(); Capture capturedGroup = Capture.newInstance(); @@ -108,7 +114,14 @@ public final void groupManager_createValidGroup_aGroupShouldBeCreated() { .andReturn(resultFromDB); expect(this.groupDataManager.getAdditionalManagerSetByGroupId(anyObject())) .andReturn(someSetOfManagers).atLeastOnce(); - expect(this.userManager.findUsers(someSetOfManagers)).andReturn(someListOfUsers); + try { + expect(this.userManager.getUserDTOById(null)).andReturn(someGroupOwner).atLeastOnce(); + } catch (NoUserException e) { + throw new RuntimeException(e); + } + expect(this.userManager.convertToDetailedUserSummaryObject(someGroupOwner, UserSummaryWithEmailAddressDTO.class)) + .andReturn(someGroupOwnerSummary).atLeastOnce(); + expect(this.userManager.findUsers(someSetOfManagers)).andReturn(someListOfUsers); expect(this.userManager.convertToDetailedUserSummaryObjectList(someListOfUsers, UserSummaryWithEmailAddressDTO.class)).andReturn(someListOfUsersDTOs); expect(this.dummyMapper.map(resultFromDB)).andReturn(mappedGroup).atLeastOnce(); From aff1663a1649b2a3852884736789bf0868b82609 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Fri, 20 Feb 2026 13:53:25 +0000 Subject: [PATCH 08/38] Remove PowerMock from AbstractFacadeTest --- .../cam/cl/dtg/isaac/api/AbstractFacadeTest.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java index a25c588211..ab78dacde5 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java @@ -43,14 +43,14 @@ import java.util.stream.Collectors; import static org.easymock.EasyMock.anyObject; +import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.createNiceMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.getCurrentArguments; +import static org.easymock.EasyMock.partialMockBuilder; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertEquals; -import static org.powermock.api.easymock.PowerMock.createMock; -import static org.powermock.api.easymock.PowerMock.createPartialMock; -import static org.powermock.api.easymock.PowerMock.replay; -import static org.powermock.api.easymock.PowerMock.verifyAll; /** * A test base for testing Facades, specifically targeted around testing facades as different users. @@ -98,7 +98,10 @@ public void abstractFacadeTestSetup() { request = createNiceMock(Request.class); // We don't particularly care about what gets called on this. replay(request); - userManager = createPartialMock(UserAccountManager.class, "getCurrentUser", "getCurrentRegisteredUser", "convertToUserSummaryObject", "getUserDTOById"); + userManager = partialMockBuilder(UserAccountManager.class) + .addMockedMethods("getCurrentUser", "getCurrentRegisteredUser", "convertToUserSummaryObject") + .addMockedMethod("getUserDTOById", Long.class) // This is overloaded so we have to specify the signature + .createMock(); registerDefaultsFor(userManager, m -> { expect(m.convertToUserSummaryObject(anyObject(RegisteredUserDTO.class))).andStubAnswer(() -> { @@ -437,7 +440,7 @@ private void runStepsAs(@Nullable RegisteredUserDTO user, Endpoint endpoint) { private void verifyEndpoint(String when, Endpoint endpoint) { try { runSteps(endpoint); - verifyAll(); + verify(userManager, httpServletRequest, request); } catch (AssertionError e) { String message = when + ", test failed, expected:\r\n"; message += steps.stream().map(s -> " " + s.toString() + "\r\n").collect(Collectors.joining()); From 1bb9156fe0322e461303554474d5ecfe327d827e Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Mon, 23 Feb 2026 10:12:18 +0000 Subject: [PATCH 09/38] Fix QuizFacadeTest --- .../cl/dtg/segue/api/managers/UserAccountManager.java | 2 +- .../uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAccountManager.java b/src/main/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAccountManager.java index e76c15c7e6..e4f0b75980 100644 --- a/src/main/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAccountManager.java +++ b/src/main/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAccountManager.java @@ -780,7 +780,7 @@ public final boolean isRegisteredUserLoggedIn(final HttpServletRequest request) * @return Returns the current UserDTO if we can get it or null if user is not currently logged in * @throws NoUserLoggedInException - When the session has expired or there is no user currently logged in. */ - public final RegisteredUserDTO getCurrentRegisteredUser(final HttpServletRequest request) + public RegisteredUserDTO getCurrentRegisteredUser(final HttpServletRequest request) throws NoUserLoggedInException { Objects.requireNonNull(request); diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java index aa9ef328fa..9e2ed4cfd8 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java @@ -64,15 +64,15 @@ import static org.easymock.EasyMock.anyLong; import static org.easymock.EasyMock.anyObject; +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.createNiceMock; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.expectLastCall; import static org.easymock.EasyMock.getCurrentArguments; +import static org.easymock.EasyMock.replay; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; -import static org.powermock.api.easymock.PowerMock.createMock; -import static org.powermock.api.easymock.PowerMock.createNiceMock; -import static org.powermock.api.easymock.PowerMock.expectLastCall; -import static org.powermock.api.easymock.PowerMock.replay; import static uk.ac.cam.cl.dtg.isaac.api.Constants.*; public class QuizFacadeTest extends AbstractFacadeTest { @@ -169,7 +169,7 @@ public void setUp() throws ContentManagerException { expect(contentManager.getContentDOById(studentQuizDO.getId())).andStubReturn(studentQuizDO); expect(contentManager.getContentDOById(questionPageQuestionDO.getId())).andStubReturn(questionPageQuestionDO); - replay(requestForCaching, properties, logManager, contentManager, contentSummarizerService, quizManager, quizAssignmentManager, + replay(requestForCaching, properties, logManager, contentManager, contentSummarizerService, quizAssignmentManager, assignmentService, quizAttemptManager, quizQuestionManager, associationManager); } From 4d617160fa0a3e4bfec1fef082551d75432d3d5c Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Mon, 23 Feb 2026 10:48:14 +0000 Subject: [PATCH 10/38] Remove unnecessary usage of PowerMock This functionality can be achieved with the equivalent EasyMock methods --- .../ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java | 9 +++++---- .../cl/dtg/isaac/api/managers/GameManagerTest.java | 13 ++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java index 73e31891b8..896bb51e61 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java @@ -38,14 +38,14 @@ import jakarta.ws.rs.core.Response.Status; import static org.easymock.EasyMock.anyObject; +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.createNiceMock; import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThrows; -import static org.powermock.api.easymock.PowerMock.createMock; -import static org.powermock.api.easymock.PowerMock.createNiceMock; -import static org.powermock.api.easymock.PowerMock.replayAll; import static uk.ac.cam.cl.dtg.segue.api.Constants.*; public class QuestionFacadeTest extends AbstractFacadeTest { @@ -75,7 +75,8 @@ private void setUpQuestionFacade() throws ContentManagerException { expect(contentManager.getContentDOById(studentQuizDO.getId())).andStubReturn(studentQuizDO); expect(contentManager.getContentDOById(questionPageQuestionDO.getId())).andStubReturn(questionPageQuestionDO); - replayAll(); + replay(requestForCaching, contentManager, contentSubclassMapper, questionManager, userStreaksManager, + userAssociationManager); } @Test diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java index b8c68c0fcf..af40f029a1 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java @@ -20,7 +20,6 @@ import org.easymock.EasyMock; import org.junit.Before; import org.junit.Test; -import org.powermock.api.easymock.PowerMock; import uk.ac.cam.cl.dtg.isaac.dao.GameboardPersistenceManager; import uk.ac.cam.cl.dtg.isaac.dto.GameFilter; import uk.ac.cam.cl.dtg.isaac.dto.ResultsWrapper; @@ -38,9 +37,9 @@ import java.util.Objects; import java.util.stream.Collectors; +import static org.easymock.EasyMock.replay; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.powermock.api.easymock.PowerMock.replay; import static uk.ac.cam.cl.dtg.segue.api.Constants.*; public class GameManagerTest { @@ -53,11 +52,11 @@ public class GameManagerTest { @Before public void setUp() { - this.dummyContentManager = PowerMock.createMock(GitContentManager.class); - this.dummyGameboardPersistenceManager = PowerMock.createMock(GameboardPersistenceManager.class); - this.dummyMapper = PowerMock.createMock(MainMapper.class); - this.dummyQuestionManager = PowerMock.createMock(QuestionManager.class); - this.dummyConfigLoader = PowerMock.createMock(YamlLoader.class); + this.dummyContentManager = EasyMock.createMock(GitContentManager.class); + this.dummyGameboardPersistenceManager = EasyMock.createMock(GameboardPersistenceManager.class); + this.dummyMapper = EasyMock.createMock(MainMapper.class); + this.dummyQuestionManager = EasyMock.createMock(QuestionManager.class); + this.dummyConfigLoader = EasyMock.createMock(YamlLoader.class); EasyMock.expect(dummyConfigLoader.getProperty(GAMEBOARD_QUESTION_LIMIT)).andStubReturn("30"); replay(dummyConfigLoader); From 3b1efb51268e9a73a00df6129c666dd5bea0fcb5 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Mon, 23 Feb 2026 10:52:15 +0000 Subject: [PATCH 11/38] Remove PowerMock from GitDbTest --- src/test/java/uk/ac/cam/cl/dtg/segue/database/GitDbTest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/database/GitDbTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/database/GitDbTest.java index 7e735e933a..0df1ba7e6d 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/database/GitDbTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/database/GitDbTest.java @@ -24,16 +24,12 @@ import org.eclipse.jgit.lib.Repository; import org.junit.Test; -import org.powermock.api.easymock.PowerMock; - public class GitDbTest { @Test public void gitDbOtherConstructor_checkForBadParameters_exceptionsShouldBeThrown() { // Test that if you provide an empty string or null, an IllegalArgumentException gets thrown and git.open never gets called. - PowerMock.replay(Git.class); - try { new GitDb("", null, null); fail("GitDb constructor was given an empty string, but didn't throw an exception"); From ec77d14e215bf0e5e444cb102ecbaa757124ceca Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Mon, 23 Feb 2026 14:22:07 +0000 Subject: [PATCH 12/38] Remove Whitebox usage from UserManagerTest --- .../managers/UserAuthenticationManager.java | 4 +-- .../segue/api/managers/UserManagerTest.java | 32 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/main/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAuthenticationManager.java b/src/main/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAuthenticationManager.java index 89e3ed3f5d..e032b79cee 100644 --- a/src/main/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAuthenticationManager.java +++ b/src/main/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAuthenticationManager.java @@ -1058,7 +1058,7 @@ private void createSession(final HttpServletRequest request, final HttpServletRe * - the real user we are to validate this cookie against. * @return true if it is still valid, false if not. */ - private boolean isValidUsersSession(final Map sessionInformation, final RegisteredUser userFromDatabase) { + public boolean isValidUsersSession(final Map sessionInformation, final RegisteredUser userFromDatabase) { Objects.requireNonNull(sessionInformation); Objects.requireNonNull(userFromDatabase); @@ -1120,7 +1120,7 @@ private boolean isValidUsersSession(final Map sessionInformation * - Boolean data to encode in the cookie - true if a partial login * @return HMAC signature. */ - private String calculateSessionHMAC(final String key, final String userId, final String currentDate, final String sessionToken, + public static String calculateSessionHMAC(final String key, final String userId, final String currentDate, final String sessionToken, @Nullable final Set caveatFlags) { StringBuilder sb = new StringBuilder(); sb.append(userId); diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java index 4987932aa7..315c64189a 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java @@ -24,7 +24,6 @@ import org.easymock.EasyMock; import org.junit.Before; import org.junit.Test; -import org.powermock.reflect.Whitebox; import uk.ac.cam.cl.dtg.isaac.dos.AbstractUserPreferenceManager; import uk.ac.cam.cl.dtg.isaac.dos.users.AnonymousUser; import uk.ac.cam.cl.dtg.isaac.dos.users.EmailVerificationStatus; @@ -195,7 +194,7 @@ public final void getCurrentUser_IsAuthenticatedWithValidHMAC_userIsReturned() t returnUser.setId(validUserId); returnUser.setSessionToken(0); - Map sessionInformation = getSessionInformationAsAMap(authManager, validUserId.toString(), validDateString, returnUser.getSessionToken()); + Map sessionInformation = getSessionInformationAsAMap(validUserId.toString(), validDateString, returnUser.getSessionToken()); Cookie[] cookieWithSessionInfo = getCookieArray(sessionInformation); dummyDatabase.updateUserLastSeen(returnUser); @@ -330,6 +329,8 @@ public final void authenticateCallback_checkNewUserIsAuthenticated_createInterna au.setSessionId(someSegueAnonymousUserId); expect(this.dummyUserCache.storeAnonymousUser(au)).andReturn(au).atLeastOnce(); expect(this.dummyUserCache.getById(au.getSessionId())).andReturn(au).atLeastOnce(); + this.dummyUserCache.deleteAnonymousUser(au); + expectLastCall().once(); AnonymousUserDTO someAnonymousUserDTO = new AnonymousUserDTO(); someAnonymousUserDTO.setSessionId(someSegueAnonymousUserId); @@ -404,7 +405,7 @@ public final void authenticateCallback_checkNewUserIsAuthenticated_createInterna expect(dummyDatabase.getById(someSegueUserId)).andReturn(mappedUser); - Map sessionInformation = getSessionInformationAsAMap(authManager, someSegueUserId.toString(), + Map sessionInformation = getSessionInformationAsAMap(someSegueUserId.toString(), validDateString, mappedUser.getSessionToken()); Cookie[] cookieWithSessionInfo = getCookieArray(sessionInformation); @@ -542,14 +543,14 @@ public final void validateUsersSession_checkForValidHMAC_shouldReturnAsCorrect() calendar.add(Calendar.SECOND, 500); String validDateString = sdf.format(calendar.getTime()); - Map sessionInformation = getSessionInformationAsAMap(authManager, validUserId, validDateString, mappedUser.getSessionToken()); + Map sessionInformation = getSessionInformationAsAMap(validUserId, validDateString, mappedUser.getSessionToken()); replay(dummySession); replay(request); replay(dummyQuestionDatabase); // Act - boolean valid = Whitebox. invokeMethod(authManager, "isValidUsersSession", sessionInformation, mappedUser); + boolean valid = authManager.isValidUsersSession(sessionInformation, mappedUser); // Assert verify(dummyQuestionDatabase, dummySession, request); @@ -578,8 +579,8 @@ public final void validateUsersSession_badUsersSession_shouldReturnAsIncorrect() new Date(), Gender.MALE, null, new Date(), null, null, null, null, false); mappedUser.setSessionToken(0); - Map validSessionInformation = getSessionInformationAsAMap(authManager, validUserId, - validDateString, mappedUser.getSessionToken()); + Map validSessionInformation = getSessionInformationAsAMap(validUserId, validDateString, + mappedUser.getSessionToken()); Map tamperedSessionInformation = ImmutableMap.of( Constants.SESSION_USER_ID, validUserId, @@ -593,7 +594,7 @@ public final void validateUsersSession_badUsersSession_shouldReturnAsIncorrect() replay(dummyQuestionDatabase); // Act - boolean valid = Whitebox. invokeMethod(authManager, "isValidUsersSession", tamperedSessionInformation, mappedUser); + boolean valid = authManager.isValidUsersSession(tamperedSessionInformation, mappedUser); // Assert verify(dummyQuestionDatabase, dummySession, request); @@ -622,15 +623,15 @@ public final void validateUsersSession_expiredUsersSession_shouldReturnAsIncorre calendar.add(Calendar.SECOND, -60); // Expired 60 seconds ago String expiredDateString = sdf.format(calendar.getTime()); - Map validSessionInformation = getSessionInformationAsAMap(authManager, validUserId, - expiredDateString, mappedUser.getSessionToken()); + Map validSessionInformation = getSessionInformationAsAMap(validUserId, expiredDateString, + mappedUser.getSessionToken()); replay(dummySession); replay(request); replay(dummyQuestionDatabase); // Act - boolean valid = Whitebox. invokeMethod(authManager, "isValidUsersSession", validSessionInformation, mappedUser); + boolean valid = authManager.isValidUsersSession(validSessionInformation, mappedUser); // Assert verify(dummyQuestionDatabase, dummySession, request); @@ -660,7 +661,7 @@ public final void validateUsersSession_incorrectSessionToken_shouldReturnAsIncor calendar.add(Calendar.SECOND, 500); String validDateString = sdf.format(calendar.getTime()); - Map sessionInformationWithTokenMismatch = getSessionInformationAsAMap(authManager, validUserId, + Map sessionInformationWithTokenMismatch = getSessionInformationAsAMap(validUserId, validDateString, incorrectSessionToken); replay(dummySession); @@ -668,7 +669,7 @@ public final void validateUsersSession_incorrectSessionToken_shouldReturnAsIncor replay(dummyQuestionDatabase); // Act - boolean valid = Whitebox. invokeMethod(authManager, "isValidUsersSession", sessionInformationWithTokenMismatch, mappedUser); + boolean valid = authManager.isValidUsersSession(sessionInformationWithTokenMismatch, mappedUser); // Assert verify(dummyQuestionDatabase, dummySession, request); @@ -800,9 +801,8 @@ private UserAuthenticationManager buildTestAuthenticationManager(AuthenticationP return new UserAuthenticationManager(dummyDatabase, dummyDeletionTokenManager, dummyPropertiesLoader, providerMap, dummyQueue); } - private Map getSessionInformationAsAMap(UserAuthenticationManager userAuthManager, String userId, String dateExpires, Integer sessionToken) - throws Exception { - String validHMAC = Whitebox. invokeMethod(userAuthManager, "calculateSessionHMAC", dummyHMACSalt, userId, + private Map getSessionInformationAsAMap(String userId, String dateExpires, Integer sessionToken) { + String validHMAC = UserAuthenticationManager.calculateSessionHMAC(dummyHMACSalt, userId, dateExpires, sessionToken.toString(), null); return ImmutableMap.of(Constants.SESSION_USER_ID, userId, Constants.DATE_EXPIRES, dateExpires, Constants.HMAC, validHMAC, Constants.SESSION_TOKEN, sessionToken.toString()); From b24628fc988f0c78685383d705c582bab66d6d7c Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Mon, 23 Feb 2026 14:33:30 +0000 Subject: [PATCH 13/38] Remove Whitebox usage from ContentIndexerTest --- .../cam/cl/dtg/segue/etl/ContentIndexer.java | 6 +- .../cl/dtg/segue/etl/ContentIndexerTest.java | 69 ++++--------------- 2 files changed, 18 insertions(+), 57 deletions(-) diff --git a/src/main/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexer.java b/src/main/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexer.java index 2ab80eecd3..5b115f5a08 100644 --- a/src/main/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexer.java +++ b/src/main/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexer.java @@ -562,7 +562,7 @@ private String fixMediaSrc(final String canonicalSourceFile, final String origin * content object to flatten * @return Set of content objects comprised of all children and the parent. */ - private Set flattenContentObjects(final Content content) { + public static Set flattenContentObjects(final Content content) { Set setOfContentObjects = new HashSet<>(); if (!content.getChildren().isEmpty()) { @@ -682,7 +682,7 @@ private synchronized void registerUnits(final IsaacNumericQuestion q, Map gitCache, final Set tagsList, final Map allUnits, @@ -931,7 +931,7 @@ private String collateExpandableChildren(Content content) { * @param sha version to validate integrity of. * @param content a single item of content */ - private void recordContentTypeSpecificError(final String sha, final Content content, final Map> indexProblemCache) { + public void recordContentTypeSpecificError(final String sha, final Content content, final Map> indexProblemCache) { // ensure content does not have children and a value if (content.getValue() != null && !content.getChildren().isEmpty()) { String id = content.getId(); diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java index 732357a0b8..435d7aa123 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java @@ -26,7 +26,6 @@ import com.google.common.collect.ImmutableMap; import org.junit.Before; import org.junit.Test; -import org.powermock.reflect.Whitebox; import com.fasterxml.jackson.databind.ObjectMapper; @@ -157,9 +156,8 @@ public void buildSearchIndexes_sendContentToSearchProvider_checkSearchProviderIs ContentIndexer contentIndexer = new ContentIndexer(database, searchProvider, contentSubclassMapper); // Method under test - Whitebox.invokeMethod(contentIndexer, - "buildElasticSearchIndex", - INITIAL_VERSION, contents, someTagsList, someUnitsMap, publishedUnitsMap, someContentProblemsMap); + contentIndexer.buildElasticSearchIndex(INITIAL_VERSION, contents, someTagsList, someUnitsMap, publishedUnitsMap, + someContentProblemsMap); verify(searchProvider, contentMapper, objectMapper); } @@ -179,8 +177,7 @@ public void flattenContentObjects_flattenMultiTierObject_checkCorrectObjectRetur Set elements = new HashSet<>(); Content rootNode = createContentHierarchy(numChildLevels, elements); - Set contents = Whitebox.invokeMethod( - defaultContentIndexer, "flattenContentObjects", rootNode); + Set contents = ContentIndexer.flattenContentObjects(rootNode); assertEquals(numNodes, contents.size()); @@ -211,13 +208,7 @@ public void recordContentTypeSpecificError_noSigFigSet_checkNoError() // ACT for (Content content : contents) { - Whitebox.invokeMethod( - defaultContentIndexer, - "recordContentTypeSpecificError", - "", - content, - indexProblemCache - ); + defaultContentIndexer.recordContentTypeSpecificError("", content, indexProblemCache); } // ASSERT @@ -243,13 +234,7 @@ public void recordContentTypeSpecificError_onlyOneSigFigSet_checkErrorIsCorrect( // ACT for (Content content : contents) { - Whitebox.invokeMethod( - defaultContentIndexer, - "recordContentTypeSpecificError", - "", - content, - indexProblemCache - ); + defaultContentIndexer.recordContentTypeSpecificError("", content, indexProblemCache); } // ASSERT @@ -278,13 +263,7 @@ public void recordContentTypeSpecificError_bothSigFigSetLessThan1_checkErrorIsCo // ACT for (Content content : contents) { - Whitebox.invokeMethod( - defaultContentIndexer, - "recordContentTypeSpecificError", - "", - content, - indexProblemCache - ); + defaultContentIndexer.recordContentTypeSpecificError("", content, indexProblemCache); } // ASSERT @@ -311,13 +290,7 @@ public void recordContentTypeSpecificError_maxLessThanMin_checkErrorIsCorrect() // ACT for (Content content : contents) { - Whitebox.invokeMethod( - defaultContentIndexer, - "recordContentTypeSpecificError", - "", - content, - indexProblemCache - ); + defaultContentIndexer.recordContentTypeSpecificError("", content, indexProblemCache); } // ASSERT @@ -345,13 +318,7 @@ public void recordContentTypeSpecificError_minLessThanMax_checkNoError() // ACT for (Content content : contents) { - Whitebox.invokeMethod( - defaultContentIndexer, - "recordContentTypeSpecificError", - "", - content, - indexProblemCache - ); + defaultContentIndexer.recordContentTypeSpecificError("", content, indexProblemCache); } // ASSERT @@ -383,13 +350,7 @@ public void recordContentTypeSpecificError_disregardSigFigsSet_checkNoError() // ACT for (Content content : contents) { - Whitebox.invokeMethod( - defaultContentIndexer, - "recordContentTypeSpecificError", - "", - content, - indexProblemCache - ); + defaultContentIndexer.recordContentTypeSpecificError("", content, indexProblemCache); } // ASSERT @@ -411,7 +372,7 @@ public void recordContentTypeSpecificError_dndQuestionCorrect_checkNoError() thr // ACT for (Content content : contents) { - Whitebox.invokeMethod(defaultContentIndexer, "recordContentTypeSpecificError", "", content, problemCache); + defaultContentIndexer.recordContentTypeSpecificError("", content, problemCache); } // ASSERT @@ -432,7 +393,7 @@ public void recordContentTypeSpecificError_dndQuestionNoDropZones_checkErrorIsCo // ACT for (Content content : contents) { - Whitebox.invokeMethod(defaultContentIndexer, "recordContentTypeSpecificError", "", content, problemCache); + defaultContentIndexer.recordContentTypeSpecificError("", content, problemCache); } // ASSERT @@ -456,7 +417,7 @@ public void recordContentTypeSpecificError_dndQuestionDuplicateDropZones_checkEr // ACT for (Content content : contents) { - Whitebox.invokeMethod(defaultContentIndexer, "recordContentTypeSpecificError", "", content, problemCache); + defaultContentIndexer.recordContentTypeSpecificError("", content, problemCache); } // ASSERT @@ -480,7 +441,7 @@ public void recordContentTypeSpecificError_dndQuestionUnusedDropZones_checkError // ACT for (Content content : contents) { - Whitebox.invokeMethod(defaultContentIndexer, "recordContentTypeSpecificError", "", content, problemCache); + defaultContentIndexer.recordContentTypeSpecificError("", content, problemCache); } // ASSERT @@ -504,7 +465,7 @@ public void recordContentTypeSpecificError_dndQuestionUnrecognisedDropZones_chec // ACT for (Content content : contents) { - Whitebox.invokeMethod(defaultContentIndexer, "recordContentTypeSpecificError", "", content, problemCache); + defaultContentIndexer.recordContentTypeSpecificError("", content, problemCache); } // ASSERT @@ -530,7 +491,7 @@ public void recordContentTypeSpecificError_answerDuplicateDropZones_checkErrorIs // ACT for (Content content : contents) { - Whitebox.invokeMethod(defaultContentIndexer, "recordContentTypeSpecificError", "", content, problemCache); + defaultContentIndexer.recordContentTypeSpecificError("", content, problemCache); } // ASSERT From 968bf32e9c2b690d487ff762759960d3f1767949 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Mon, 23 Feb 2026 15:41:24 +0000 Subject: [PATCH 14/38] Remove PowerMock usage from YamlLoaderTest --- .../uk/ac/cam/cl/dtg/util/YamlLoader.java | 18 ++++- .../uk/ac/cam/cl/dtg/util/YamlLoaderTest.java | 66 +++++++++---------- 2 files changed, 46 insertions(+), 38 deletions(-) diff --git a/src/main/java/uk/ac/cam/cl/dtg/util/YamlLoader.java b/src/main/java/uk/ac/cam/cl/dtg/util/YamlLoader.java index 274d6c3ec8..6a7eb10083 100644 --- a/src/main/java/uk/ac/cam/cl/dtg/util/YamlLoader.java +++ b/src/main/java/uk/ac/cam/cl/dtg/util/YamlLoader.java @@ -66,9 +66,23 @@ public Set getKeys() { return this.loadedConfig.keySet(); } + /** + * Factory method that can be overridden for testing + */ + protected Yaml createYaml() { + return new Yaml(); + } + + /** + * Factory method that can be overridden for testing + */ + protected FileInputStream createFileInputStream(String path) throws IOException { + return new FileInputStream(path); + } + @Override protected synchronized void loadConfig() throws IOException { - Yaml yaml = new Yaml(); + Yaml yaml = createYaml(); String[] configPaths = this.configPath.split(","); @@ -77,7 +91,7 @@ protected synchronized void loadConfig() throws IOException { // check to see if this a resource or a file somewhere else if (getClass().getClassLoader().getResourceAsStream(path) == null) { - try (FileInputStream ioStream = new FileInputStream(path)) { + try (FileInputStream ioStream = createFileInputStream(path)) { // then we have to look further afield subConfig = yaml.load(ioStream); } diff --git a/src/test/java/uk/ac/cam/cl/dtg/util/YamlLoaderTest.java b/src/test/java/uk/ac/cam/cl/dtg/util/YamlLoaderTest.java index 3a3203b231..14c4e64297 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/util/YamlLoaderTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/util/YamlLoaderTest.java @@ -2,11 +2,11 @@ import org.easymock.EasyMock; import org.junit.Test; -import org.powermock.api.easymock.PowerMock; import org.yaml.snakeyaml.Yaml; import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -35,62 +35,56 @@ public void yamlLoader_usingMultipleResourceConfigFiles_firstFileValuesAreOverri @Test public void yamlLoader_usingSingleConfigFile_loadsSuccessfully() throws Exception { - // Arrange - setUpMockConfigs(); - - // Act - YamlLoader loader = new YamlLoader("/some/external/file/path.properties"); - - // Assert + YamlLoader loader = getTestableYamlLoader("/some/external/file/path.properties", false); assertEquals("src/test/resources/content_indices.test.properties", loader.getProperty("CONTENT_INDICES_LOCATION")); } @Test public void yamlLoader_usingMultipleConfigFiles_firstFileValuesAreOverriddenBySecond() throws Exception { - // Arrange - setUpMockConfigs(); - - // Act - YamlLoader loader = new YamlLoader( - "/some/external/file/path.properties,/another/external/file/path.properties" - ); - - // Assert + YamlLoader loader = getTestableYamlLoader("/some/external/file/path.properties," + + "/another/external/file/path.properties", true); assertEquals("somewhere/on/my/machine.properties", loader.getProperty("CONTENT_INDICES_LOCATION")); } - public void setUpMockConfigs() throws Exception { + private YamlLoader getTestableYamlLoader(final String paths, final boolean includeOverride) throws Exception { // Mock on-disk config files // main config file - String configPath = "/some/external/file/path.properties"; - Map mockConfig = new ConcurrentHashMap<>(); mockConfig.put("CONTENT_INDICES_LOCATION", "src/test/resources/content_indices.test.properties"); FileInputStream mockConfigFileInputStream = EasyMock.createNiceMock(FileInputStream.class); - EasyMock.replay(mockConfigFileInputStream); - - PowerMock.expectNew(FileInputStream.class, configPath).andReturn(mockConfigFileInputStream); // override config file - String overridePath = "/another/external/file/path.properties"; - Map mockOverrideConfig = new ConcurrentHashMap<>(); mockOverrideConfig.put("CONTENT_INDICES_LOCATION", "somewhere/on/my/machine.properties"); FileInputStream mockOverrideFileInputStream = EasyMock.createNiceMock(FileInputStream.class); - EasyMock.replay(mockOverrideFileInputStream); - PowerMock.expectNew(FileInputStream.class, overridePath).andReturn(mockOverrideFileInputStream); + Yaml mockYaml = EasyMock.createMock(Yaml.class); // configure mock YAML parser to return mock configs - PowerMock.replay(FileInputStream.class); - - Yaml mockYaml = EasyMock.createMock(Yaml.class); - EasyMock.expect(mockYaml.load(mockConfigFileInputStream)).andStubReturn(mockConfig); - EasyMock.expect(mockYaml.load(mockOverrideFileInputStream)).andStubReturn(mockOverrideConfig); - EasyMock.replay(mockYaml); - PowerMock.expectNew(Yaml.class).andReturn(mockYaml); - PowerMock.replay(Yaml.class); + if (includeOverride) { + EasyMock.expect(mockYaml.load(EasyMock.anyObject(InputStream.class))) + .andReturn(mockConfig) + .andReturn(mockOverrideConfig); + } else { + EasyMock.expect(mockYaml.load(EasyMock.anyObject(InputStream.class))) + .andReturn(mockConfig); + } + + EasyMock.replay(mockConfigFileInputStream, mockOverrideFileInputStream, mockYaml); + + // This cannot be a (partial) mock because we need to set configPath + return new YamlLoader(paths) { + @Override + protected Yaml createYaml() { + return mockYaml; + } + + @Override + protected FileInputStream createFileInputStream(final String path) { + return includeOverride ? mockOverrideFileInputStream : mockConfigFileInputStream; + } + }; } -} +} \ No newline at end of file From b4adb4d8caa5e9f46cc442d8372c7b93865bd567 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Tue, 24 Feb 2026 10:23:53 +0000 Subject: [PATCH 15/38] Refactor LLM validator tests to use Mockito, and not use PowerMock --- pom.xml | 19 +- .../quiz/IsaacLLMFreeTextValidatorTest.java | 265 +++++++++--------- 2 files changed, 146 insertions(+), 138 deletions(-) diff --git a/pom.xml b/pom.xml index 854725dac3..a4e7493afc 100644 --- a/pom.xml +++ b/pom.xml @@ -255,25 +255,18 @@ ${testcontainers.version} test - - - org.powermock - powermock-module-junit4 - ${powermock.version} - test - - - org.powermock - powermock-api-easymock - ${powermock.version} - test - org.easymock easymock 4.3 test + + org.mockito + mockito-junit-jupiter + 5.11.0 + test + org.slf4j diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacLLMFreeTextValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacLLMFreeTextValidatorTest.java index 028da55007..335bb175a2 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacLLMFreeTextValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacLLMFreeTextValidatorTest.java @@ -20,63 +20,81 @@ import com.azure.ai.openai.models.ChatCompletions; import com.azure.ai.openai.models.ChatCompletionsOptions; import com.azure.ai.openai.models.ChatResponseMessage; -import org.easymock.EasyMock; import org.json.JSONObject; -import org.junit.Test; -import org.junit.experimental.runners.Enclosed; import org.junit.jupiter.api.DisplayName; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameter; -import org.junit.runners.Parameterized.Parameters; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.modules.junit4.PowerMockRunnerDelegate; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import uk.ac.cam.cl.dtg.isaac.dos.IsaacLLMFreeTextQuestion; import uk.ac.cam.cl.dtg.isaac.dos.LLMFreeTextQuestionValidationResponse; -import uk.ac.cam.cl.dtg.isaac.dos.content.*; +import uk.ac.cam.cl.dtg.isaac.dos.content.LLMFreeTextChoice; +import uk.ac.cam.cl.dtg.isaac.dos.content.LLMFreeTextMarkSchemeEntry; +import uk.ac.cam.cl.dtg.isaac.dos.content.LLMFreeTextMarkedExample; +import uk.ac.cam.cl.dtg.isaac.dos.content.LLMMarkingExpression; +import uk.ac.cam.cl.dtg.isaac.dos.content.LLMMarkingFunction; +import uk.ac.cam.cl.dtg.isaac.dos.content.LLMMarkingVariable; +import uk.ac.cam.cl.dtg.isaac.dos.content.Question; import uk.ac.cam.cl.dtg.util.YamlLoader; import java.io.IOException; -import java.util.*; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.easymock.EasyMock.*; -import static org.junit.Assert.*; -import static org.powermock.api.easymock.PowerMock.createMock; -import static org.powermock.api.easymock.PowerMock.replayAll; -import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Factories.*; -import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Helpers.*; -import static uk.ac.cam.cl.dtg.segue.api.Constants.LLM_MARKER_MAX_ANSWER_LENGTH; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Factories.advantageExamples; +import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Factories.answer; +import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Factories.client; +import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Factories.createLLMFreeTextQuestion; +import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Factories.formulaFn; +import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Factories.formulaVar; +import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Factories.genericExamples; +import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Factories.pointExplanationExamples; +import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Factories.propertiesForTest; +import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Factories.question; +import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Factories.toMarkScheme; +import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Helpers.CORRECT; +import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Helpers.INCORRECT; +import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Helpers.NO_MARKS; +import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Helpers.ONE_MARK; +import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Helpers.TWO_MARKS; +import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Helpers.expectMark; +import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Helpers.getIntTestProperty; +import static uk.ac.cam.cl.dtg.isaac.quiz.IsaacLLMFreeTextValidatorTest.Helpers.validate; +import static uk.ac.cam.cl.dtg.segue.api.Constants.*; -@RunWith(Enclosed.class) public class IsaacLLMFreeTextValidatorTest { - @RunWith(PowerMockRunner.class) - @PowerMockRunnerDelegate(Parameterized.class) - @PrepareForTest({OpenAIClient.class, ChatCompletions.class, ChatChoice.class, ChatResponseMessage.class}) + + @Nested @DisplayName("Test that a mark is awarded based on the marking formula") - public static class TestFormulaBasedMarking { - @Parameter() - public String description; - @Parameter(1) - public IsaacLLMFreeTextQuestion question; - @Parameter(2) - public String breakdown; - @Parameter(3) - public boolean expectedResult; - @Parameter(4) - public int expectedMarkTotal; - - @Parameters(name = "{index}: {0}") - public static List data() { - return Stream.of(genericOneMarkCases(), genericTwoMarkCases(), advantageCases(), pointExplanationCases()) - .flatMap(Arrays::stream).collect(Collectors.toList()); + class TestFormulaBasedMarking { + + static Stream data() { + return Stream.of( + genericOneMarkCases(), + genericTwoMarkCases(), + advantageCases(), + pointExplanationCases() + ).flatMap(s -> s); } - @Test - public void test() throws Exception { - var resp = validate(question, answer(), client(breakdown)); + @ParameterizedTest(name = "{index}: {0}") + @MethodSource("data") + void test(final IsaacLLMFreeTextQuestion question, final String breakdown, + final boolean expectedResult, final int expectedMarkTotal) throws Exception { + LLMFreeTextQuestionValidationResponse resp = validate(question, answer(), client(breakdown)); expectMark(resp, expectedResult, expectedMarkTotal, toMarkScheme(breakdown)); } @@ -85,28 +103,30 @@ public void test() throws Exception { This mark scheme is used when no other valid mark scheme is specified for the question. It is the total number of marks received, capped by the required maxMarks. */ - private static Object[][] genericOneMarkCases() { - var question = createLLMFreeTextQuestion("{\"reasonFoo\": 1, \"reasonBar\": 1, \"reasonFizz\": 1}", + private static Stream genericOneMarkCases() { + IsaacLLMFreeTextQuestion question = createLLMFreeTextQuestion("{\"reasonFoo\": 1, \"reasonBar\": 1, \"reasonFizz\": 1}", 1, genericExamples(), null); - return new Object[][]{ - {"A one-mark answer for a default marking formula one-mark question gets recognised as correct", - question, "{\"reasonFoo\": 1, \"reasonBar\": 0, \"reasonFizz\": 0}", CORRECT, ONE_MARK}, - {"A three-mark answer for a default marking formula one-mark question gets recognised as correct", - question, "{\"reasonFoo\": 1, \"reasonBar\": 1, \"reasonFizz\": 0}", CORRECT, ONE_MARK}, - {"A zero-mark answer for a one-mark question gets recognised as incorrect", - question, "{\"reasonFoo\": 0, \"reasonBar\": 0, \"reasonFizz\": 0}", INCORRECT, NO_MARKS}}; + return Stream.of( + Arguments.of("A one-mark answer for a default marking formula one-mark question gets recognised as correct", + question, "{\"reasonFoo\": 1, \"reasonBar\": 0, \"reasonFizz\": 0}", CORRECT, ONE_MARK), + Arguments.of("A three-mark answer for a default marking formula one-mark question gets recognised as correct", + question, "{\"reasonFoo\": 1, \"reasonBar\": 1, \"reasonFizz\": 0}", CORRECT, ONE_MARK), + Arguments.of("A zero-mark answer for a one-mark question gets recognised as incorrect", + question, "{\"reasonFoo\": 0, \"reasonBar\": 0, \"reasonFizz\": 0}", INCORRECT, NO_MARKS) + ); } - private static Object[][] genericTwoMarkCases() { - var question = createLLMFreeTextQuestion("{\"reasonFoo\": 1, \"reasonBar\": 1, \"reasonFizz\": 1}", + private static Stream genericTwoMarkCases() { + IsaacLLMFreeTextQuestion question = createLLMFreeTextQuestion("{\"reasonFoo\": 1, \"reasonBar\": 1, \"reasonFizz\": 1}", 2, genericExamples(), null); - return new Object[][]{ - {"A two-mark answer for a default marking formula two-mark question gets recognised as correct", - question, "{\"reasonFoo\": 1, \"reasonBar\": 1, \"reasonFizz\": 0}", CORRECT, TWO_MARKS}, - {"A one-mark answer for a default marking formula two-mark question receives exactly one mark", - question, "{\"reasonFoo\": 1, \"reasonBar\": 0, \"reasonFizz\": 0}", CORRECT, ONE_MARK}}; + return Stream.of( + Arguments.of("A two-mark answer for a default marking formula two-mark question gets recognised as correct", + question, "{\"reasonFoo\": 1, \"reasonBar\": 1, \"reasonFizz\": 0}", CORRECT, TWO_MARKS), + Arguments.of("A one-mark answer for a default marking formula two-mark question receives exactly one mark", + question, "{\"reasonFoo\": 1, \"reasonBar\": 0, \"reasonFizz\": 0}", CORRECT, ONE_MARK) + ); } /* @@ -116,20 +136,21 @@ private static Object[][] genericTwoMarkCases() { This is a generally applicable mark scheme for any two mutually exclusive categories of marks. A common example of this is advantages and disadvantages. */ - private static Object[][] advantageCases() { - var formula = formulaFn("SUM", + private static Stream advantageCases() { + LLMMarkingFunction formula = formulaFn("SUM", formulaFn("MAX", formulaVar("adv1"), formulaVar("adv2")), formulaFn("MAX", formulaVar("dis1"), formulaVar("dis2"))); - var question = createLLMFreeTextQuestion("{\"adv1\": 1, \"adv2\": 1, \"dis1\": 1, \"dis2\": 1}", + IsaacLLMFreeTextQuestion question = createLLMFreeTextQuestion("{\"adv1\": 1, \"adv2\": 1, \"dis1\": 1, \"dis2\": 1}", 2, advantageExamples(), formula); - return new Object[][]{ - {"An answer containing an advantage and a disadvantage mark receives two marks", - question, "{\"adv1\": 1, \"adv2\": 0, \"dis1\": 1, \"dis2\": 0}", CORRECT, TWO_MARKS}, - {"An answer containing only a disadvantage mark receives one mark", - question, "{\"adv1\": 0, \"adv2\": 0, \"dis1\": 1, \"dis2\": 0}", CORRECT, ONE_MARK}, - {"An answer containing two advantage marks receives one mark", - question, "{\"adv1\": 1, \"adv2\": 1, \"dis1\": 0, \"dis2\": 0}", CORRECT, ONE_MARK}}; + return Stream.of( + Arguments.of("An answer containing an advantage and a disadvantage mark receives two marks", + question, "{\"adv1\": 1, \"adv2\": 0, \"dis1\": 1, \"dis2\": 0}", CORRECT, TWO_MARKS), + Arguments.of("An answer containing only a disadvantage mark receives one mark", + question, "{\"adv1\": 0, \"adv2\": 0, \"dis1\": 1, \"dis2\": 0}", CORRECT, ONE_MARK), + Arguments.of("An answer containing two advantage marks receives one mark", + question, "{\"adv1\": 1, \"adv2\": 1, \"dis1\": 0, \"dis2\": 0}", CORRECT, ONE_MARK) + ); } @@ -141,60 +162,59 @@ private static Object[][] advantageCases() { This is a generally applicable mark scheme for any grouped sets of marks where a prerequisite mark is required to receive a secondary mark. A common example of this is points and explanations. */ - private static Object[][] pointExplanationCases() { - var formula = formulaFn("SUM", + private static Stream pointExplanationCases() { + LLMMarkingFunction formula = formulaFn("SUM", formulaFn("MAX", formulaVar("pnt1"), formulaVar("pnt2")), formulaFn("MAX", formulaFn("MIN", formulaVar("pnt1"), formulaVar("expl1")), formulaFn("MIN", formulaVar("pnt2"), formulaVar("expl2")))); - var question = createLLMFreeTextQuestion("{\"pnt1\": 1, \"pnt2\": 1, \"expl1\": 1, \"expl2\": 1}", + IsaacLLMFreeTextQuestion question = createLLMFreeTextQuestion("{\"pnt1\": 1, \"pnt2\": 1, \"expl1\": 1, \"expl2\": 1}", 2, pointExplanationExamples(), formula); - return new Object[][]{ - {"An answer containing a point and matching explanation receives two marks", - question, "{\"pnt1\": 1, \"pnt2\": 0, \"expl1\": 1, \"expl2\": 0}", CORRECT, TWO_MARKS}, - {"An answer containing an explanation without a matching point receives zero marks", - question, "{\"pnt1\": 0, \"pnt2\": 0, \"expl1\": 1, \"expl2\": 0}", INCORRECT, NO_MARKS}, - {"An answer containing a point and a mismatched explanation receives one mark", - question, "{\"pnt1\": 1, \"pnt2\": 0, \"expl1\": 0, \"expl2\": 0}", CORRECT, ONE_MARK}}; + return Stream.of( + Arguments.of("An answer containing a point and matching explanation receives two marks", + question, "{\"pnt1\": 1, \"pnt2\": 0, \"expl1\": 1, \"expl2\": 0}", CORRECT, TWO_MARKS), + Arguments.of("An answer containing an explanation without a matching point receives zero marks", + question, "{\"pnt1\": 0, \"pnt2\": 0, \"expl1\": 1, \"expl2\": 0}", INCORRECT, NO_MARKS), + Arguments.of("An answer containing a point and a mismatched explanation receives one mark", + question, "{\"pnt1\": 1, \"pnt2\": 0, \"expl1\": 0, \"expl2\": 0}", CORRECT, ONE_MARK) + ); } } - @RunWith(PowerMockRunner.class) - @PrepareForTest({OpenAIClient.class, ChatCompletions.class, ChatChoice.class, ChatResponseMessage.class}) + @Nested @DisplayName("Test application behaviour in case of errors.") - public static class TestErrorHandling { + class TestErrorHandling { @Test @DisplayName("A response from the client not in the expected json format returns zero marks") - public void isaacLLMFreeTextValidator_ResponseInvalidFormat_MarkSchemeShouldIncludeNoMarks() throws Exception { - var question = createLLMFreeTextQuestion("{\"reasonFoo\": 1, \"reasonBar\": 1, \"reasonFizz\": 1}", + void isaacLLMFreeTextValidator_ResponseInvalidFormat_MarkSchemeShouldIncludeNoMarks() throws Exception { + IsaacLLMFreeTextQuestion question = createLLMFreeTextQuestion("{\"reasonFoo\": 1, \"reasonBar\": 1, \"reasonFizz\": 1}", 1, genericExamples(), null); - var response = validate(question, answer(), client("Not a valid JSON response")); + LLMFreeTextQuestionValidationResponse response = validate(question, answer(), client("Not a valid JSON response")); expectMark(response, INCORRECT, 0, toMarkScheme("{\"reasonFoo\": 0, \"reasonBar\": 0, \"reasonFizz\": 0}")); } @Test @DisplayName("An answer exceeding the maximum answer length is handled with an exception") - public void isaacLLMFreeTextValidator_AnswerOverLengthLimit_ExceptionShouldBeThrown() throws Exception { - var maxAnswerLength = getIntTestProperty(LLM_MARKER_MAX_ANSWER_LENGTH, 4096); - var choice = new LLMFreeTextChoice(); + void isaacLLMFreeTextValidator_AnswerOverLengthLimit_ExceptionShouldBeThrown() throws Exception { + int maxAnswerLength = getIntTestProperty(LLM_MARKER_MAX_ANSWER_LENGTH, 4096); + LLMFreeTextChoice choice = new LLMFreeTextChoice(); choice.setValue(String.join("", Collections.nCopies((maxAnswerLength / 10 + 1), "Repeat Me "))); - var exception = assertThrows(IllegalArgumentException.class, () -> validate(question(), choice, client())); + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> validate(question(), choice, client())); assertEquals("Answer is too long for LLM free-text question marking", exception.getMessage()); } @Test @DisplayName("Error from the client (e.g. timeout, rate limit, out of credits) is handled with an exception") - public void isaacLLMFreeTextValidator_ResponseError_ExceptionShouldBeThrown() { - var client = createMock(OpenAIClient.class); - EasyMock.expect(client.getChatCompletions(anyString(), isA(ChatCompletionsOptions.class))) - .andThrow(new RuntimeException("Test OpenAI Exception")); - replay(client); + void isaacLLMFreeTextValidator_ResponseError_ExceptionShouldBeThrown() { + OpenAIClient client = mock(OpenAIClient.class); + when(client.getChatCompletions(anyString(), any(ChatCompletionsOptions.class))) + .thenThrow(new RuntimeException("Test OpenAI Exception")); - var exception = assertThrows(ValidatorUnavailableException.class, () -> validate(question(), answer(), client)); + ValidatorUnavailableException exception = assertThrows(ValidatorUnavailableException.class, () -> validate(question(), answer(), client)); assertEquals("We are having problems marking LLM marked questions. Please try again later!", exception.getMessage()); @@ -202,17 +222,17 @@ public void isaacLLMFreeTextValidator_ResponseError_ExceptionShouldBeThrown() { @Test @DisplayName("Invalid question (missing maxMarks fields) is handled with an exception") - public void isaacLLMFreeTextValidator_MissingMaxMarks_ExceptionShouldBeThrown() { - var badFields = createLLMFreeTextQuestion(null, null, null, null); - var exception = assertThrows(IllegalArgumentException.class, () -> validate(badFields, answer(), client())); + void isaacLLMFreeTextValidator_MissingMaxMarks_ExceptionShouldBeThrown() { + IsaacLLMFreeTextQuestion badFields = createLLMFreeTextQuestion(null, null, null, null); + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> validate(badFields, answer(), client())); assertEquals("This question cannot be answered correctly", exception.getMessage()); } @Test @DisplayName("Invalid question (not LLMFreeTextQuestion) is handled with an exception") - public void isaacLLMFreeTextValidator_NotLLMFreeTextQuestion_ExceptionShouldBeThrown() { - var badType = new Question(); - var exception = assertThrows(IllegalArgumentException.class, () -> validate(badType, answer(), client())); + void isaacLLMFreeTextValidator_NotLLMFreeTextQuestion_ExceptionShouldBeThrown() { + Question badType = new Question(); + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> validate(badType, answer(), client())); assertEquals(badType.getId() + " is not a LLM free-text question", exception.getMessage()); } } @@ -234,10 +254,9 @@ protected static class Helpers { * @param client - use the mocked client instance to specify the mark breakdown the API should return * @return the response from the validator, examine this object in "assert". */ - public static LLMFreeTextQuestionValidationResponse validate(Question question, - LLMFreeTextChoice answer, + public static LLMFreeTextQuestionValidationResponse validate(Question question, LLMFreeTextChoice answer, OpenAIClient client) throws Exception { - var validator = new IsaacLLMFreeTextValidator(propertiesForTest(), client); + IsaacLLMFreeTextValidator validator = new IsaacLLMFreeTextValidator(propertiesForTest(), client); return (LLMFreeTextQuestionValidationResponse) validator.validateQuestionResponse(question, answer); } @@ -252,10 +271,8 @@ public static LLMFreeTextQuestionValidationResponse validate(Question question, * ONE_MARK, TWO_MARKS. * @param expectedMarks - double check that the breakdown is returned in the expected format */ - public static void expectMark(LLMFreeTextQuestionValidationResponse response, - boolean isCorrect, - int marksAwarded, - List expectedMarks) { + public static void expectMark(LLMFreeTextQuestionValidationResponse response, boolean isCorrect, + int marksAwarded, List expectedMarks) { assertEquals(isCorrect, response.isCorrect()); assertEquals(marksAwarded, (long) response.getMarks()); assertTrue(expectedMarks.containsAll(response.getMarkBreakdown())); @@ -309,19 +326,17 @@ public static OpenAIClient client() { } public static OpenAIClient client(final String llmResponse) { - // These must be PowerMocked since the classes are final in the Azure OpenAI library - var client = createMock(OpenAIClient.class); - var chatCompletions = createMock(ChatCompletions.class); - var chatChoice = createMock(ChatChoice.class); - var chatResponseMessage = createMock(ChatResponseMessage.class); - - EasyMock.expect(chatResponseMessage.getContent()).andReturn(llmResponse); - EasyMock.expect(chatChoice.getMessage()).andReturn(chatResponseMessage); - EasyMock.expect(chatCompletions.getChoices()).andReturn(Collections.singletonList(chatChoice)).times(2); - EasyMock.expect(client.getChatCompletions(anyString(), isA(ChatCompletionsOptions.class))) - .andReturn(chatCompletions); - - replayAll(); + OpenAIClient client = mock(OpenAIClient.class); + ChatCompletions chatCompletions = mock(ChatCompletions.class); + ChatChoice chatChoice = mock(ChatChoice.class); + ChatResponseMessage chatResponseMessage = mock(ChatResponseMessage.class); + + when(chatResponseMessage.getContent()).thenReturn(llmResponse); + when(chatChoice.getMessage()).thenReturn(chatResponseMessage); + when(chatCompletions.getChoices()).thenReturn(Collections.singletonList(chatChoice)); + when(client.getChatCompletions(anyString(), any(ChatCompletionsOptions.class))) + .thenReturn(chatCompletions); + return client; } @@ -376,9 +391,9 @@ public static YamlLoader propertiesForTest() throws IOException { } public static List toMarkScheme(String json) { - var parsed = new JSONObject(json); + JSONObject parsed = new JSONObject(json); return parsed.keySet().stream().map(key -> { - var output = new LLMFreeTextMarkSchemeEntry(); + LLMFreeTextMarkSchemeEntry output = new LLMFreeTextMarkSchemeEntry(); output.setJsonField(key); output.setMarks(parsed.getInt(key)); output.setShortDescription("Some description that does not matter for the test."); @@ -388,12 +403,12 @@ public static List toMarkScheme(String json) { private static List generateMarkedExamples(JSONObject... jsonMarkedExamples) { return Stream.of(jsonMarkedExamples).map(input -> { - var output = new LLMFreeTextMarkedExample(); + LLMFreeTextMarkedExample output = new LLMFreeTextMarkedExample(); output.setAnswer(input.getString("answer")); output.setMarksAwarded(input.getInt("marksAwarded")); - var jsonMarkedExampleMarks = input.getJSONObject("marks"); - var marks = jsonMarkedExampleMarks.keySet().stream() + JSONObject jsonMarkedExampleMarks = input.getJSONObject("marks"); + Map marks = jsonMarkedExampleMarks.keySet().stream() .collect(Collectors.toMap(mark -> mark, jsonMarkedExampleMarks::getInt)); output.setMarks(marks); From fa2212457035d8fe44d59453157d81f3ab1fb1bd Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Tue, 24 Feb 2026 10:26:00 +0000 Subject: [PATCH 16/38] Add Mockito dependency --- pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pom.xml b/pom.xml index a4e7493afc..605f71b1cb 100644 --- a/pom.xml +++ b/pom.xml @@ -261,6 +261,12 @@ 4.3 test + + org.mockito + mockito-core + 5.11.0 + test + org.mockito mockito-junit-jupiter From 423e6a3cfd9438efcacf239cb9b272e086fd5355 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Tue, 24 Feb 2026 10:28:03 +0000 Subject: [PATCH 17/38] Upgrade EasyMock version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 605f71b1cb..a91f5c55af 100644 --- a/pom.xml +++ b/pom.xml @@ -258,7 +258,7 @@ org.easymock easymock - 4.3 + 5.6.0 test From 5edc4ab84c1509d850776b7453df1fc87533b772 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Tue, 24 Feb 2026 10:37:47 +0000 Subject: [PATCH 18/38] Fix LLM-related QuestionFacade tests Replay the necessary mocks so that the correct exceptions are thrown. --- .../java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java index 896bb51e61..99d5cdb76d 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java @@ -130,6 +130,7 @@ public final void assertUserCanAnswerLLMQuestions_NonConsentingUser_ShouldThrowE UserPreference userPreference = new UserPreference(adminUser.getId(), "CONSENT", "OPENAI", false); expect(userPreferenceManager.getUserPreference("CONSENT", LLM_PROVIDER_NAME, adminUser.getId())).andReturn(userPreference); + replay(properties, userPreferenceManager); setUpQuestionFacade(); // Act & Assert @@ -157,6 +158,7 @@ public final void assertUserCanAnswerLLMQuestions_NoUses_ShouldThrowException() misuseMonitor = createMock(IMisuseMonitor.class); expect(misuseMonitor.getRemainingUses(adminUser.getId().toString(), "LLMFreeTextQuestionAttemptMisuseHandler")).andReturn(0); + replay(properties, userPreferenceManager, misuseMonitor); setUpQuestionFacade(); // Act & Assert @@ -181,7 +183,7 @@ public final void assertUserCanAnswerLLMQuestions_ConsentingUser_ShouldReturnOka userPreferenceManager = createMock(AbstractUserPreferenceManager.class); UserPreference userPreference = new UserPreference(adminUser.getId(), "CONSENT", "OPENAI", true); expect(userPreferenceManager.getUserPreference("CONSENT", LLM_PROVIDER_NAME, adminUser.getId())).andReturn(userPreference); - + replay(properties, misuseMonitor, userPreferenceManager); setUpQuestionFacade(); // Act From 0c1827f0b2f7f3a214222f8e587541636184e6ac Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Tue, 24 Feb 2026 10:55:08 +0000 Subject: [PATCH 19/38] Replace Before -> BeforeEach (JUnit 4 -> JUnit 5) --- src/test/java/uk/ac/cam/cl/dtg/isaac/IsaacTest.java | 4 ++-- .../java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java | 4 ++-- .../java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java | 4 ++-- .../cl/dtg/isaac/api/managers/EventBookingManagerTest.java | 4 ++-- .../ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java | 4 ++-- .../dtg/isaac/api/managers/QuizAssignmentManagerTest.java | 6 +++--- .../cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java | 4 ++-- .../ac/cam/cl/dtg/isaac/api/managers/QuizManagerTest.java | 4 ++-- .../cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java | 6 +++--- .../cl/dtg/isaac/api/managers/UserAttemptManagerTest.java | 4 ++-- .../uk/ac/cam/cl/dtg/isaac/app/GameboardsFacadeTest.java | 4 ++-- .../cl/dtg/isaac/dos/eventbookings/PgEventBookingsTest.java | 4 ++-- .../ac/cam/cl/dtg/isaac/quiz/IsaacClozeValidatorTest.java | 4 ++-- .../cam/cl/dtg/isaac/quiz/IsaacCoordinateValidatorTest.java | 4 ++-- .../cl/dtg/isaac/quiz/IsaacGraphSketcherValidatorTest.java | 4 ++-- .../cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java | 4 ++-- .../ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java | 4 ++-- .../ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java | 4 ++-- .../ac/cam/cl/dtg/isaac/quiz/IsaacReorderValidatorTest.java | 4 ++-- .../cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java | 4 ++-- .../ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java | 4 ++-- .../dtg/segue/api/managers/UserAssociationManagerTest.java | 4 ++-- .../ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java | 4 ++-- .../ac/cam/cl/dtg/segue/api/monitors/MisuseMonitorTest.java | 4 ++-- .../ac/cam/cl/dtg/segue/auth/GoogleAuthenticatorTest.java | 4 ++-- .../cam/cl/dtg/segue/auth/MicrosoftAuthenticatorTest.java | 4 ++-- .../cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java | 5 ++--- .../cam/cl/dtg/segue/auth/SegueLocalAuthenticatorTest.java | 3 ++- .../java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java | 4 ++-- .../ac/cam/cl/dtg/segue/comm/MailGunEmailManagerTest.java | 4 ++-- .../ac/cam/cl/dtg/segue/dao/ContentSubclassMapperTest.java | 4 ++-- .../uk/ac/cam/cl/dtg/segue/dao/GitContentManagerTest.java | 4 ++-- .../java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java | 4 ++-- .../cam/cl/dtg/segue/util/PostCodeLocationResolverTest.java | 4 ++-- 34 files changed, 70 insertions(+), 70 deletions(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/IsaacTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/IsaacTest.java index ac124865b5..234bd2be13 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/IsaacTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/IsaacTest.java @@ -17,7 +17,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import org.junit.Before; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.isaac.api.Constants; import uk.ac.cam.cl.dtg.isaac.api.managers.GameManager; import uk.ac.cam.cl.dtg.isaac.api.managers.QuizManager; @@ -130,7 +130,7 @@ public class IsaacTest { protected Map defaultsMap = new HashMap<>(); - @Before + @BeforeEach public final void initializeIsaacTest() throws SegueDatabaseException, ContentManagerException { initializeIsaacObjects(); initializeMocks(); diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java index ab78dacde5..b6ae007e88 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java @@ -17,7 +17,7 @@ import com.google.api.client.util.Maps; import com.google.common.base.Joiner; -import org.junit.Before; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.isaac.IsaacTest; import uk.ac.cam.cl.dtg.isaac.dto.SegueErrorResponse; import uk.ac.cam.cl.dtg.isaac.dto.users.RegisteredUserDTO; @@ -91,7 +91,7 @@ abstract public class AbstractFacadeTest extends IsaacTest { private Map userSummaries = Maps.newHashMap(); - @Before + @BeforeEach public void abstractFacadeTestSetup() { httpServletRequest = createMock(HttpServletRequest.class); replay(httpServletRequest); diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java index 9e2ed4cfd8..fb0c7ce5a0 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java @@ -18,8 +18,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import org.easymock.IAnswer; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.isaac.api.managers.DueBeforeNowException; import uk.ac.cam.cl.dtg.isaac.api.managers.DuplicateAssignmentException; import uk.ac.cam.cl.dtg.isaac.api.managers.QuizAssignmentManager; @@ -89,7 +89,7 @@ public class QuizFacadeTest extends AbstractFacadeTest { private UserAssociationManager associationManager; private List studentOwnAttempts; - @Before + @BeforeEach public void setUp() throws ContentManagerException { studentOwnAttempts = ImmutableList.of(ownAttempt, ownCompletedAttempt, attemptOnNullFeedbackModeQuiz); diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/EventBookingManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/EventBookingManagerTest.java index 2f4d3caac4..cd97e746ad 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/EventBookingManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/EventBookingManagerTest.java @@ -4,8 +4,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.isaac.dao.EventBookingPersistenceManager; import uk.ac.cam.cl.dtg.isaac.dos.AssociationToken; import uk.ac.cam.cl.dtg.isaac.dos.EventStatus; @@ -65,7 +65,7 @@ public class EventBookingManagerTest { /** * Initial configuration of tests. */ - @Before + @BeforeEach public final void setUp() { this.dummyEmailManager = createMock(EmailManager.class); this.dummyEventBookingPersistenceManager = createMock(EventBookingPersistenceManager.class); diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java index af40f029a1..704573c46f 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java @@ -18,8 +18,8 @@ import org.easymock.Capture; import org.easymock.EasyMock; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.isaac.dao.GameboardPersistenceManager; import uk.ac.cam.cl.dtg.isaac.dto.GameFilter; import uk.ac.cam.cl.dtg.isaac.dto.ResultsWrapper; @@ -50,7 +50,7 @@ public class GameManagerTest { private QuestionManager dummyQuestionManager; private AbstractConfigLoader dummyConfigLoader; - @Before + @BeforeEach public void setUp() { this.dummyContentManager = EasyMock.createMock(GitContentManager.class); this.dummyGameboardPersistenceManager = EasyMock.createMock(GameboardPersistenceManager.class); diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java index 4972c2fb70..17f243a976 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java @@ -15,8 +15,8 @@ */ package uk.ac.cam.cl.dtg.isaac.api.managers; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.isaac.api.services.EmailService; import uk.ac.cam.cl.dtg.isaac.dao.IQuizAssignmentPersistenceManager; import uk.ac.cam.cl.dtg.isaac.dos.QuizFeedbackMode; @@ -48,7 +48,7 @@ public class QuizAssignmentManagerTest extends AbstractManagerTest { private QuizAssignmentDTO newAssignment; - @Before + @BeforeEach public void setUp() throws ContentManagerException, SegueDatabaseException { AbstractConfigLoader properties = createMock(AbstractConfigLoader.class); emailService = createMock(EmailService.class); @@ -61,7 +61,7 @@ public void setUp() throws ContentManagerException, SegueDatabaseException { replay(properties, emailService, quizAssignmentPersistenceManager); } - @Before + @BeforeEach public void initializeAdditionalObjects() { newAssignment = new QuizAssignmentDTO( null, studentQuiz.getId(), diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java index 4773efc6f6..d921875a07 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java @@ -17,8 +17,8 @@ import org.easymock.EasyMock; import org.easymock.IArgumentMatcher; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.isaac.dao.IQuizAttemptPersistenceManager; import uk.ac.cam.cl.dtg.isaac.dto.QuizAttemptDTO; import uk.ac.cam.cl.dtg.segue.dao.SegueDatabaseException; @@ -39,7 +39,7 @@ public class QuizAttemptManagerTest extends AbstractManagerTest { private IQuizAttemptPersistenceManager quizAttemptPersistenceManager; - @Before + @BeforeEach public void setUp() { quizAttemptPersistenceManager = createMock(IQuizAttemptPersistenceManager.class); diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizManagerTest.java index e8e30595b9..71e6d9cb19 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizManagerTest.java @@ -1,8 +1,8 @@ package uk.ac.cam.cl.dtg.isaac.api.managers; import com.google.common.collect.ImmutableList; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.isaac.api.services.ContentSummarizerService; import uk.ac.cam.cl.dtg.isaac.dto.IsaacQuizDTO; import uk.ac.cam.cl.dtg.isaac.dto.IsaacQuizSectionDTO; @@ -27,7 +27,7 @@ public class QuizManagerTest extends AbstractManagerTest { private AbstractConfigLoader properties; private IsaacQuizDTO brokenQuiz; - @Before + @BeforeEach public void setUp() { properties = createMock(AbstractConfigLoader.class); diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java index 1a16d68806..b4be9d3614 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java @@ -17,8 +17,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.isaac.dao.IQuizQuestionAttemptPersistenceManager; import uk.ac.cam.cl.dtg.isaac.dos.QuizFeedbackMode; import uk.ac.cam.cl.dtg.isaac.dto.QuizAttemptDTO; @@ -75,7 +75,7 @@ public class QuizQuestionManagerTest extends AbstractManagerTest { private Map answerMap; private QuizAttemptManager quizAttemptManager; - @Before + @BeforeEach public void setUp() { quizQuestionAttemptPersistenceManager = createMock(IQuizQuestionAttemptPersistenceManager.class); questionManager = createMock(QuestionManager.class); @@ -95,7 +95,7 @@ public void setUp() { replay(quizQuestionAttemptPersistenceManager, questionManager, contentMapper, quizAttemptManager); } - @Before + @BeforeEach public void initializeAdditionalObjects() { correctAnswer = new Choice(); correctAnswerDTO = new ChoiceDTO(); diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/UserAttemptManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/UserAttemptManagerTest.java index bcaf2a1e81..8d9a8512ef 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/UserAttemptManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/UserAttemptManagerTest.java @@ -2,8 +2,8 @@ import com.google.api.client.util.Lists; import com.google.api.client.util.Maps; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import uk.ac.cam.cl.dtg.isaac.dos.LightweightQuestionValidationResponse; @@ -38,7 +38,7 @@ public class UserAttemptManagerTest { private final LightweightQuestionValidationResponse someOtherCorrectAttempt = new LightweightQuestionValidationResponse("some-other-part-id", true, null); - @Before + @BeforeEach public void setUp() throws Exception { fakeQuestionSummary = new ContentSummaryDTO(); fakeQuestionSummary.setId(QUESTION_ID); diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/app/GameboardsFacadeTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/app/GameboardsFacadeTest.java index e574e56e25..37763f60c9 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/app/GameboardsFacadeTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/app/GameboardsFacadeTest.java @@ -16,8 +16,8 @@ package uk.ac.cam.cl.dtg.isaac.app; import org.easymock.EasyMock; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.isaac.api.Constants; import uk.ac.cam.cl.dtg.isaac.api.GameboardsFacade; import uk.ac.cam.cl.dtg.isaac.api.managers.FastTrackManger; @@ -61,7 +61,7 @@ public class GameboardsFacadeTest { * @throws Exception * - test exception */ - @Before + @BeforeEach public final void setUp() throws Exception { this.dummyPropertiesLoader = createMock(AbstractConfigLoader.class); this.dummyGameManager = createMock(GameManager.class); diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/dos/eventbookings/PgEventBookingsTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/dos/eventbookings/PgEventBookingsTest.java index 04f5403f06..b4ea21b10b 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/dos/eventbookings/PgEventBookingsTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/dos/eventbookings/PgEventBookingsTest.java @@ -1,8 +1,8 @@ package uk.ac.cam.cl.dtg.isaac.dos.eventbookings; import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.segue.database.PostgresSqlDb; import uk.ac.cam.cl.dtg.isaac.dos.users.Role; @@ -31,7 +31,7 @@ private PgEventBookings buildPgEventBookings() { private PreparedStatement dummyPreparedStatement; private ResultSet dummyResultSet; - @Before + @BeforeEach public final void setUp() throws Exception { this.dummyPostgresSqlDb = createMock(PostgresSqlDb.class); this.dummyObjectMapper = createMock(ObjectMapper.class); diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacClozeValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacClozeValidatorTest.java index 05fabe8ec5..1248d05f1b 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacClozeValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacClozeValidatorTest.java @@ -17,8 +17,8 @@ import com.google.api.client.util.Lists; import com.google.common.collect.ImmutableList; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.isaac.dos.IsaacClozeQuestion; import uk.ac.cam.cl.dtg.isaac.dos.IsaacQuickQuestion; import uk.ac.cam.cl.dtg.isaac.dos.ItemValidationResponse; @@ -55,7 +55,7 @@ public class IsaacClozeValidatorTest { /** * Initial configuration of tests. */ - @Before + @BeforeEach public final void setUp() { validator = new IsaacClozeValidator(); diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacCoordinateValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacCoordinateValidatorTest.java index de4442f993..68716f0ce4 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacCoordinateValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacCoordinateValidatorTest.java @@ -17,8 +17,8 @@ import com.google.api.client.util.Lists; import com.google.common.collect.ImmutableList; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.isaac.dos.IsaacCoordinateQuestion; import uk.ac.cam.cl.dtg.isaac.dos.QuestionValidationResponse; import uk.ac.cam.cl.dtg.isaac.dos.content.Choice; @@ -51,7 +51,7 @@ public class IsaacCoordinateValidatorTest { /** * Initial configuration of tests. */ - @Before + @BeforeEach public final void setUp() { validator = new IsaacCoordinateValidator(); diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacGraphSketcherValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacGraphSketcherValidatorTest.java index e2f53ee0c0..76407838fc 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacGraphSketcherValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacGraphSketcherValidatorTest.java @@ -16,8 +16,8 @@ package uk.ac.cam.cl.dtg.isaac.quiz; import com.google.api.client.util.Lists; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.isaac.dos.IsaacGraphSketcherQuestion; import uk.ac.cam.cl.dtg.isaac.dos.QuestionValidationResponse; import uk.ac.cam.cl.dtg.isaac.dos.content.Choice; @@ -39,7 +39,7 @@ public class IsaacGraphSketcherValidatorTest { * Initial configuration of tests. * */ - @Before + @BeforeEach public final void setUp() { validator = new IsaacGraphSketcherValidator(); } diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java index 63781264ef..fdc6752083 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java @@ -17,9 +17,9 @@ import com.google.api.client.util.Lists; import com.google.common.collect.ImmutableList; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import org.junit.rules.ExpectedException; import uk.ac.cam.cl.dtg.isaac.dos.IsaacItemQuestion; import uk.ac.cam.cl.dtg.isaac.dos.IsaacQuickQuestion; @@ -51,7 +51,7 @@ public class IsaacItemQuestionValidatorTest { /** * Initial configuration of tests. */ - @Before + @BeforeEach public final void setUp() { validator = new IsaacItemQuestionValidator(); diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java index 76e71555f4..4f46fea144 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java @@ -16,9 +16,9 @@ package uk.ac.cam.cl.dtg.isaac.quiz; import com.google.api.client.util.Lists; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import org.junit.rules.ExpectedException; import org.slf4j.Logger; import uk.ac.cam.cl.dtg.isaac.dos.IsaacNumericQuestion; @@ -62,7 +62,7 @@ public class IsaacNumericValidatorTest { * Initial configuration of tests. * */ - @Before + @BeforeEach public final void setUp() { log = createMock(Logger.class); validator = new IsaacNumericValidator(); diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java index bb45cbe506..40cf2dfa1f 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java @@ -17,9 +17,9 @@ import com.google.api.client.util.Lists; import com.google.common.collect.ImmutableList; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import org.junit.rules.ExpectedException; import uk.ac.cam.cl.dtg.isaac.dos.IsaacParsonsQuestion; import uk.ac.cam.cl.dtg.isaac.dos.IsaacQuickQuestion; @@ -52,7 +52,7 @@ public class IsaacParsonsValidatorTest { /** * Initial configuration of tests. */ - @Before + @BeforeEach public final void setUp() { validator = new IsaacParsonsValidator(); diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacReorderValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacReorderValidatorTest.java index 7d2af4e7ed..ea1e7ec494 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacReorderValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacReorderValidatorTest.java @@ -17,8 +17,8 @@ import com.google.api.client.util.Lists; import com.google.common.collect.ImmutableList; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.isaac.dos.IsaacQuickQuestion; import uk.ac.cam.cl.dtg.isaac.dos.IsaacReorderQuestion; import uk.ac.cam.cl.dtg.isaac.dos.QuestionValidationResponse; @@ -53,7 +53,7 @@ public class IsaacReorderValidatorTest { /** * Initial configuration of tests. */ - @Before + @BeforeEach public final void setUp() { validator = new IsaacReorderValidator(); diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java index 1226056598..7cdc4f494e 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java @@ -16,9 +16,9 @@ package uk.ac.cam.cl.dtg.isaac.quiz; import com.google.api.client.util.Lists; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import org.junit.rules.ExpectedException; import uk.ac.cam.cl.dtg.isaac.dos.IsaacQuickQuestion; import uk.ac.cam.cl.dtg.isaac.dos.IsaacStringMatchQuestion; @@ -50,7 +50,7 @@ public class IsaacStringMatchValidatorTest { * Initial configuration of tests. * */ - @Before + @BeforeEach public final void setUp() { validator = new IsaacStringMatchValidator(); diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java index 115ea99608..35505ee091 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java @@ -18,8 +18,8 @@ import com.google.api.client.util.Lists; import com.google.api.client.util.Sets; import org.easymock.Capture; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.isaac.api.managers.GameManager; import uk.ac.cam.cl.dtg.segue.api.Constants; import uk.ac.cam.cl.dtg.segue.auth.exceptions.NoUserException; @@ -65,7 +65,7 @@ public class GroupManagerTest { * @throws Exception * - test exception */ - @Before + @BeforeEach public final void setUp() throws Exception { this.dummyMapper = createMock(MainMapper.class); this.dummyCommunicator = createMock(ICommunicator.class); diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAssociationManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAssociationManagerTest.java index 21c84d314d..fd356f9813 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAssociationManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAssociationManagerTest.java @@ -17,8 +17,8 @@ import com.google.api.client.util.Sets; import org.easymock.Capture; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.isaac.dos.AssociationToken; import uk.ac.cam.cl.dtg.isaac.dos.users.Role; import uk.ac.cam.cl.dtg.isaac.dto.UserGroupDTO; @@ -55,7 +55,7 @@ public class UserAssociationManagerTest { * * @throws Exception - test exception */ - @Before + @BeforeEach public final void setUp() throws Exception { dummyAssociationDataManager = createMock(IAssociationDataManager.class); dummyGroupDataManager = createMock(GroupManager.class); diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java index 315c64189a..016886dadc 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java @@ -22,8 +22,8 @@ import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.StringUtils; import org.easymock.EasyMock; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.isaac.dos.AbstractUserPreferenceManager; import uk.ac.cam.cl.dtg.isaac.dos.users.AnonymousUser; import uk.ac.cam.cl.dtg.isaac.dos.users.EmailVerificationStatus; @@ -107,7 +107,7 @@ public class UserManagerTest { * @throws Exception * - test exception */ - @Before + @BeforeEach public final void setUp() throws Exception { this.dummyQuestionDatabase = createMock(QuestionManager.class); this.dummyDatabase = createMock(IUserDataManager.class); diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/api/monitors/MisuseMonitorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/api/monitors/MisuseMonitorTest.java index e044389fd9..ec3414e8a1 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/api/monitors/MisuseMonitorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/api/monitors/MisuseMonitorTest.java @@ -16,8 +16,8 @@ package uk.ac.cam.cl.dtg.segue.api.monitors; import org.easymock.EasyMock; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.segue.api.Constants; import uk.ac.cam.cl.dtg.segue.api.managers.SegueResourceMisuseException; import uk.ac.cam.cl.dtg.segue.comm.EmailCommunicationMessage; @@ -43,7 +43,7 @@ public class MisuseMonitorTest { * @throws Exception * - test exception */ - @Before + @BeforeEach public final void setUp() throws Exception { this.dummyCommunicator = createMock(EmailManager.class); this.dummyPropertiesLoader = createMock(AbstractConfigLoader.class); diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/GoogleAuthenticatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/GoogleAuthenticatorTest.java index e593fb7f66..99fee5d410 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/GoogleAuthenticatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/GoogleAuthenticatorTest.java @@ -15,10 +15,10 @@ */ package uk.ac.cam.cl.dtg.segue.auth; -import org.junit.Before; import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets.Details; +import org.junit.jupiter.api.BeforeEach; public class GoogleAuthenticatorTest extends IOAuth2AuthenticatorTest { @@ -28,7 +28,7 @@ public class GoogleAuthenticatorTest extends IOAuth2AuthenticatorTest { * @throws Exception * - test exception */ - @Before + @BeforeEach public final void setUp() throws Exception { GoogleClientSecrets clientSecrets = new GoogleClientSecrets(); Details details = new Details(); diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/MicrosoftAuthenticatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/MicrosoftAuthenticatorTest.java index 8bbc702405..11dca31377 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/MicrosoftAuthenticatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/MicrosoftAuthenticatorTest.java @@ -18,8 +18,8 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; -import org.junit.Before; import org.junit.experimental.runners.Enclosed; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.function.Executable; import org.junit.runner.RunWith; import org.junit.Test; @@ -87,7 +87,7 @@ public interface C { // 1) getAuthorizationUrl, 2) extractAuthCode, 3) getAntiForgeryStateToken, 4) getUserInfo, // 5) getAuthenticationProvider, 6) exchangeCode public static class TestShared extends IOAuth2AuthenticatorTest { - @Before + @BeforeEach public final void setUp() throws Exception { this.oauth2Authenticator = Helpers.subject(Helpers.getStore()); this.authenticator = this.oauth2Authenticator; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java index 4696a82579..cf764b06de 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java @@ -16,13 +16,12 @@ package uk.ac.cam.cl.dtg.segue.auth; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.segue.auth.exceptions.NoUserException; import java.net.URL; import java.nio.file.Paths; -import java.util.ArrayList; import java.util.List; import static org.junit.Assert.assertEquals; @@ -31,7 +30,7 @@ public class RaspberryPiOidcAuthenticatorTest { RaspberryPiOidcAuthenticator authenticator; - @Before + @BeforeEach public void setUp() throws Exception{ // Set up an authenticator with local OIDC IdP metadata URL res = getClass().getClassLoader().getResource("test-rpf-idp-metadata.json"); diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/SegueLocalAuthenticatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/SegueLocalAuthenticatorTest.java index d391602ef7..6f61034f65 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/SegueLocalAuthenticatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/SegueLocalAuthenticatorTest.java @@ -18,6 +18,7 @@ import com.google.common.collect.ImmutableMap; import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.isaac.dos.users.LocalUserCredential; import uk.ac.cam.cl.dtg.isaac.dos.users.RegisteredUser; import uk.ac.cam.cl.dtg.segue.auth.exceptions.IncorrectCredentialsProvidedException; @@ -66,7 +67,7 @@ public class SegueLocalAuthenticatorTest { * * @throws Exception - test exception */ - @Before + @BeforeEach public final void setUp() throws Exception { this.userDataManager = createMock(IUserDataManager.class); this.passwordDataManager = createMock(IPasswordDataManager.class); diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java index ed9e9ff371..de795d9f16 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java @@ -28,8 +28,8 @@ import org.easymock.EasyMock; import org.easymock.IAnswer; import org.junit.Assert; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -80,7 +80,7 @@ public class EmailManagerTest { * @throws Exception * - test exception */ - @Before + @BeforeEach public final void setUp() throws Exception { // Create dummy user diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/comm/MailGunEmailManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/comm/MailGunEmailManagerTest.java index 8cf9ec139a..e28d041605 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/comm/MailGunEmailManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/comm/MailGunEmailManagerTest.java @@ -19,8 +19,8 @@ import com.google.api.client.util.Maps; import com.mailgun.model.message.MessageResponse; import org.easymock.EasyMock; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.isaac.dos.AbstractUserPreferenceManager; import uk.ac.cam.cl.dtg.isaac.dos.PgUserPreferenceManager; import uk.ac.cam.cl.dtg.isaac.dto.content.EmailTemplateDTO; @@ -47,7 +47,7 @@ public class MailGunEmailManagerTest { * @throws Exception * - test exception */ - @Before + @BeforeEach public final void setUp() throws Exception { // Create dummy email preferences userPreferenceManager = EasyMock.createMock(PgUserPreferenceManager.class); diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/dao/ContentSubclassMapperTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/dao/ContentSubclassMapperTest.java index a27123e593..08242fb2f9 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/dao/ContentSubclassMapperTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/dao/ContentSubclassMapperTest.java @@ -1,7 +1,7 @@ package uk.ac.cam.cl.dtg.segue.dao; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import org.reflections.Reflections; import uk.ac.cam.cl.dtg.isaac.dos.content.CodeSnippet; import uk.ac.cam.cl.dtg.isaac.dos.content.Content; @@ -14,7 +14,7 @@ public class ContentSubclassMapperTest { private ContentSubclassMapper contentSubclassMapper; - @Before + @BeforeEach public void setUp() { this.contentSubclassMapper = new ContentSubclassMapper(new Reflections("uk.ac.cam.cl.dtg.isaac")); } diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/dao/GitContentManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/dao/GitContentManagerTest.java index 23fb68d4ad..31589a9a62 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/dao/GitContentManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/dao/GitContentManagerTest.java @@ -15,8 +15,8 @@ */ package uk.ac.cam.cl.dtg.segue.dao; -import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.segue.dao.content.ContentManagerException; import uk.ac.cam.cl.dtg.segue.dao.content.ContentSubclassMapper; import uk.ac.cam.cl.dtg.segue.dao.content.GitContentManager; @@ -52,7 +52,7 @@ public class GitContentManagerTest { * @throws Exception * - test exception */ - @Before + @BeforeEach public final void setUp() throws Exception { this.database = createMock(GitDb.class); this.searchProvider = createMock(ISearchProvider.class); diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java index 435d7aa123..19f9732863 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java @@ -24,11 +24,11 @@ import com.google.api.client.util.Maps; import com.google.api.client.util.Sets; import com.google.common.collect.ImmutableMap; -import org.junit.Before; import org.junit.Test; import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.isaac.dos.IsaacNumericQuestion; import uk.ac.cam.cl.dtg.isaac.quiz.IsaacDndValidatorTest; import uk.ac.cam.cl.dtg.segue.api.Constants; @@ -59,7 +59,7 @@ public class ContentIndexerTest { * @throws Exception * - test exception */ - @Before + @BeforeEach public final void setUp() throws Exception { this.database = createMock(GitDb.class); this.searchProvider = createMock(ElasticSearchIndexer.class); diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/util/PostCodeLocationResolverTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/util/PostCodeLocationResolverTest.java index bdbc7875d9..fedf8c7513 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/util/PostCodeLocationResolverTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/util/PostCodeLocationResolverTest.java @@ -26,11 +26,11 @@ import junit.framework.Assert; import org.easymock.EasyMock; -import org.junit.Before; import org.junit.Test; import com.google.api.client.util.Maps; +import org.junit.jupiter.api.BeforeEach; import uk.ac.cam.cl.dtg.segue.dao.SegueDatabaseException; import uk.ac.cam.cl.dtg.segue.database.PostgresSqlDb; import uk.ac.cam.cl.dtg.isaac.dos.LocationHistory; @@ -51,7 +51,7 @@ public class PostCodeLocationResolverTest { private PostCodeIOLocationResolver resolver; private PostgresSqlDb mockDatabase; - @Before + @BeforeEach public final void setUp() throws Exception { mockDatabase = EasyMock.createMock(PostgresSqlDb.class); locationHistory = new PgLocationHistory(mockDatabase); From 305da0d9af4e62b5866fa4cd1d374ec94bb0e883 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Tue, 24 Feb 2026 11:07:18 +0000 Subject: [PATCH 20/38] Use JUnit 5 Test annotation --- .../java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java | 2 +- src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeIT.java | 3 --- src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java | 2 +- .../cam/cl/dtg/isaac/api/managers/EventBookingManagerTest.java | 2 +- .../uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java | 2 +- .../cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java | 2 +- .../cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java | 2 +- .../uk/ac/cam/cl/dtg/isaac/api/managers/QuizManagerTest.java | 2 +- .../cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java | 2 +- .../cam/cl/dtg/isaac/api/managers/UserAttemptManagerTest.java | 2 +- .../java/uk/ac/cam/cl/dtg/isaac/app/GameboardsFacadeTest.java | 2 +- .../cl/dtg/isaac/dos/eventbookings/PgEventBookingsTest.java | 2 +- .../uk/ac/cam/cl/dtg/isaac/quiz/IsaacClozeValidatorTest.java | 2 +- .../ac/cam/cl/dtg/isaac/quiz/IsaacCoordinateValidatorTest.java | 2 +- .../cam/cl/dtg/isaac/quiz/IsaacGraphSketcherValidatorTest.java | 2 +- .../cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java | 2 +- .../uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java | 2 +- .../uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java | 2 +- .../uk/ac/cam/cl/dtg/isaac/quiz/IsaacReorderValidatorTest.java | 2 +- .../cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java | 2 +- .../uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java | 2 +- .../cl/dtg/segue/api/managers/UserAssociationManagerTest.java | 2 +- .../uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java | 2 +- .../uk/ac/cam/cl/dtg/segue/api/monitors/MisuseMonitorTest.java | 2 +- .../uk/ac/cam/cl/dtg/segue/auth/IOAuth1AuthenticatorTest.java | 2 +- .../uk/ac/cam/cl/dtg/segue/auth/IOAuth2AuthenticatorTest.java | 2 +- .../uk/ac/cam/cl/dtg/segue/auth/IOAuthAuthenticatorTest.java | 2 +- .../ac/cam/cl/dtg/segue/auth/MicrosoftAuthenticatorTest.java | 2 +- .../cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java | 2 +- .../ac/cam/cl/dtg/segue/auth/SegueLocalAuthenticatorTest.java | 3 +-- .../java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java | 2 +- .../uk/ac/cam/cl/dtg/segue/comm/MailGunEmailManagerTest.java | 2 +- .../uk/ac/cam/cl/dtg/segue/dao/ContentSubclassMapperTest.java | 2 +- .../java/uk/ac/cam/cl/dtg/segue/dao/GitContentManagerTest.java | 2 +- src/test/java/uk/ac/cam/cl/dtg/segue/database/GitDbTest.java | 2 +- .../java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java | 2 +- .../ac/cam/cl/dtg/segue/etl/ETLInMemorySshConfigStoreTest.java | 3 +-- .../ac/cam/cl/dtg/segue/search/ElasticSearchProviderTest.java | 2 +- .../java/uk/ac/cam/cl/dtg/segue/util/NameFormatterTest.java | 2 +- .../ac/cam/cl/dtg/segue/util/PostCodeLocationResolverTest.java | 3 ++- src/test/java/uk/ac/cam/cl/dtg/util/NameOrdererTest.java | 2 +- src/test/java/uk/ac/cam/cl/dtg/util/YamlLoaderTest.java | 2 +- .../java/uk/ac/cam/cl/dtg/util/mappers/ContentMapperTest.java | 2 +- .../cam/cl/dtg/util/mappers/QuestionValidationMapperTest.java | 3 +-- 44 files changed, 44 insertions(+), 49 deletions(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java index 99d5cdb76d..2e3de83635 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java @@ -15,7 +15,7 @@ */ package uk.ac.cam.cl.dtg.isaac.api; -import org.junit.Test; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.dos.AbstractUserPreferenceManager; import uk.ac.cam.cl.dtg.isaac.dos.IUserStreaksManager; import uk.ac.cam.cl.dtg.isaac.dos.UserPreference; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeIT.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeIT.java index 76629a343c..1bcbe8776b 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeIT.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeIT.java @@ -20,10 +20,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; import uk.ac.cam.cl.dtg.isaac.dos.QuizFeedbackMode; -import uk.ac.cam.cl.dtg.isaac.dos.users.RegisteredUser; import uk.ac.cam.cl.dtg.isaac.dto.AssignmentStatusDTO; import uk.ac.cam.cl.dtg.isaac.dto.IsaacQuizDTO; import uk.ac.cam.cl.dtg.isaac.dto.QuizAssignmentDTO; @@ -36,7 +34,6 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.ws.rs.core.Request; import jakarta.ws.rs.core.Response; -import uk.ac.cam.cl.dtg.isaac.dto.users.RegisteredUserDTO; import java.util.Date; import java.util.LinkedList; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java index fb0c7ce5a0..2430e1e3f0 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java @@ -18,8 +18,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import org.easymock.IAnswer; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.api.managers.DueBeforeNowException; import uk.ac.cam.cl.dtg.isaac.api.managers.DuplicateAssignmentException; import uk.ac.cam.cl.dtg.isaac.api.managers.QuizAssignmentManager; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/EventBookingManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/EventBookingManagerTest.java index cd97e746ad..fdf8ce7776 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/EventBookingManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/EventBookingManagerTest.java @@ -4,8 +4,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.dao.EventBookingPersistenceManager; import uk.ac.cam.cl.dtg.isaac.dos.AssociationToken; import uk.ac.cam.cl.dtg.isaac.dos.EventStatus; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java index 704573c46f..1061790e47 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java @@ -18,8 +18,8 @@ import org.easymock.Capture; import org.easymock.EasyMock; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.dao.GameboardPersistenceManager; import uk.ac.cam.cl.dtg.isaac.dto.GameFilter; import uk.ac.cam.cl.dtg.isaac.dto.ResultsWrapper; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java index 17f243a976..7ce195a63d 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java @@ -15,8 +15,8 @@ */ package uk.ac.cam.cl.dtg.isaac.api.managers; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.api.services.EmailService; import uk.ac.cam.cl.dtg.isaac.dao.IQuizAssignmentPersistenceManager; import uk.ac.cam.cl.dtg.isaac.dos.QuizFeedbackMode; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java index d921875a07..1f4937c76b 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java @@ -17,8 +17,8 @@ import org.easymock.EasyMock; import org.easymock.IArgumentMatcher; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.dao.IQuizAttemptPersistenceManager; import uk.ac.cam.cl.dtg.isaac.dto.QuizAttemptDTO; import uk.ac.cam.cl.dtg.segue.dao.SegueDatabaseException; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizManagerTest.java index 71e6d9cb19..9b3dbf4dfa 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizManagerTest.java @@ -1,8 +1,8 @@ package uk.ac.cam.cl.dtg.isaac.api.managers; import com.google.common.collect.ImmutableList; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.api.services.ContentSummarizerService; import uk.ac.cam.cl.dtg.isaac.dto.IsaacQuizDTO; import uk.ac.cam.cl.dtg.isaac.dto.IsaacQuizSectionDTO; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java index b4be9d3614..002339d4e8 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java @@ -17,8 +17,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.dao.IQuizQuestionAttemptPersistenceManager; import uk.ac.cam.cl.dtg.isaac.dos.QuizFeedbackMode; import uk.ac.cam.cl.dtg.isaac.dto.QuizAttemptDTO; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/UserAttemptManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/UserAttemptManagerTest.java index 8d9a8512ef..cc8501a4e7 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/UserAttemptManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/UserAttemptManagerTest.java @@ -2,8 +2,8 @@ import com.google.api.client.util.Lists; import com.google.api.client.util.Maps; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import uk.ac.cam.cl.dtg.isaac.dos.LightweightQuestionValidationResponse; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/app/GameboardsFacadeTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/app/GameboardsFacadeTest.java index 37763f60c9..3f92c81a5a 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/app/GameboardsFacadeTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/app/GameboardsFacadeTest.java @@ -16,8 +16,8 @@ package uk.ac.cam.cl.dtg.isaac.app; import org.easymock.EasyMock; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.api.Constants; import uk.ac.cam.cl.dtg.isaac.api.GameboardsFacade; import uk.ac.cam.cl.dtg.isaac.api.managers.FastTrackManger; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/dos/eventbookings/PgEventBookingsTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/dos/eventbookings/PgEventBookingsTest.java index b4ea21b10b..c5694c6331 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/dos/eventbookings/PgEventBookingsTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/dos/eventbookings/PgEventBookingsTest.java @@ -1,8 +1,8 @@ package uk.ac.cam.cl.dtg.isaac.dos.eventbookings; import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.segue.database.PostgresSqlDb; import uk.ac.cam.cl.dtg.isaac.dos.users.Role; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacClozeValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacClozeValidatorTest.java index 1248d05f1b..8c3c8ee697 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacClozeValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacClozeValidatorTest.java @@ -17,8 +17,8 @@ import com.google.api.client.util.Lists; import com.google.common.collect.ImmutableList; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.dos.IsaacClozeQuestion; import uk.ac.cam.cl.dtg.isaac.dos.IsaacQuickQuestion; import uk.ac.cam.cl.dtg.isaac.dos.ItemValidationResponse; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacCoordinateValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacCoordinateValidatorTest.java index 68716f0ce4..67aae1e8a7 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacCoordinateValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacCoordinateValidatorTest.java @@ -17,8 +17,8 @@ import com.google.api.client.util.Lists; import com.google.common.collect.ImmutableList; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.dos.IsaacCoordinateQuestion; import uk.ac.cam.cl.dtg.isaac.dos.QuestionValidationResponse; import uk.ac.cam.cl.dtg.isaac.dos.content.Choice; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacGraphSketcherValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacGraphSketcherValidatorTest.java index 76407838fc..44108f44ff 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacGraphSketcherValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacGraphSketcherValidatorTest.java @@ -16,8 +16,8 @@ package uk.ac.cam.cl.dtg.isaac.quiz; import com.google.api.client.util.Lists; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.dos.IsaacGraphSketcherQuestion; import uk.ac.cam.cl.dtg.isaac.dos.QuestionValidationResponse; import uk.ac.cam.cl.dtg.isaac.dos.content.Choice; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java index fdc6752083..bd15798be7 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java @@ -18,8 +18,8 @@ import com.google.api.client.util.Lists; import com.google.common.collect.ImmutableList; import org.junit.Rule; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.junit.rules.ExpectedException; import uk.ac.cam.cl.dtg.isaac.dos.IsaacItemQuestion; import uk.ac.cam.cl.dtg.isaac.dos.IsaacQuickQuestion; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java index 4f46fea144..4d07c55f1a 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java @@ -17,8 +17,8 @@ import com.google.api.client.util.Lists; import org.junit.Rule; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.junit.rules.ExpectedException; import org.slf4j.Logger; import uk.ac.cam.cl.dtg.isaac.dos.IsaacNumericQuestion; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java index 40cf2dfa1f..10728a20e8 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java @@ -18,8 +18,8 @@ import com.google.api.client.util.Lists; import com.google.common.collect.ImmutableList; import org.junit.Rule; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.junit.rules.ExpectedException; import uk.ac.cam.cl.dtg.isaac.dos.IsaacParsonsQuestion; import uk.ac.cam.cl.dtg.isaac.dos.IsaacQuickQuestion; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacReorderValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacReorderValidatorTest.java index ea1e7ec494..f6afc5840a 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacReorderValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacReorderValidatorTest.java @@ -17,8 +17,8 @@ import com.google.api.client.util.Lists; import com.google.common.collect.ImmutableList; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.dos.IsaacQuickQuestion; import uk.ac.cam.cl.dtg.isaac.dos.IsaacReorderQuestion; import uk.ac.cam.cl.dtg.isaac.dos.QuestionValidationResponse; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java index 7cdc4f494e..aee8881cbb 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java @@ -17,8 +17,8 @@ import com.google.api.client.util.Lists; import org.junit.Rule; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.junit.rules.ExpectedException; import uk.ac.cam.cl.dtg.isaac.dos.IsaacQuickQuestion; import uk.ac.cam.cl.dtg.isaac.dos.IsaacStringMatchQuestion; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java index 35505ee091..bd13a78efe 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java @@ -18,8 +18,8 @@ import com.google.api.client.util.Lists; import com.google.api.client.util.Sets; import org.easymock.Capture; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.api.managers.GameManager; import uk.ac.cam.cl.dtg.segue.api.Constants; import uk.ac.cam.cl.dtg.segue.auth.exceptions.NoUserException; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAssociationManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAssociationManagerTest.java index fd356f9813..6af0ee02bb 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAssociationManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAssociationManagerTest.java @@ -17,8 +17,8 @@ import com.google.api.client.util.Sets; import org.easymock.Capture; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.dos.AssociationToken; import uk.ac.cam.cl.dtg.isaac.dos.users.Role; import uk.ac.cam.cl.dtg.isaac.dto.UserGroupDTO; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java index 016886dadc..9e911e01eb 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java @@ -22,8 +22,8 @@ import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.StringUtils; import org.easymock.EasyMock; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.dos.AbstractUserPreferenceManager; import uk.ac.cam.cl.dtg.isaac.dos.users.AnonymousUser; import uk.ac.cam.cl.dtg.isaac.dos.users.EmailVerificationStatus; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/api/monitors/MisuseMonitorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/api/monitors/MisuseMonitorTest.java index ec3414e8a1..985f52b4f4 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/api/monitors/MisuseMonitorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/api/monitors/MisuseMonitorTest.java @@ -16,8 +16,8 @@ package uk.ac.cam.cl.dtg.segue.api.monitors; import org.easymock.EasyMock; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.segue.api.Constants; import uk.ac.cam.cl.dtg.segue.api.managers.SegueResourceMisuseException; import uk.ac.cam.cl.dtg.segue.comm.EmailCommunicationMessage; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuth1AuthenticatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuth1AuthenticatorTest.java index 94bf4364cd..4a137d7ba9 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuth1AuthenticatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuth1AuthenticatorTest.java @@ -15,7 +15,7 @@ */ package uk.ac.cam.cl.dtg.segue.auth; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.IOException; import java.net.URL; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuth2AuthenticatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuth2AuthenticatorTest.java index 1660e977ae..ac9a7f990e 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuth2AuthenticatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuth2AuthenticatorTest.java @@ -16,7 +16,7 @@ package uk.ac.cam.cl.dtg.segue.auth; import com.google.api.client.http.GenericUrl; -import org.junit.Test; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.segue.auth.exceptions.AuthenticationCodeException; import java.io.IOException; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuthAuthenticatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuthAuthenticatorTest.java index 534997ca3d..85ebf860bc 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuthAuthenticatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuthAuthenticatorTest.java @@ -15,7 +15,7 @@ */ package uk.ac.cam.cl.dtg.segue.auth; -import org.junit.Test; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.segue.auth.exceptions.AuthenticatorSecurityException; import uk.ac.cam.cl.dtg.segue.auth.exceptions.CodeExchangeException; import uk.ac.cam.cl.dtg.segue.auth.exceptions.NoUserException; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/MicrosoftAuthenticatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/MicrosoftAuthenticatorTest.java index 11dca31377..ec25226bf4 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/MicrosoftAuthenticatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/MicrosoftAuthenticatorTest.java @@ -20,9 +20,9 @@ import org.junit.experimental.runners.Enclosed; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.function.Executable; import org.junit.runner.RunWith; -import org.junit.Test; import org.junit.runners.Parameterized; import uk.ac.cam.cl.dtg.isaac.dos.users.EmailVerificationStatus; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java index cf764b06de..13fa6b91e6 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java @@ -16,8 +16,8 @@ package uk.ac.cam.cl.dtg.segue.auth; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.segue.auth.exceptions.NoUserException; import java.net.URL; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/SegueLocalAuthenticatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/SegueLocalAuthenticatorTest.java index 6f61034f65..72045d4400 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/SegueLocalAuthenticatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/SegueLocalAuthenticatorTest.java @@ -16,9 +16,8 @@ package uk.ac.cam.cl.dtg.segue.auth; import com.google.common.collect.ImmutableMap; -import org.junit.Before; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.dos.users.LocalUserCredential; import uk.ac.cam.cl.dtg.isaac.dos.users.RegisteredUser; import uk.ac.cam.cl.dtg.segue.auth.exceptions.IncorrectCredentialsProvidedException; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java index de795d9f16..f2358966db 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java @@ -28,8 +28,8 @@ import org.easymock.EasyMock; import org.easymock.IAnswer; import org.junit.Assert; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/comm/MailGunEmailManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/comm/MailGunEmailManagerTest.java index e28d041605..fbf7be05e1 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/comm/MailGunEmailManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/comm/MailGunEmailManagerTest.java @@ -19,8 +19,8 @@ import com.google.api.client.util.Maps; import com.mailgun.model.message.MessageResponse; import org.easymock.EasyMock; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.dos.AbstractUserPreferenceManager; import uk.ac.cam.cl.dtg.isaac.dos.PgUserPreferenceManager; import uk.ac.cam.cl.dtg.isaac.dto.content.EmailTemplateDTO; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/dao/ContentSubclassMapperTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/dao/ContentSubclassMapperTest.java index 08242fb2f9..7f11d5d48a 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/dao/ContentSubclassMapperTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/dao/ContentSubclassMapperTest.java @@ -1,7 +1,7 @@ package uk.ac.cam.cl.dtg.segue.dao; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.reflections.Reflections; import uk.ac.cam.cl.dtg.isaac.dos.content.CodeSnippet; import uk.ac.cam.cl.dtg.isaac.dos.content.Content; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/dao/GitContentManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/dao/GitContentManagerTest.java index 31589a9a62..b5f33ea886 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/dao/GitContentManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/dao/GitContentManagerTest.java @@ -15,8 +15,8 @@ */ package uk.ac.cam.cl.dtg.segue.dao; -import org.junit.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.segue.dao.content.ContentManagerException; import uk.ac.cam.cl.dtg.segue.dao.content.ContentSubclassMapper; import uk.ac.cam.cl.dtg.segue.dao.content.GitContentManager; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/database/GitDbTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/database/GitDbTest.java index 0df1ba7e6d..d4855e73e8 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/database/GitDbTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/database/GitDbTest.java @@ -22,7 +22,7 @@ import org.easymock.EasyMock; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.lib.Repository; -import org.junit.Test; +import org.junit.jupiter.api.Test; public class GitDbTest { diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java index 19f9732863..fe56c8235c 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java @@ -24,11 +24,11 @@ import com.google.api.client.util.Maps; import com.google.api.client.util.Sets; import com.google.common.collect.ImmutableMap; -import org.junit.Test; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.dos.IsaacNumericQuestion; import uk.ac.cam.cl.dtg.isaac.quiz.IsaacDndValidatorTest; import uk.ac.cam.cl.dtg.segue.api.Constants; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ETLInMemorySshConfigStoreTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ETLInMemorySshConfigStoreTest.java index 94097a83f0..6362e06cda 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ETLInMemorySshConfigStoreTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ETLInMemorySshConfigStoreTest.java @@ -1,7 +1,6 @@ package uk.ac.cam.cl.dtg.segue.etl; -import com.google.common.collect.Sets; -import org.junit.Test; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.segue.etl.ETLInMemorySshConfigStore.InMemoryHostConfig; import java.util.Arrays; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/search/ElasticSearchProviderTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/search/ElasticSearchProviderTest.java index 80beb3b3b9..c5c0438593 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/search/ElasticSearchProviderTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/search/ElasticSearchProviderTest.java @@ -17,7 +17,7 @@ import co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery; import co.elastic.clients.elasticsearch._types.query_dsl.Query; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.HashMap; import java.util.Map; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/util/NameFormatterTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/util/NameFormatterTest.java index 6d024a171e..b3a9889a7f 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/util/NameFormatterTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/util/NameFormatterTest.java @@ -1,6 +1,6 @@ package uk.ac.cam.cl.dtg.segue.util; -import org.junit.Test; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.dto.UserGroupDTO; import uk.ac.cam.cl.dtg.isaac.dto.users.RegisteredUserDTO; import uk.ac.cam.cl.dtg.isaac.dto.users.UserSummaryDTO; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/util/PostCodeLocationResolverTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/util/PostCodeLocationResolverTest.java index fedf8c7513..90f0bff756 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/util/PostCodeLocationResolverTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/util/PostCodeLocationResolverTest.java @@ -26,11 +26,12 @@ import junit.framework.Assert; import org.easymock.EasyMock; -import org.junit.Test; import com.google.api.client.util.Maps; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + import uk.ac.cam.cl.dtg.segue.dao.SegueDatabaseException; import uk.ac.cam.cl.dtg.segue.database.PostgresSqlDb; import uk.ac.cam.cl.dtg.isaac.dos.LocationHistory; diff --git a/src/test/java/uk/ac/cam/cl/dtg/util/NameOrdererTest.java b/src/test/java/uk/ac/cam/cl/dtg/util/NameOrdererTest.java index f761b795df..cbe94f117d 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/util/NameOrdererTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/util/NameOrdererTest.java @@ -1,6 +1,6 @@ package uk.ac.cam.cl.dtg.util; -import org.junit.Test; +import org.junit.jupiter.api.Test; import uk.ac.cam.cl.dtg.isaac.dos.users.EmailVerificationStatus; import uk.ac.cam.cl.dtg.isaac.dos.users.Gender; import uk.ac.cam.cl.dtg.isaac.dto.users.RegisteredUserDTO; diff --git a/src/test/java/uk/ac/cam/cl/dtg/util/YamlLoaderTest.java b/src/test/java/uk/ac/cam/cl/dtg/util/YamlLoaderTest.java index 14c4e64297..6319ec655c 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/util/YamlLoaderTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/util/YamlLoaderTest.java @@ -1,7 +1,7 @@ package uk.ac.cam.cl.dtg.util; import org.easymock.EasyMock; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.yaml.snakeyaml.Yaml; import java.io.FileInputStream; diff --git a/src/test/java/uk/ac/cam/cl/dtg/util/mappers/ContentMapperTest.java b/src/test/java/uk/ac/cam/cl/dtg/util/mappers/ContentMapperTest.java index d3f5679e00..6c2d708934 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/util/mappers/ContentMapperTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/util/mappers/ContentMapperTest.java @@ -1,7 +1,7 @@ package uk.ac.cam.cl.dtg.util.mappers; -import org.junit.Test; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.reflections.Reflections; diff --git a/src/test/java/uk/ac/cam/cl/dtg/util/mappers/QuestionValidationMapperTest.java b/src/test/java/uk/ac/cam/cl/dtg/util/mappers/QuestionValidationMapperTest.java index 67dc65d346..ab0c1123df 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/util/mappers/QuestionValidationMapperTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/util/mappers/QuestionValidationMapperTest.java @@ -1,7 +1,7 @@ package uk.ac.cam.cl.dtg.util.mappers; -import org.junit.Test; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.reflections.Reflections; @@ -9,7 +9,6 @@ import uk.ac.cam.cl.dtg.isaac.dos.content.DTOMapping; import uk.ac.cam.cl.dtg.isaac.dto.QuestionValidationResponseDTO; -import java.lang.reflect.Modifier; import java.util.Collection; import java.util.Objects; import java.util.Set; From 6a3a0d81d4153e23ff898f25b6979d38c31447b4 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Tue, 24 Feb 2026 11:27:55 +0000 Subject: [PATCH 21/38] Use JUnit 5 assertions --- .../cl/dtg/isaac/api/AbstractFacadeTest.java | 2 +- .../cl/dtg/isaac/api/QuestionFacadeTest.java | 4 +- .../cam/cl/dtg/isaac/api/QuizFacadeTest.java | 4 +- .../api/managers/EventBookingManagerTest.java | 5 +- .../isaac/api/managers/GameManagerTest.java | 4 +- .../managers/QuizAssignmentManagerTest.java | 4 +- .../api/managers/QuizAttemptManagerTest.java | 2 +- .../isaac/api/managers/QuizManagerTest.java | 4 +- .../api/managers/QuizQuestionManagerTest.java | 10 +-- .../api/managers/UserAttemptManagerTest.java | 4 +- .../dtg/isaac/app/GameboardsFacadeTest.java | 2 +- .../eventbookings/PgEventBookingsTest.java | 2 +- .../isaac/quiz/IsaacClozeValidatorTest.java | 10 +-- .../quiz/IsaacCoordinateValidatorTest.java | 8 +-- .../dtg/isaac/quiz/IsaacDndValidatorTest.java | 4 +- .../quiz/IsaacGraphSketcherValidatorTest.java | 4 +- .../quiz/IsaacItemQuestionValidatorTest.java | 8 +-- .../isaac/quiz/IsaacNumericValidatorTest.java | 8 +-- .../isaac/quiz/IsaacParsonsValidatorTest.java | 8 +-- .../isaac/quiz/IsaacReorderValidatorTest.java | 10 +-- .../quiz/IsaacStringMatchValidatorTest.java | 6 +- .../segue/api/managers/GroupManagerTest.java | 4 +- .../managers/UserAssociationManagerTest.java | 8 +-- .../segue/api/managers/UserManagerTest.java | 6 +- .../segue/api/monitors/MisuseMonitorTest.java | 2 +- .../segue/auth/IOAuth1AuthenticatorTest.java | 2 +- .../segue/auth/IOAuth2AuthenticatorTest.java | 2 +- .../segue/auth/IOAuthAuthenticatorTest.java | 4 +- .../RaspberryPiOidcAuthenticatorTest.java | 2 +- .../auth/SegueLocalAuthenticatorTest.java | 2 +- .../cl/dtg/segue/comm/EmailManagerTest.java | 70 +++++++++---------- .../segue/dao/ContentSubclassMapperTest.java | 2 +- .../dtg/segue/dao/GitContentManagerTest.java | 4 +- .../cam/cl/dtg/segue/database/GitDbTest.java | 3 +- .../cl/dtg/segue/etl/ContentIndexerTest.java | 3 +- .../etl/ETLInMemorySshConfigStoreTest.java | 4 +- .../search/ElasticSearchProviderTest.java | 2 +- .../cl/dtg/segue/util/NameFormatterTest.java | 4 +- .../ac/cam/cl/dtg/util/NameOrdererTest.java | 4 +- 39 files changed, 121 insertions(+), 120 deletions(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java index b6ae007e88..61a80c7442 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java @@ -50,7 +50,7 @@ import static org.easymock.EasyMock.partialMockBuilder; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * A test base for testing Facades, specifically targeted around testing facades as different users. diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java index 2e3de83635..b4f9e18700 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java @@ -44,8 +44,8 @@ import static org.easymock.EasyMock.replay; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThrows; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import static uk.ac.cam.cl.dtg.segue.api.Constants.*; public class QuestionFacadeTest extends AbstractFacadeTest { diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java index 2430e1e3f0..cd5af009b0 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeTest.java @@ -71,8 +71,8 @@ import static org.easymock.EasyMock.expectLastCall; import static org.easymock.EasyMock.getCurrentArguments; import static org.easymock.EasyMock.replay; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; import static uk.ac.cam.cl.dtg.isaac.api.Constants.*; public class QuizFacadeTest extends AbstractFacadeTest { diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/EventBookingManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/EventBookingManagerTest.java index fdf8ce7776..668ec9431e 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/EventBookingManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/EventBookingManagerTest.java @@ -39,11 +39,10 @@ import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.expectLastCall; -import static org.easymock.EasyMock.mock; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; import static uk.ac.cam.cl.dtg.segue.api.Constants.*; /** diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java index 1061790e47..23b243fdca 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/GameManagerTest.java @@ -38,8 +38,8 @@ import java.util.stream.Collectors; import static org.easymock.EasyMock.replay; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static uk.ac.cam.cl.dtg.segue.api.Constants.*; public class GameManagerTest { diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java index 7ce195a63d..e21748d493 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java @@ -35,8 +35,8 @@ import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.resetToNice; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import static uk.ac.cam.cl.dtg.segue.api.Constants.HOST_NAME; public class QuizAssignmentManagerTest extends AbstractManagerTest { diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java index 1f4937c76b..adfc21b668 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java @@ -31,7 +31,7 @@ import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; public class QuizAttemptManagerTest extends AbstractManagerTest { private static final Long TEST_ID = 0xC0000000000L; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizManagerTest.java index 9b3dbf4dfa..ae47e7b790 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizManagerTest.java @@ -18,8 +18,8 @@ import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThrows; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; public class QuizManagerTest extends AbstractManagerTest { diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java index 002339d4e8..1c5580234c 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java @@ -49,11 +49,11 @@ import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; public class QuizQuestionManagerTest extends AbstractManagerTest { diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/UserAttemptManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/UserAttemptManagerTest.java index cc8501a4e7..116f98b372 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/UserAttemptManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/UserAttemptManagerTest.java @@ -13,8 +13,8 @@ import java.util.List; import java.util.Map; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; import static uk.ac.cam.cl.dtg.isaac.api.Constants.*; import static uk.ac.cam.cl.dtg.segue.api.managers.QuestionManager.extractPageIdFromQuestionId; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/app/GameboardsFacadeTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/app/GameboardsFacadeTest.java index 3f92c81a5a..d505d62038 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/app/GameboardsFacadeTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/app/GameboardsFacadeTest.java @@ -40,7 +40,7 @@ import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Test class for the user manager class. diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/dos/eventbookings/PgEventBookingsTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/dos/eventbookings/PgEventBookingsTest.java index c5694c6331..aaf847e0e2 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/dos/eventbookings/PgEventBookingsTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/dos/eventbookings/PgEventBookingsTest.java @@ -18,7 +18,7 @@ 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 static org.junit.jupiter.api.Assertions.assertEquals; public class PgEventBookingsTest { private PgEventBookings buildPgEventBookings() { diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacClozeValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacClozeValidatorTest.java index 8c3c8ee697..6f2022cbba 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacClozeValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacClozeValidatorTest.java @@ -33,11 +33,11 @@ import java.util.Collections; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThrows; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; public class IsaacClozeValidatorTest { private IsaacClozeValidator validator; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacCoordinateValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacCoordinateValidatorTest.java index 67aae1e8a7..47d6976767 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacCoordinateValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacCoordinateValidatorTest.java @@ -29,10 +29,10 @@ import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; public class IsaacCoordinateValidatorTest { diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacDndValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacDndValidatorTest.java index e22824e4c7..51bba2929a 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacDndValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacDndValidatorTest.java @@ -47,10 +47,10 @@ import java.util.stream.Stream; import static java.lang.String.format; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; @RunWith(Theories.class) @SuppressWarnings("checkstyle:MissingJavadocType") diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacGraphSketcherValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacGraphSketcherValidatorTest.java index 44108f44ff..c0eab1e844 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacGraphSketcherValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacGraphSketcherValidatorTest.java @@ -25,8 +25,8 @@ import java.util.List; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Test class for the Graph Sketcher Validator class. diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java index bd15798be7..f29171467d 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java @@ -31,10 +31,10 @@ import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Test class for the Item Question Validator class. diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java index 4d07c55f1a..619ead55b3 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java @@ -35,10 +35,10 @@ import java.util.List; import static org.easymock.EasyMock.createMock; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Test class for the user manager class. diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java index 10728a20e8..a985243ba8 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java @@ -32,10 +32,10 @@ import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Test class for the Parsons Question Validator class. diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacReorderValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacReorderValidatorTest.java index f6afc5840a..a562c5ec2d 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacReorderValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacReorderValidatorTest.java @@ -32,11 +32,11 @@ import java.util.Collections; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThrows; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; public class IsaacReorderValidatorTest { private IsaacReorderValidator validator; diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java index aee8881cbb..74fe5b9c81 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java @@ -29,9 +29,9 @@ import java.util.List; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Test class for the String Match Validator class. diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java index bd13a78efe..22f8424c30 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/GroupManagerTest.java @@ -40,8 +40,8 @@ import java.util.Set; import static org.easymock.EasyMock.*; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; /** * Test class for the user manager class. diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAssociationManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAssociationManagerTest.java index 6af0ee02bb..5f144f0bd1 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAssociationManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAssociationManagerTest.java @@ -37,10 +37,10 @@ import static org.easymock.EasyMock.expectLastCall; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.fail; /** * Test class for the user Association class. diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java index 9e911e01eb..c13afd8a63 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserManagerTest.java @@ -71,9 +71,9 @@ import static org.easymock.EasyMock.expectLastCall; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; /** * Test class for the user manager class. diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/api/monitors/MisuseMonitorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/api/monitors/MisuseMonitorTest.java index 985f52b4f4..51461972f5 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/api/monitors/MisuseMonitorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/api/monitors/MisuseMonitorTest.java @@ -27,7 +27,7 @@ import uk.ac.cam.cl.dtg.util.AbstractConfigLoader; import static org.easymock.EasyMock.*; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.fail; /** * Test class for the user manager class. diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuth1AuthenticatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuth1AuthenticatorTest.java index 4a137d7ba9..2698392b7d 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuth1AuthenticatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuth1AuthenticatorTest.java @@ -20,7 +20,7 @@ import java.io.IOException; import java.net.URL; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Test class for the OAuth authenticator class. diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuth2AuthenticatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuth2AuthenticatorTest.java index ac9a7f990e..2e578a0ae0 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuth2AuthenticatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuth2AuthenticatorTest.java @@ -22,7 +22,7 @@ import java.io.IOException; import java.net.URL; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Test class for the OAuth authenticator class. diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuthAuthenticatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuthAuthenticatorTest.java index 85ebf860bc..55eb458647 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuthAuthenticatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/IOAuthAuthenticatorTest.java @@ -22,8 +22,8 @@ import java.io.IOException; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.fail; /** * Test class for the OAuth authenticator class. diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java index 13fa6b91e6..3128ef9864 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java @@ -24,7 +24,7 @@ import java.nio.file.Paths; import java.util.List; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; public class RaspberryPiOidcAuthenticatorTest { diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/SegueLocalAuthenticatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/SegueLocalAuthenticatorTest.java index 72045d4400..76bad5c346 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/SegueLocalAuthenticatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/SegueLocalAuthenticatorTest.java @@ -38,7 +38,7 @@ import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.fail; /** * Test class for the SegueLocalAuthenticator class. diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java index f2358966db..1ad8cf7615 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java @@ -15,9 +15,10 @@ */ package uk.ac.cam.cl.dtg.segue.comm; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.fail; import java.util.Date; import java.util.List; @@ -27,7 +28,6 @@ import org.easymock.Capture; import org.easymock.EasyMock; import org.easymock.IAnswer; -import org.junit.Assert; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.slf4j.Logger; @@ -147,7 +147,7 @@ public final void setUp() throws Exception { EasyMock.isA(EmailCommunicationMessage.class))); } catch (CommunicationException e1) { e1.printStackTrace(); - Assert.fail(); + fail(); } EasyMock.replay(emailCommunicator); @@ -236,7 +236,7 @@ public final void sendTemplatedEmailToUser_checkForTemplateCompletion_emailShoul } catch (ContentManagerException e) { e.printStackTrace(); - Assert.fail(); + fail(); } EmailManager manager = new EmailManager(emailCommunicator, userPreferenceManager, mockPropertiesLoader, @@ -248,10 +248,10 @@ public final void sendTemplatedEmailToUser_checkForTemplateCompletion_emailShoul emailTokens, EmailType.SYSTEM); } catch (ContentManagerException e) { e.printStackTrace(); - Assert.fail(); + fail(); } catch (SegueDatabaseException e) { e.printStackTrace(); - Assert.fail(); + fail(); } final String expectedMessagePlainText = "Hi, tester." @@ -272,7 +272,7 @@ public final void sendTemplatedEmailToUser_checkForTemplateCompletion_emailShoul i++; } catch (InterruptedException e) { e.printStackTrace(); - Assert.fail(); + fail(); } } email = capturedArgument.getValue(); @@ -311,7 +311,7 @@ public final void sendFederatedPasswordReset_checkForTemplateCompletion_emailSho EasyMock.replay(mockContentManager); } catch (ContentManagerException e) { e.printStackTrace(); - Assert.fail(); + fail(); } EmailManager manager = new EmailManager(emailCommunicator, userPreferenceManager, mockPropertiesLoader, @@ -324,12 +324,12 @@ public final void sendFederatedPasswordReset_checkForTemplateCompletion_emailSho } catch (ContentManagerException e) { e.printStackTrace(); - Assert.fail(); + fail(); log.debug(e.getMessage()); } catch (SegueDatabaseException e) { e.printStackTrace(); log.debug(e.getMessage()); - Assert.fail(); + fail(); } final String expectedMessage = "Hello, tester.\n\nYou requested a password reset. " @@ -344,7 +344,7 @@ public final void sendFederatedPasswordReset_checkForTemplateCompletion_emailSho i++; } catch (InterruptedException e) { e.printStackTrace(); - Assert.fail(); + fail(); } } email = capturedArgument.getValue(); @@ -384,7 +384,7 @@ public final void sendPasswordReset_checkForTemplateCompletion_emailShouldBeSent } catch (ContentManagerException e) { e.printStackTrace(); - Assert.fail(); + fail(); } EmailManager manager = new EmailManager(emailCommunicator, userPreferenceManager, mockPropertiesLoader, @@ -399,10 +399,10 @@ public final void sendPasswordReset_checkForTemplateCompletion_emailShouldBeSent } catch (ContentManagerException e) { e.printStackTrace(); - Assert.fail(); + fail(); } catch (SegueDatabaseException e) { e.printStackTrace(); - Assert.fail(); + fail(); } final String expectedMessage = "Hello, tester.\n\nA request has been " @@ -418,7 +418,7 @@ public final void sendPasswordReset_checkForTemplateCompletion_emailShouldBeSent i++; } catch (InterruptedException e) { e.printStackTrace(); - Assert.fail(); + fail(); } } email = capturedArgument.getValue(); @@ -455,7 +455,7 @@ public final void sendRegistrationConfirmation_checkForInvalidTemplateTags_throw } catch (ContentManagerException e) { e.printStackTrace(); - Assert.fail(); + fail(); } EmailManager manager = new EmailManager(emailCommunicator, userPreferenceManager, mockPropertiesLoader, @@ -469,10 +469,10 @@ public final void sendRegistrationConfirmation_checkForInvalidTemplateTags_throw } catch (ContentManagerException e) { e.printStackTrace(); - Assert.fail(); + fail(); } catch (SegueDatabaseException e) { e.printStackTrace(); - Assert.fail(); + fail(); } } @@ -503,7 +503,7 @@ public final void sendRegistrationConfirmation_checkTemplatesWithNoTagsWorks_ema EasyMock.replay(mockContentManager); } catch (ContentManagerException e) { e.printStackTrace(); - Assert.fail(); + fail(); } EmailManager manager = new EmailManager(emailCommunicator, userPreferenceManager, mockPropertiesLoader, @@ -516,10 +516,10 @@ public final void sendRegistrationConfirmation_checkTemplatesWithNoTagsWorks_ema emailTokens, EmailType.SYSTEM); } catch (ContentManagerException e) { e.printStackTrace(); - Assert.fail(); + fail(); } catch (SegueDatabaseException e) { e.printStackTrace(); - Assert.fail(); + fail(); } // Wait for the emailQueue to spin up and send our message @@ -530,7 +530,7 @@ public final void sendRegistrationConfirmation_checkTemplatesWithNoTagsWorks_ema i++; } catch (InterruptedException e) { e.printStackTrace(); - Assert.fail(); + fail(); } } email = capturedArgument.getValue(); @@ -558,7 +558,7 @@ public void sendRegistrationConfirmation_checkNullContentDTO_exceptionThrownAndD EasyMock.replay(mockContentManager); } catch (ContentManagerException e) { e.printStackTrace(); - Assert.fail(); + fail(); } EmailManager manager = new EmailManager(emailCommunicator, userPreferenceManager, mockPropertiesLoader, @@ -572,7 +572,7 @@ public void sendRegistrationConfirmation_checkNullContentDTO_exceptionThrownAndD } catch (ContentManagerException e) { e.printStackTrace(); - Assert.fail(); + fail(); } catch (SegueDatabaseException e) { e.printStackTrace(); log.info(e.getMessage()); @@ -586,7 +586,7 @@ public void sendRegistrationConfirmation_checkNullContentDTO_exceptionThrownAndD i++; } catch (InterruptedException e) { e.printStackTrace(); - Assert.fail(); + fail(); } } // We expect there to be nothing captured because the content was not returned @@ -612,7 +612,7 @@ public void sendCustomEmail_checkNullProperties_replacedWithEmptyString() { EasyMock.expect(userPreferenceManager.getUserPreference(SegueUserPreferences.EMAIL_PREFERENCE.name(), "ASSIGNMENTS", userDTOWithNulls.getId())).andReturn(userPreference); } catch (SegueDatabaseException e1) { e1.printStackTrace(); - Assert.fail(); + fail(); } EasyMock.replay(userPreferenceManager); @@ -636,15 +636,15 @@ public void sendCustomEmail_checkNullProperties_replacedWithEmptyString() { EasyMock.replay(mockContentManager); } catch (ContentManagerException e) { e.printStackTrace(); - Assert.fail(); + fail(); } try { manager.sendCustomEmail(userDTOWithNulls, contentObjectId, allSelectedUsers, EmailType.ASSIGNMENTS); } catch (SegueDatabaseException e) { - Assert.fail(); + fail(); } catch (ContentManagerException e) { - Assert.fail(); + fail(); } } @@ -668,7 +668,7 @@ public void sendCustomContentEmail_checkNullProperties_replacedWithEmptyString() EasyMock.expect(userPreferenceManager.getUserPreference(SegueUserPreferences.EMAIL_PREFERENCE.name(), "ASSIGNMENTS", userDTOWithNulls.getId())).andReturn(userPreference); } catch (SegueDatabaseException e1) { e1.printStackTrace(); - Assert.fail(); + fail(); } EasyMock.replay(userPreferenceManager); @@ -695,15 +695,15 @@ public void sendCustomContentEmail_checkNullProperties_replacedWithEmptyString() EasyMock.replay(mockContentManager); } catch (ContentManagerException e) { e.printStackTrace(); - Assert.fail(); + fail(); } try { manager.sendCustomContentEmail(userDTOWithNulls, emailTemplate, allSelectedUsers, EmailType.ASSIGNMENTS); } catch (SegueDatabaseException e) { - Assert.fail(); + fail(); } catch (ContentManagerException e) { - Assert.fail(); + fail(); } } diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/dao/ContentSubclassMapperTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/dao/ContentSubclassMapperTest.java index 7f11d5d48a..dfb7fb715d 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/dao/ContentSubclassMapperTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/dao/ContentSubclassMapperTest.java @@ -8,7 +8,7 @@ import uk.ac.cam.cl.dtg.isaac.dto.content.ContentDTO; import uk.ac.cam.cl.dtg.segue.dao.content.ContentSubclassMapper; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; public class ContentSubclassMapperTest { diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/dao/GitContentManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/dao/GitContentManagerTest.java index b5f33ea886..e685609df9 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/dao/GitContentManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/dao/GitContentManagerTest.java @@ -29,8 +29,8 @@ import java.util.*; import static org.easymock.EasyMock.*; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; /** * Test class for the GitContentManager class. diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/database/GitDbTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/database/GitDbTest.java index d4855e73e8..d81c0ea5bc 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/database/GitDbTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/database/GitDbTest.java @@ -15,7 +15,8 @@ */ package uk.ac.cam.cl.dtg.segue.database; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.fail; import java.io.IOException; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java index fe56c8235c..3a2050954b 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ContentIndexerTest.java @@ -16,7 +16,8 @@ * limitations under the License. */ import static org.easymock.EasyMock.*; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import static uk.ac.cam.cl.dtg.segue.etl.ContentIndexer.FEEDBACK_QUESTION_UNUSED_DZ; import java.util.*; diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ETLInMemorySshConfigStoreTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ETLInMemorySshConfigStoreTest.java index 6362e06cda..00057aca0b 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ETLInMemorySshConfigStoreTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/etl/ETLInMemorySshConfigStoreTest.java @@ -9,8 +9,8 @@ import java.util.List; import java.util.Map; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; public class ETLInMemorySshConfigStoreTest { diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/search/ElasticSearchProviderTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/search/ElasticSearchProviderTest.java index c5c0438593..c9357ed3a8 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/search/ElasticSearchProviderTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/search/ElasticSearchProviderTest.java @@ -22,7 +22,7 @@ import java.util.HashMap; import java.util.Map; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; public class ElasticSearchProviderTest { diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/util/NameFormatterTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/util/NameFormatterTest.java index b3a9889a7f..c39e20b907 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/util/NameFormatterTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/util/NameFormatterTest.java @@ -8,8 +8,8 @@ import java.util.Date; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; public class NameFormatterTest { diff --git a/src/test/java/uk/ac/cam/cl/dtg/util/NameOrdererTest.java b/src/test/java/uk/ac/cam/cl/dtg/util/NameOrdererTest.java index cbe94f117d..e3a1ee2eed 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/util/NameOrdererTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/util/NameOrdererTest.java @@ -12,8 +12,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; public class NameOrdererTest { Date somePastDate = new Date(System.currentTimeMillis() - 7 * 24 * 60 * 60 * 1000); From 592db368ce09b5d96ae64fc8d95fc00b80059845 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Tue, 24 Feb 2026 11:44:16 +0000 Subject: [PATCH 22/38] Use JUnit 5 for asserting exceptions thrown --- .../managers/QuizAssignmentManagerTest.java | 29 ++++---- .../api/managers/QuizAttemptManagerTest.java | 10 +-- .../RaspberryPiOidcAuthenticatorTest.java | 25 ++++--- .../cl/dtg/segue/comm/EmailManagerTest.java | 67 ++++++++++--------- 4 files changed, 71 insertions(+), 60 deletions(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java index e21748d493..321bb54aae 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java @@ -36,6 +36,7 @@ import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.resetToNice; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static uk.ac.cam.cl.dtg.segue.api.Constants.HOST_NAME; @@ -100,22 +101,24 @@ public void createAnotherAssignmentAfterFirstIsDueSucceeds() throws SegueDatabas quizAssignmentManager.createAssignment(newAssignment); } - @Test(expected = DueBeforeNowException.class) - public void createAssignmentFailsInThePast() throws SegueDatabaseException, ContentManagerException { - newAssignment.setDueDate(somePastDate); - - quizAssignmentManager.createAssignment(newAssignment); + @Test + void createAssignmentFailsInThePast() { + assertThrows(DueBeforeNowException.class, () -> { + newAssignment.setDueDate(somePastDate); + quizAssignmentManager.createAssignment(newAssignment); + }); } - @Test(expected = DuplicateAssignmentException.class) - public void createDuplicateAssignmentFails() throws SegueDatabaseException, ContentManagerException { - - withMock(quizAssignmentPersistenceManager, m -> { - expect(m.getAssignmentsByQuizIdAndGroup( - studentQuiz.getId(), studentGroup.getId())).andReturn(Collections.singletonList(studentAssignment)); + @Test + public void createDuplicateAssignmentFails() { + assertThrows(DuplicateAssignmentException.class, () -> { + withMock(quizAssignmentPersistenceManager, m -> { + expect(m.getAssignmentsByQuizIdAndGroup( + studentQuiz.getId(), studentGroup.getId())).andReturn(Collections.singletonList(studentAssignment)); + }); + + quizAssignmentManager.createAssignment(newAssignment); }); - - quizAssignmentManager.createAssignment(newAssignment); } @Test diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java index adfc21b668..233f9d8ba1 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAttemptManagerTest.java @@ -32,6 +32,7 @@ import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; public class QuizAttemptManagerTest extends AbstractManagerTest { private static final Long TEST_ID = 0xC0000000000L; @@ -56,11 +57,12 @@ public void fetchOrCreateWithExistingAttempt() throws AttemptCompletedException, assertEquals(studentAttempt, attempt); } - @Test(expected = AttemptCompletedException.class) + @Test public void fetchOrCreateWithExistingCompletedAttemptFails() throws AttemptCompletedException, SegueDatabaseException { - withMock(quizAttemptPersistenceManager, forStudentAssignmentReturn(completedAttempt)); - - quizAttemptManager.fetchOrCreate(studentAssignment, student); + assertThrows(AttemptCompletedException.class, () -> { + withMock(quizAttemptPersistenceManager, forStudentAssignmentReturn(completedAttempt)); + quizAttemptManager.fetchOrCreate(studentAssignment, student); + }); } @Test diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java index 3128ef9864..cd3b8295a6 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java @@ -25,6 +25,7 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; public class RaspberryPiOidcAuthenticatorTest { @@ -75,17 +76,19 @@ public void getGivenNameFamilyName_emptyTokenisedNameProvided_returnsSensibleNam assertEquals("John", givenNameFamilyName.get(1)); } - @Test(expected = NoUserException.class) - public void getGivenNameFamilyName_invalidNicknameProvided_throwsException() throws Exception{ - // Arrange - String idpNickname = "*"; - String idpFullName = "John Smith"; - - // Act - authenticator.getGivenNameFamilyName(idpNickname, idpFullName); - - // Assert - // See signature + @Test + public void getGivenNameFamilyName_invalidNicknameProvided_throwsException() { + assertThrows(Exception.class, () -> { + // Arrange + String idpNickname = "*"; + String idpFullName = "John Smith"; + + // Act + authenticator.getGivenNameFamilyName(idpNickname, idpFullName); + + // Assert + // See signature + }); } @Test diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java index 1ad8cf7615..729d459355 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/comm/EmailManagerTest.java @@ -18,6 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.fail; import java.util.Date; @@ -433,47 +434,49 @@ public final void sendPasswordReset_checkForTemplateCompletion_emailShouldBeSent * * @throws CommunicationException */ - @Test(expected = IllegalArgumentException.class) + @Test public final void sendRegistrationConfirmation_checkForInvalidTemplateTags_throwIllegalArgumentException() { - EmailTemplateDTO template = createDummyEmailTemplate("Hi, {{givenName}} {{surname}}.\n" - + "Thanks for registering!\nYour Isaac email address is: " - + "{{email}}.\naddress\n{{sig}}"); + assertThrows(IllegalArgumentException.class, () -> { + EmailTemplateDTO template = createDummyEmailTemplate("Hi, {{givenName}} {{surname}}.\n" + + "Thanks for registering!\nYour Isaac email address is: " + + "{{email}}.\naddress\n{{sig}}"); - ContentDTO htmlTemplate = createDummyContentTemplate("{{content}}"); - // Create content manager - try { - EasyMock.expect( - mockContentManager.getContentById("email-template-registration-confirmation")) - .andReturn(template).once(); + ContentDTO htmlTemplate = createDummyContentTemplate("{{content}}"); + // Create content manager + try { + EasyMock.expect( + mockContentManager.getContentById("email-template-registration-confirmation")) + .andReturn(template).once(); - EasyMock.expect(mockContentManager.getContentById("email-template-html")) - .andReturn(htmlTemplate).once(); + EasyMock.expect(mockContentManager.getContentById("email-template-html")) + .andReturn(htmlTemplate).once(); - EasyMock.expect(mockContentManager.getCurrentContentSHA()).andReturn(CONTENT_VERSION).atLeastOnce(); + EasyMock.expect(mockContentManager.getCurrentContentSHA()).andReturn(CONTENT_VERSION).atLeastOnce(); - EasyMock.replay(mockContentManager); + EasyMock.replay(mockContentManager); - } catch (ContentManagerException e) { - e.printStackTrace(); - fail(); - } + } catch (ContentManagerException e) { + e.printStackTrace(); + fail(); + } - EmailManager manager = new EmailManager(emailCommunicator, userPreferenceManager, mockPropertiesLoader, - mockContentManager, logManager, generateGlobalTokenMap()); - try { - ImmutableMap emailTokens = ImmutableMap.of("verificationURL", "https://testUrl.com"); + EmailManager manager = new EmailManager(emailCommunicator, userPreferenceManager, mockPropertiesLoader, + mockContentManager, logManager, generateGlobalTokenMap()); + try { + ImmutableMap emailTokens = ImmutableMap.of("verificationURL", "https://testUrl.com"); - manager.sendTemplatedEmailToUser(userDTO, - template, - emailTokens, EmailType.SYSTEM); + manager.sendTemplatedEmailToUser(userDTO, + template, + emailTokens, EmailType.SYSTEM); - } catch (ContentManagerException e) { - e.printStackTrace(); - fail(); - } catch (SegueDatabaseException e) { - e.printStackTrace(); - fail(); - } + } catch (ContentManagerException e) { + e.printStackTrace(); + fail(); + } catch (SegueDatabaseException e) { + e.printStackTrace(); + fail(); + } + }); } /** From 9856e10e83065e18f5e9bafb4b681b354a3e12c8 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Tue, 24 Feb 2026 12:11:14 +0000 Subject: [PATCH 23/38] Replace ExpectedException rule with assertThrows The Rule annotation is incompatible with JUnit 5, and ExpectedException.none is deprecated anyway. --- .../quiz/IsaacItemQuestionValidatorTest.java | 22 ++++++------- .../isaac/quiz/IsaacNumericValidatorTest.java | 22 ++++++------- .../isaac/quiz/IsaacParsonsValidatorTest.java | 31 ++++++++----------- .../quiz/IsaacStringMatchValidatorTest.java | 24 ++++++-------- 4 files changed, 41 insertions(+), 58 deletions(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java index f29171467d..19f7969ce5 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacItemQuestionValidatorTest.java @@ -17,10 +17,8 @@ import com.google.api.client.util.Lists; import com.google.common.collect.ImmutableList; -import org.junit.Rule; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.rules.ExpectedException; import uk.ac.cam.cl.dtg.isaac.dos.IsaacItemQuestion; import uk.ac.cam.cl.dtg.isaac.dos.IsaacQuickQuestion; import uk.ac.cam.cl.dtg.isaac.dos.QuestionValidationResponse; @@ -34,6 +32,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; /** @@ -45,9 +44,6 @@ public class IsaacItemQuestionValidatorTest { private IsaacItemQuestion someItemQuestion; private String incorrectExplanation = "EXPLANATION"; - @Rule - public ExpectedException expectedException = ExpectedException.none(); - /** * Initial configuration of tests. */ @@ -494,11 +490,11 @@ public final void isaacItemQuestionValidator_WrongQuestionType_ExceptionShouldBe IsaacQuickQuestion invalidQuestionType = new IsaacQuickQuestion(); invalidQuestionType.setId("invalidQuestionType"); - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("only works with IsaacItemQuestions"); - // This should throw an exception: - validator.validateQuestionResponse(invalidQuestionType, new ItemChoice()); + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + validator.validateQuestionResponse(invalidQuestionType, new ItemChoice()); + }); + assertTrue(exception.getMessage().contains("only works with IsaacItemQuestions")); } /* @@ -509,10 +505,10 @@ public final void isaacItemQuestionValidator_WrongChoiceType_ExceptionShouldBeTh IsaacItemQuestion itemQuestion = new IsaacItemQuestion(); itemQuestion.setId("invalidQuestionType"); - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("Expected ItemChoice for IsaacItemQuestion"); - // This should throw an exception: - validator.validateQuestionResponse(itemQuestion, new Choice()); + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + validator.validateQuestionResponse(itemQuestion, new Choice()); + }); + assertTrue(exception.getMessage().contains("Expected ItemChoice for IsaacItemQuestion")); } } \ No newline at end of file diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java index 619ead55b3..7a2b421577 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java @@ -16,10 +16,8 @@ package uk.ac.cam.cl.dtg.isaac.quiz; import com.google.api.client.util.Lists; -import org.junit.Rule; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.rules.ExpectedException; import org.slf4j.Logger; import uk.ac.cam.cl.dtg.isaac.dos.IsaacNumericQuestion; import uk.ac.cam.cl.dtg.isaac.dos.IsaacQuickQuestion; @@ -38,6 +36,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; /** @@ -55,9 +54,6 @@ public class IsaacNumericValidatorTest { private String correctIntegerAnswer = "42"; private String correctUnits = "m\\,s^{-1}"; - @Rule - public ExpectedException expectedException = ExpectedException.none(); - /** * Initial configuration of tests. * @@ -623,11 +619,11 @@ public final void isaacNumericValidator_WrongQuestionType_ExceptionShouldBeThrow IsaacQuickQuestion invalidQuestionType = new IsaacQuickQuestion(); invalidQuestionType.setId("invalidQuestionType"); - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("only works with Isaac Numeric Questions"); - // This should throw an exception: - validator.validateQuestionResponse(invalidQuestionType, new Quantity()); + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + validator.validateQuestionResponse(invalidQuestionType, new Quantity()); + }); + assertTrue(exception.getMessage().contains("only works with Isaac Numeric Questions")); } /* @@ -638,11 +634,11 @@ public final void isaacNumericValidator_WrongChoiceType_ExceptionShouldBeThrown( IsaacNumericQuestion numericQuestion = new IsaacNumericQuestion(); numericQuestion.setId("invalidQuestionType"); - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("Expected Quantity for IsaacNumericQuestion"); - // This should throw an exception: - validator.validateQuestionResponse(numericQuestion, new Choice()); + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + validator.validateQuestionResponse(numericQuestion, new Choice()); + }); + assertTrue(exception.getMessage().contains("Expected Quantity for IsaacNumericQuestion")); } /* diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java index a985243ba8..0a03637aa7 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java @@ -17,10 +17,8 @@ import com.google.api.client.util.Lists; import com.google.common.collect.ImmutableList; -import org.junit.Rule; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.rules.ExpectedException; import uk.ac.cam.cl.dtg.isaac.dos.IsaacParsonsQuestion; import uk.ac.cam.cl.dtg.isaac.dos.IsaacQuickQuestion; import uk.ac.cam.cl.dtg.isaac.dos.QuestionValidationResponse; @@ -35,6 +33,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; /** @@ -46,9 +45,6 @@ public class IsaacParsonsValidatorTest { private IsaacParsonsQuestion someParsonsQuestion; private String incorrectExplanation = "EXPLANATION"; - @Rule - public ExpectedException expectedException = ExpectedException.none(); - /** * Initial configuration of tests. */ @@ -194,11 +190,10 @@ public final void isaacParsonsValidator_IncorrectItemType_ExceptionShouldBeThrow Item submittedItem2 = new Item("id002", null); c.setItems(ImmutableList.of(submittedItem1, submittedItem2)); - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("Expected ParsonsChoice to contain ParsonsItems"); - - // This should throw an exception: - validator.validateQuestionResponse(someParsonsQuestion, c); + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + validator.validateQuestionResponse(someParsonsQuestion, c); + }); + assertTrue(exception.getMessage().contains("Expected ParsonsChoice to contain ParsonsItems")); } /* @@ -404,11 +399,11 @@ public final void isaacParsonsValidator_WrongQuestionType_ExceptionShouldBeThrow IsaacQuickQuestion invalidQuestionType = new IsaacQuickQuestion(); invalidQuestionType.setId("invalidQuestionType"); - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("only works with IsaacParsonsQuestions"); - // This should throw an exception: - validator.validateQuestionResponse(invalidQuestionType, new ParsonsChoice()); + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + validator.validateQuestionResponse(invalidQuestionType, new ParsonsChoice()); + }); + assertTrue(exception.getMessage().contains("only works with IsaacParsonsQuestions")); } /* @@ -419,10 +414,10 @@ public final void isaacParsonsValidator_WrongChoiceType_ExceptionShouldBeThrown( IsaacParsonsQuestion parsonsQuestion = new IsaacParsonsQuestion(); parsonsQuestion.setId("invalidQuestionType"); - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("Expected ParsonsChoice for IsaacParsonsQuestion"); - // This should throw an exception: - validator.validateQuestionResponse(parsonsQuestion, new Choice()); + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + validator.validateQuestionResponse(parsonsQuestion, new Choice()); + }); + assertTrue(exception.getMessage().contains("Expected ParsonsChoice for IsaacParsonsQuestion")); } } \ No newline at end of file diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java index 74fe5b9c81..af5ad34b4a 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacStringMatchValidatorTest.java @@ -16,10 +16,8 @@ package uk.ac.cam.cl.dtg.isaac.quiz; import com.google.api.client.util.Lists; -import org.junit.Rule; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.rules.ExpectedException; import uk.ac.cam.cl.dtg.isaac.dos.IsaacQuickQuestion; import uk.ac.cam.cl.dtg.isaac.dos.IsaacStringMatchQuestion; import uk.ac.cam.cl.dtg.isaac.dos.QuestionValidationResponse; @@ -31,6 +29,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; /** @@ -43,9 +42,6 @@ public class IsaacStringMatchValidatorTest { private String caseSensitiveAnswer = "CaseSensitiveAnswer"; private String caseInsensitiveAnswer = "CaseInsensitiveAnswer"; - @Rule - public ExpectedException expectedException = ExpectedException.none(); - /** * Initial configuration of tests. * @@ -471,11 +467,11 @@ public final void isaacStringMatchValidator_WrongQuestionType_ExceptionShouldBeT IsaacQuickQuestion invalidQuestionType = new IsaacQuickQuestion(); invalidQuestionType.setId("invalidQuestionType"); - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("only works with Isaac String Match Questions"); - // This should throw an exception: - validator.validateQuestionResponse(invalidQuestionType, new StringChoice()); + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + validator.validateQuestionResponse(invalidQuestionType, new StringChoice()); + }); + assertTrue(exception.getMessage().contains("only works with Isaac String Match Questions")); } /* @@ -486,10 +482,10 @@ public final void isaacStringMatchValidator_WrongChoiceType_ExceptionShouldBeThr IsaacStringMatchQuestion someStringMatchQuestion = new IsaacStringMatchQuestion(); someStringMatchQuestion.setId("invalidQuestionType"); - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("Expected StringChoice for IsaacStringMatchQuestion"); - // This should throw an exception: - validator.validateQuestionResponse(someStringMatchQuestion, new Choice()); + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + validator.validateQuestionResponse(someStringMatchQuestion, new Choice()); + }); + assertTrue(exception.getMessage().contains("Expected StringChoice for IsaacStringMatchQuestion")); } -} +} \ No newline at end of file From cbcb758f940779be794d79c6c4d64165b467ddd0 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Tue, 24 Feb 2026 13:52:59 +0000 Subject: [PATCH 24/38] Use JUnit 5 for parameterised mapper tests --- .../dtg/util/mappers/ContentMapperTest.java | 40 +++++++------------ .../mappers/QuestionValidationMapperTest.java | 37 ++++++----------- 2 files changed, 26 insertions(+), 51 deletions(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/util/mappers/ContentMapperTest.java b/src/test/java/uk/ac/cam/cl/dtg/util/mappers/ContentMapperTest.java index 6c2d708934..fa5bfc1910 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/util/mappers/ContentMapperTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/util/mappers/ContentMapperTest.java @@ -1,45 +1,39 @@ package uk.ac.cam.cl.dtg.util.mappers; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.reflections.Reflections; import uk.ac.cam.cl.dtg.isaac.dos.content.Content; import uk.ac.cam.cl.dtg.isaac.dos.content.DTOMapping; import uk.ac.cam.cl.dtg.isaac.dto.content.ContentDTO; import java.lang.reflect.Modifier; -import java.util.Collection; import java.util.Objects; import java.util.Set; -import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Parameterised unit tests verifying mapping from subclasses of {@code Content} to their corresponding * {@code ContentDTO} subclasses. */ -@RunWith(Parameterized.class) -public class ContentMapperTest { +class ContentMapperTest { private final MainMapper mapper = MainMapper.INSTANCE; - Class sourceDOClass; - Class expectedDTOClass; - /** * Builds parameterised test cases mapping each concrete {@code Content} subclass to its corresponding * {@code ContentDTO} class. * - * @return collection of {@code Content}/{@code ContentDTO} class pairings + * @return a stream of {@code Content}/{@code ContentDTO} class pairings */ - @SuppressWarnings("unchecked") - @Parameterized.Parameters - public static Collection testCasesDOtoDTO() { + static Stream testCasesDOtoDTO() { Reflections reflections = new Reflections("uk.ac.cam.cl.dtg.isaac.dos"); Set> contentSubclasses = reflections.getSubTypesOf(Content.class); contentSubclasses.add(Content.class); return contentSubclasses.stream() + .filter(subclass -> !Modifier.isAbstract(subclass.getModifiers())) .map(subclass -> { if (Modifier.isAbstract(subclass.getModifiers())) { return null; @@ -48,21 +42,15 @@ public static Collection testCasesDOtoDTO() { if (mapping == null) { return null; } - Class dtoClass = (Class) mapping.value(); - return new Object[]{subclass, dtoClass}; + return Arguments.of(subclass, mapping.value()); }) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - } - - public ContentMapperTest(final Class sourceDOClass, - final Class expectedDTOClass) { - this.sourceDOClass = sourceDOClass; - this.expectedDTOClass = expectedDTOClass; + .filter(Objects::nonNull); } - @Test - public void testDOtoDTOMapping() { + @ParameterizedTest + @MethodSource("testCasesDOtoDTO") + void testDOtoDTOMapping(final Class sourceDOClass, + final Class expectedDTOClass) { Content source; try { source = sourceDOClass.getConstructor().newInstance(); diff --git a/src/test/java/uk/ac/cam/cl/dtg/util/mappers/QuestionValidationMapperTest.java b/src/test/java/uk/ac/cam/cl/dtg/util/mappers/QuestionValidationMapperTest.java index ab0c1123df..4b7b16addd 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/util/mappers/QuestionValidationMapperTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/util/mappers/QuestionValidationMapperTest.java @@ -1,39 +1,32 @@ package uk.ac.cam.cl.dtg.util.mappers; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.reflections.Reflections; import uk.ac.cam.cl.dtg.isaac.dos.QuestionValidationResponse; import uk.ac.cam.cl.dtg.isaac.dos.content.DTOMapping; import uk.ac.cam.cl.dtg.isaac.dto.QuestionValidationResponseDTO; -import java.util.Collection; import java.util.Objects; import java.util.Set; -import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Parameterised unit tests verifying mapping from subclasses of {@code QuestionValidationResponse} to their * corresponding {@code QuestionValidationResponseDTO} subclasses. */ -@RunWith(Parameterized.class) public class QuestionValidationMapperTest { private final MainMapper mapper = MainMapper.INSTANCE; - Class sourceDOClass; - Class expectedDTOClass; - /** * Builds parameterised test cases mapping each {@code QuestionValidationResponse} subclass to its * corresponding {@code QuestionValidationResponseDTO} class. * - * @return collection of {@code QuestionValidationResponse}/{@code QuestionValidationResponseDTO} class pairings + * @return a stream of {@code QuestionValidationResponse}/{@code QuestionValidationResponseDTO} class pairings */ - @SuppressWarnings("unchecked") - @Parameterized.Parameters - public static Collection testCasesDOtoDTO() { + public static Stream testCasesDOtoDTO() { Reflections reflections = new Reflections("uk.ac.cam.cl.dtg.isaac.dos"); Set> subclasses = reflections.getSubTypesOf(QuestionValidationResponse.class); @@ -43,21 +36,15 @@ public static Collection testCasesDOtoDTO() { if (mapping == null) { return null; } - Class dtoClass = (Class) mapping.value(); - return new Object[]{subclass, dtoClass}; + return Arguments.of(subclass, mapping.value()); }) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - } - - public QuestionValidationMapperTest(final Class sourceDOClass, - final Class expectedDTOClass) { - this.sourceDOClass = sourceDOClass; - this.expectedDTOClass = expectedDTOClass; + .filter(Objects::nonNull); } - @Test - public void testDOtoDTOMapping() { + @ParameterizedTest + @MethodSource("testCasesDOtoDTO") + public void testDOtoDTOMapping(final Class sourceDOClass, + final Class expectedDTOClass) { QuestionValidationResponse source; try { source = sourceDOClass.getConstructor().newInstance(); From 4442762daa546bff05fabacea5437bb33f10ee3f Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Tue, 24 Feb 2026 14:30:28 +0000 Subject: [PATCH 25/38] Invert assertion argument order In JUnit 5 the expected argument order is reversed, so that the message comes last. --- .../cl/dtg/isaac/api/AbstractFacadeTest.java | 3 +- .../api/managers/EventBookingManagerTest.java | 26 +++++++-------- .../eventbookings/PgEventBookingsTest.java | 2 +- .../isaac/quiz/IsaacNumericValidatorTest.java | 32 ++++++++++--------- .../managers/UserAssociationManagerTest.java | 4 +-- .../util/PostCodeLocationResolverTest.java | 32 ++++++++++--------- .../uk/ac/cam/cl/dtg/util/YamlLoaderTest.java | 2 +- 7 files changed, 53 insertions(+), 48 deletions(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java index 61a80c7442..75831f998a 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/AbstractFacadeTest.java @@ -267,7 +267,8 @@ protected RegisteredUserDTO currentUser() { /////////////////////////////////////////////////////////////////////////// private void assertErrorResponse(Status expectedStatus, Response actual) { - assertEquals("Expected status " + expectedStatus.name() + ", got " + actual.getStatusInfo().toEnum().name() + " with details " + extractErrorInfo(actual), expectedStatus.getStatusCode(), actual.getStatus()); + assertEquals(expectedStatus.getStatusCode(), actual.getStatus(), + "Expected status " + expectedStatus.name() + ", got " + actual.getStatusInfo().toEnum().name() + " with details " + extractErrorInfo(actual)); } private String extractErrorInfo(Response response) { diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/EventBookingManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/EventBookingManagerTest.java index 668ec9431e..94ec547797 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/EventBookingManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/EventBookingManagerTest.java @@ -661,9 +661,9 @@ public void getPlacesAvailable_checkEventCapacity_capacityCalculatedCorrectly() // Run the test for a student event replay(mockedObjects); Long actualPlacesAvailable = ebm.getPlacesAvailable(testEvent); - Long expectedPlacesAvailable = (long)initialNumberOfPlaces - 1 - 10; - assertEquals("STUDENT events should only count confirmed and waiting list student places in availability calculations", - expectedPlacesAvailable, actualPlacesAvailable); + Long expectedPlacesAvailable = (long) initialNumberOfPlaces - 1 - 10; + assertEquals(expectedPlacesAvailable, actualPlacesAvailable, + "STUDENT events should only count confirmed and waiting list student places in availability calculations"); verify(mockedObjects); } @@ -705,8 +705,8 @@ public void getEventPage_checkWaitingListOnlyEventCapacity_capacityCalculatedCor replay(mockedObjects); Long placesAvailable = ebm.getPlacesAvailable(testEvent); Long expectedPlacesAvailable = 1L; - assertEquals("WAITING_LIST_ONLY events should only count confirmed places in availability calculations", - placesAvailable, expectedPlacesAvailable); + assertEquals(expectedPlacesAvailable, placesAvailable, + "WAITING_LIST_ONLY events should only count confirmed places in availability calculations"); verify(mockedObjects); } @@ -750,8 +750,8 @@ public void getEventPage_checkStudentEventReservedBookings_capacityCalculatedCor replay(mockedObjects); Long placesAvailable = ebm.getPlacesAvailable(testEvent); Long expectedPlacesAvailable = 0L; - assertEquals("RESERVED bookings should count towards the places available in availability calculations", - expectedPlacesAvailable, placesAvailable); + assertEquals(expectedPlacesAvailable, placesAvailable, + "RESERVED bookings should count towards the places available in availability calculations"); verify(mockedObjects); } @@ -817,9 +817,8 @@ public void isUserAbleToManageEvent_checkUsersWithDifferentRoles_success() throw ); for (RegisteredUserDTO user : expectedResults.keySet()) { - assertEquals(String.format("Test case: %s", user.getRole()), - expectedResults.get(user), - eventBookingManager.isUserAbleToManageEvent(user, testEvent)); + assertEquals(expectedResults.get(user), eventBookingManager.isUserAbleToManageEvent(user, testEvent), + String.format("Test case: %s", user.getRole())); } verify(mockedObjects); } @@ -848,7 +847,7 @@ class TestCase {IsaacEventPageDTO eventPageDTO; Boolean expected; String asserti for (TestCase testCase : testCases) { boolean actual = EventBookingManager.eventAllowsGroupBookings(testCase.eventPageDTO); - assertEquals(testCase.assertion, testCase.expected, actual); + assertEquals(testCase.expected, actual, testCase.assertion); } } @@ -913,7 +912,7 @@ public void requestReservations_reserveSpacesWhenThereAreAvailableSpaces_success replay(mockedObjects); List actualResults = eventBookingManager.requestReservations(testCase.event, students, testCase.teacher); List expectedResults = ImmutableList.of(testCase.student1Booking, testCase.student2Booking); - assertEquals("N results should be returned unaltered", expectedResults, actualResults); + assertEquals(expectedResults, actualResults, "N results should be returned unaltered"); verify(mockedObjects); } @@ -1051,7 +1050,8 @@ public void requestReservations_cancelledReservationsDoNotCountTowardsReservatio replay(mockedObjects); List actualResults = eventBookingManager.requestReservations(testCase.event, students, testCase.teacher); List expectedResults = ImmutableList.of(testCase.student1Booking); - assertEquals("Student 1 should get reserved despite the existing cancelled reservation", expectedResults, actualResults); + assertEquals(expectedResults, actualResults, + "Student 1 should get reserved despite the existing cancelled reservation"); verify(mockedObjects); } diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/dos/eventbookings/PgEventBookingsTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/dos/eventbookings/PgEventBookingsTest.java index aaf847e0e2..ea7ec55ea5 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/dos/eventbookings/PgEventBookingsTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/dos/eventbookings/PgEventBookingsTest.java @@ -87,7 +87,7 @@ public void getEventBookingStatusCounts_checkEventBookingStatusCounts_canCopeWit PgEventBookings pgEventBookings = this.buildPgEventBookings(); Map> actualStatusCounts = pgEventBookings.getEventBookingStatusCounts("someEventId", true); - assertEquals("Every row should be represented in the result", expectedStatusCounts, actualStatusCounts); + assertEquals(expectedStatusCounts, actualStatusCounts, "Every row should be represented in the result"); verify(mockedObjects); } } diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java index 7a2b421577..2d10f12b20 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacNumericValidatorTest.java @@ -397,14 +397,14 @@ public final void isaacNumericValidator_TestQuestionWithSigFigRange_IncorrectSig Quantity q_5sf = new Quantity("1.6875"); // Test response: QuestionValidationResponse response_5sf = validator.validateQuestionResponse(someNumericQuestion, q_5sf); - assertFalse("expected 1.6875 not to match 1.6875 to 2 or 3 sf", response_5sf.isCorrect()); + assertFalse(response_5sf.isCorrect(), "expected 1.6875 not to match 1.6875 to 2 or 3 sf"); assertTrue(response_5sf.getExplanation().getTags().contains("sig_figs")); // Set up a user answer: Quantity q_1sf = new Quantity("2"); // Test response: QuestionValidationResponse response_1sf = validator.validateQuestionResponse(someNumericQuestion, q_1sf); - assertFalse("expected 2 not to match 1.6875 to 2 or 3 sf", response_1sf.isCorrect()); + assertFalse(response_1sf.isCorrect(), "expected 2 not to match 1.6875 to 2 or 3 sf"); assertTrue(response_1sf.getExplanation().getTags().contains("sig_figs")); } @@ -430,7 +430,7 @@ public final void isaacNumericValidator_TestQuestionWithSigFigRange_SigFigRespon Quantity q_5sf_corr = new Quantity("1.6875"); // Test response is sig fig message: QuestionValidationResponse response_5sf_corr = validator.validateQuestionResponse(someNumericQuestion, q_5sf_corr); - assertFalse("expected 1.6875 not to match 1.6875 to 2 or 3 sf", response_5sf_corr.isCorrect()); + assertFalse(response_5sf_corr.isCorrect(), "expected 1.6875 not to match 1.6875 to 2 or 3 sf"); assertTrue(response_5sf_corr.getExplanation().getTags().contains("sig_figs")); assertTrue(response_5sf_corr.getExplanation().getTags().contains("sig_figs_too_many")); @@ -438,14 +438,14 @@ public final void isaacNumericValidator_TestQuestionWithSigFigRange_SigFigRespon Quantity q_5sf_wrong = new Quantity("2.7986"); // Test response does not mention sig figs: QuestionValidationResponse response_5sf_wrong = validator.validateQuestionResponse(someNumericQuestion, q_5sf_wrong); - assertFalse("expected 2.7986 not to match 1.6875", response_5sf_wrong.isCorrect()); - assertFalse("expected 2.7986 without sig fig message", response_5sf_wrong.getExplanation().getTags().contains("sig_figs")); + assertFalse(response_5sf_wrong.isCorrect(), "expected 2.7986 not to match 1.6875"); + assertFalse(response_5sf_wrong.getExplanation().getTags().contains("sig_figs"), "expected 2.7986 without sig fig message"); // Set up a user answer: Quantity q_1sf = new Quantity("5"); // Test response: QuestionValidationResponse response_1sf = validator.validateQuestionResponse(someNumericQuestion, q_1sf); - assertFalse("expected 5 not to match 1.6875 to 2 or 3 sf", response_1sf.isCorrect()); + assertFalse(response_1sf.isCorrect(), "expected 5 not to match 1.6875 to 2 or 3 sf"); assertTrue(response_1sf.getExplanation().getTags().contains("sig_figs")); assertTrue(response_1sf.getExplanation().getTags().contains("sig_figs_too_few")); } @@ -986,18 +986,20 @@ public final void isaacNumericValidator_correctAnswerWithDisregardSigFigs_respon private void testSigFigRoundingWorks(String inputValue, int sigFigToRoundTo, double expectedResult) throws Exception { double result = ValidationUtils.roundStringValueToSigFigs(inputValue, sigFigToRoundTo, log); - assertEquals("sigfig rounding failed for value '" + inputValue + "' to " + sigFigToRoundTo - + "sf: expected '" + expectedResult + "', got '" + result + "'", result, expectedResult, 0.0); + assertEquals(result, expectedResult, 0.0, "sigfig rounding failed for value '" + inputValue + "' to " + + sigFigToRoundTo + "sf: expected '" + expectedResult + "', got '" + result + "'"); } private void testSigFigExtractionWorks(String inputValue, int minAllowedSigFigs, int maxAllowedSigFigs, int expectedResult) throws Exception { int result = ValidationUtils.numberOfSignificantFiguresToValidateWith(inputValue, minAllowedSigFigs, maxAllowedSigFigs, log); - assertTrue("sigfig extraction out of range for value " + inputValue + " (min allowed: " + minAllowedSigFigs - + ", max allowed: " + maxAllowedSigFigs + ") got " + result, result <= maxAllowedSigFigs && result >= minAllowedSigFigs); - assertEquals("sigfig extraction failed for value " + inputValue + ", expected: " + expectedResult - + " got " + result, result, expectedResult); + assertTrue(result <= maxAllowedSigFigs && result >= minAllowedSigFigs, + "sigfig extraction out of range for value " + inputValue + " (min allowed: " + minAllowedSigFigs + + ", max allowed: " + maxAllowedSigFigs + ") got " + result); + + assertEquals(result, expectedResult, "sigfig extraction failed for value " + inputValue + ", expected: " + + expectedResult + " got " + result); } @@ -1014,16 +1016,16 @@ private void verifyCorrectNumberOfSigFigsNoRange(List numbersToTest, Lis for (Integer sigFig : sigFigsToPass) { boolean tooFew = ValidationUtils.tooFewSignificantFigures(number, sigFig, log); - assertFalse("Unexpected too few sig fig for " + number + " @ " + sigFig + "sf", tooFew); + assertFalse(tooFew, "Unexpected too few sig fig for " + number + " @ " + sigFig + "sf"); boolean tooMany = ValidationUtils.tooManySignificantFigures(number, sigFig, log); - assertFalse("Unexpected too many sig fig for " + number + " @ " + sigFig + "sf", tooMany); + assertFalse(tooMany, "Unexpected too many sig fig for " + number + " @ " + sigFig + "sf"); } for (Integer sigFig : sigFigsToFail) { boolean tooFew = ValidationUtils.tooFewSignificantFigures(number, sigFig, log); boolean tooMany = ValidationUtils.tooManySignificantFigures(number, sigFig, log); boolean incorrectSigFig = tooMany || tooFew; - assertTrue("Expected incorrect sig fig for " + number + " @ " + sigFig + "sf", incorrectSigFig); + assertTrue(incorrectSigFig, "Expected incorrect sig fig for " + number + " @ " + sigFig + "sf"); } } } diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAssociationManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAssociationManagerTest.java index 5f144f0bd1..337f448086 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAssociationManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/api/managers/UserAssociationManagerTest.java @@ -386,8 +386,8 @@ public final void userAssociationManager_TokenMustBeSixCharactersAndRandom() // These characters are allowed to be blank! continue; } - assertFalse("Token letter distribution not random; expected " + expectedAvg + " occurrences, found " + occurrences[x][y] + "!", - (occurrences[x][y] > expectedAvg + allowedDelta) || (occurrences[x][y] < expectedAvg - allowedDelta)); + assertFalse((occurrences[x][y] > expectedAvg + allowedDelta) || (occurrences[x][y] < expectedAvg - allowedDelta), + "Token letter distribution not random; expected " + expectedAvg + " occurrences, found " + occurrences[x][y] + "!"); } } } diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/util/PostCodeLocationResolverTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/util/PostCodeLocationResolverTest.java index 90f0bff756..8e2e2365f4 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/util/PostCodeLocationResolverTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/util/PostCodeLocationResolverTest.java @@ -23,8 +23,6 @@ import java.util.List; import java.util.Map; -import junit.framework.Assert; - import org.easymock.EasyMock; import com.google.api.client.util.Maps; @@ -40,6 +38,10 @@ import uk.ac.cam.cl.dtg.util.locations.PostCodeIOLocationResolver; import uk.ac.cam.cl.dtg.util.locations.PostCodeRadius; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + /** * Test suite to check that the use of the 3rd party service postcodes.io * @@ -100,11 +102,11 @@ public void filterPostcodesWithinProximityOfPostcode_passingCorrectPostCodesOfKn List ids = resolver.filterPostcodesWithinProximityOfPostcode(map, "BD175TT", PostCodeRadius.TWENTY_FIVE_MILES); System.out.println(ids.toString()); - Assert.assertTrue(ids.contains(5l)); + assertTrue(ids.contains(5l)); } catch (LocationServerException e) { - Assert.fail(); + fail(); } catch (SegueDatabaseException e) { - Assert.fail(); + fail(); } } @@ -127,9 +129,9 @@ public void filterPostcodesWithinProximityOfPostcode_passingGoodPostCodesOutOfPr List ids = resolver.filterPostcodesWithinProximityOfPostcode(map, "CB237AN", PostCodeRadius.FIFTY_MILES); System.out.println(ids.toString()); - Assert.assertTrue(ids.size() == 1); + assertEquals(1, ids.size()); } catch (LocationServerException | SegueDatabaseException e) { - Assert.fail(); + fail(); } } @@ -151,10 +153,10 @@ public void filterPostcodesWithinProximityOfPostcode_passingBadPostCodes_ExpectE try { List ids = resolver.filterPostcodesWithinProximityOfPostcode(map, "BD175TT", PostCodeRadius.TWENTY_FIVE_MILES); - Assert.assertTrue(ids.isEmpty()); + assertTrue(ids.isEmpty()); System.out.println(ids.toString()); } catch (LocationServerException | SegueDatabaseException e) { - Assert.fail(); + fail(); } } @@ -165,10 +167,10 @@ public void filterPostcodesWithinProximityOfPostcode_passingEmptyMap_ExpectEmpty try { List ids = resolver.filterPostcodesWithinProximityOfPostcode(map, "BD175TT", PostCodeRadius.TWENTY_FIVE_MILES); - Assert.assertTrue(ids.isEmpty()); + assertTrue(ids.isEmpty()); System.out.println(ids.toString()); } catch (LocationServerException | SegueDatabaseException e) { - Assert.fail(); + fail(); } } @@ -189,7 +191,7 @@ public void filterPostcodesWithinProximityOfPostcode_passingBadTargetPostCode_Ex try { resolver.filterPostcodesWithinProximityOfPostcode(map, "46346364", PostCodeRadius.TWENTY_FIVE_MILES); - Assert.fail(); + fail(); } catch (LocationServerException | SegueDatabaseException e) { System.out.println(e.getMessage()); } @@ -200,7 +202,7 @@ public void filterPostcodesWithinProximityOfPostcode_passingBadArguments_ExpectE try { resolver.filterPostcodesWithinProximityOfPostcode(null, "", null); - Assert.fail(); + fail(); } catch (LocationServerException | SegueDatabaseException e) { System.out.println(e.getMessage()); } @@ -223,10 +225,10 @@ public void filterPostcodesWithinProximityOfPostcode_passingPostCodesWithRandomS try { List ids = resolver.filterPostcodesWithinProximityOfPostcode(map, "CB237AN", PostCodeRadius.TWENTY_FIVE_MILES); - Assert.assertTrue(ids.contains(2l)); + assertTrue(ids.contains(2l)); } catch (LocationServerException | SegueDatabaseException e) { System.out.println(e.getMessage()); - Assert.fail(); + fail(); } } diff --git a/src/test/java/uk/ac/cam/cl/dtg/util/YamlLoaderTest.java b/src/test/java/uk/ac/cam/cl/dtg/util/YamlLoaderTest.java index 6319ec655c..41b6616c4b 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/util/YamlLoaderTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/util/YamlLoaderTest.java @@ -10,7 +10,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import static junit.framework.TestCase.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; public class YamlLoaderTest { @Test From 08b58fec9c46e77ba2f9c73ca85a91e293e15e70 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Tue, 24 Feb 2026 14:32:07 +0000 Subject: [PATCH 26/38] Remove hamcrest methods The same functionality can now be achieved with just JUnit 5. --- .../java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java index b4f9e18700..b136c37f4a 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuestionFacadeTest.java @@ -42,9 +42,8 @@ import static org.easymock.EasyMock.createNiceMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; -import static org.hamcrest.CoreMatchers.instanceOf; -import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertThrows; import static uk.ac.cam.cl.dtg.segue.api.Constants.*; @@ -190,7 +189,7 @@ public final void assertUserCanAnswerLLMQuestions_ConsentingUser_ShouldReturnOka RegisteredUserDTO outUser = questionFacade.assertUserCanAnswerLLMQuestions(adminUser); // Assert - assertThat(outUser, instanceOf(RegisteredUserDTO.class)); + assertInstanceOf(RegisteredUserDTO.class, outUser); assertEquals(adminUser.getId(), outUser.getId()); } } From 3740ab47847ab38245cd06a3961c2bb49f56aa15 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Tue, 24 Feb 2026 17:37:57 +0000 Subject: [PATCH 27/38] Refactor DnD validator tests Primarily to use JUnit 5. Also correct some spelling, stricten some access modifiers, close a test appender, remove some 'var's, and fix some checkstyle issues. --- .../dtg/isaac/quiz/IsaacDndValidatorTest.java | 661 ++++++++---------- 1 file changed, 308 insertions(+), 353 deletions(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacDndValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacDndValidatorTest.java index 51bba2929a..fd3fd269b9 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacDndValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacDndValidatorTest.java @@ -18,10 +18,9 @@ import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.Logger; -import org.junit.experimental.theories.DataPoints; -import org.junit.experimental.theories.Theories; -import org.junit.experimental.theories.Theory; -import org.junit.runner.RunWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import uk.ac.cam.cl.dtg.isaac.api.Constants; import uk.ac.cam.cl.dtg.isaac.api.TestAppender; import uk.ac.cam.cl.dtg.isaac.dos.DndValidationResponse; @@ -52,8 +51,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -@RunWith(Theories.class) -@SuppressWarnings("checkstyle:MissingJavadocType") + public class IsaacDndValidatorTest { public static final Item item_3cm = item("6d3d", "3 cm"); public static final Item item_4cm = item("6d3e", "4 cm"); @@ -62,146 +60,285 @@ public class IsaacDndValidatorTest { public static final Item item_12cm = item("6d3h", "12 cm"); public static final Item item_13cm = item("6d3i", "13 cm"); - @DataPoints - public static CorrectnessTestCase[] correctnessTestCases = { - new CorrectnessTestCase().setTitle("singleCorrectMatch_Correct") - .setQuestion(correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"), item(item_5cm, "hypothenuse"))) - .setAnswer(choice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"), item(item_5cm, "hypothenuse"))) - .expectCorrect(true), - - new CorrectnessTestCase().setTitle("singleCorrectNotMatch_Incorrect") - .setQuestion(correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"), item(item_5cm, "hypothenuse"))) - .setAnswer(choice(item(item_4cm, "leg_1"), item(item_5cm, "leg_2"), item(item_3cm, "hypothenuse"))) - .expectCorrect(false), - - new CorrectnessTestCase().setTitle("singleCorrectPartialMatch_Incorrect") - .setQuestion(correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"), item(item_5cm, "hypothenuse"))) - .setAnswer(choice(item(item_5cm, "leg_1"), item(item_4cm, "leg_2"), item(item_3cm, "hypothenuse"))) - .expectCorrect(false), - - new CorrectnessTestCase().setTitle("sameAnswerCorrectAndIncorrect_Correct") - .setChildren(List.of(new Content("[drop-zone:leg_1]"))) - .setQuestion(incorrectChoice(item(item_3cm, "leg_1")), correctChoice(item(item_3cm, "leg_1"))) - .setAnswer(choice(item(item_3cm, "leg_1"))) - .expectCorrect(true) - }; - - @Theory + + private static Stream correctnessTestCases() { + return Stream.of( + new CorrectnessTestCase().setTitle("singleCorrectMatch_Correct") + .setQuestion(correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"), item(item_5cm, "hypothenuse"))) + .setAnswer(choice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"), item(item_5cm, "hypothenuse"))) + .expectCorrect(true), + + new CorrectnessTestCase().setTitle("singleCorrectNotMatch_Incorrect") + .setQuestion(correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"), item(item_5cm, "hypothenuse"))) + .setAnswer(choice(item(item_4cm, "leg_1"), item(item_5cm, "leg_2"), item(item_3cm, "hypothenuse"))) + .expectCorrect(false), + + new CorrectnessTestCase().setTitle("singleCorrectPartialMatch_Incorrect") + .setQuestion(correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"), item(item_5cm, "hypothenuse"))) + .setAnswer(choice(item(item_5cm, "leg_1"), item(item_4cm, "leg_2"), item(item_3cm, "hypothenuse"))) + .expectCorrect(false), + + new CorrectnessTestCase().setTitle("sameAnswerCorrectAndIncorrect_Correct") + .setChildren(List.of(new Content("[drop-zone:leg_1]"))) + .setQuestion(incorrectChoice(item(item_3cm, "leg_1")), correctChoice(item(item_3cm, "leg_1"))) + .setAnswer(choice(item(item_3cm, "leg_1"))) + .expectCorrect(true) + ).map(Arguments::of); + } + + private static Stream explanationTestCases() { + return Stream.of( + new ExplanationTestCase().setTitle("exactMatchIncorrect_shouldReturnMatching") + .setChildren(List.of(new Content("[drop-zone:leg_1]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1")), + incorrectChoice(ExplanationTestCase.testFeedback, item(item_4cm, "leg_1"))) + .setAnswer(choice(item(item_4cm, "leg_1"))) + .expectCorrect(false).expectExplanation(ExplanationTestCase.testFeedback.getValue()), + + new ExplanationTestCase().setTitle("exactMatchCorrect_shouldReturnMatching") + .setChildren(List.of(new Content("[drop-zone:leg_1]"))) + .setQuestion(correctChoice(ExplanationTestCase.testFeedback, item(item_3cm, "leg_1"))) + .setAnswer(choice(item(item_3cm, "leg_1"))) + .expectCorrect(true).expectExplanation(ExplanationTestCase.testFeedback.getValue()), + + new ExplanationTestCase().setTitle("exactMatchIncorrect_shouldReturnDefaultFeedbackForQuestion") + .setChildren(List.of(new Content("[drop-zone:leg_1]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1")), + incorrectChoice(item(item_4cm, "leg_1"))) + .tapQuestion(q -> q.setDefaultFeedback(ExplanationTestCase.testFeedback)) + .setAnswer(choice(item(item_4cm, "leg_1"))) + .expectCorrect(false).expectExplanation(ExplanationTestCase.testFeedback.getValue()), + + new ExplanationTestCase().setTitle("matchIncorrectSubset_shouldReturnMatching") + .setChildren(List.of(new Content("[drop-zone:leg_1] [drop-zone:leg_2]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2")), + incorrectChoice(ExplanationTestCase.testFeedback, item(item_5cm, "leg_1"))) + .setAnswer(choice(item(item_5cm, "leg_1"), item(item_6cm, "leg_2"))) + .expectCorrect(false).expectExplanation(ExplanationTestCase.testFeedback.getValue()), + + new ExplanationTestCase().setTitle("multiMatchIncorrectSubset_shouldReturnMatching") + .setChildren(List.of(new Content("[drop-zone:leg_1] [drop-zone:leg_2]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2")), + incorrectChoice(new Content("leg_1 can't be 5"), item(item_5cm, "leg_1")), + incorrectChoice(new Content("leg_2 can't be 6"), item(item_6cm, "leg_2"))) + .setAnswer(choice(item(item_5cm, "leg_1"), item(item_6cm, "leg_2"))) + .expectCorrect(false).expectExplanation("leg_1 can't be 5"), + + new ExplanationTestCase().setTitle("unMatchedIncorrect_shouldReturnDefaultFeedbackForQuestion") + .setChildren(List.of(new Content("[drop-zone:leg_1]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1"))) + .tapQuestion(q -> q.setDefaultFeedback(new Content("default feedback for question"))) + .setAnswer(choice(item(item_4cm, "leg_1"))) + .expectCorrect(false).expectExplanation("default feedback for question"), + + new ExplanationTestCase().setTitle("partialMatchIncorrect_shouldReturnDefaultFeedbackForQuestion") + .setChildren(List.of(new Content("[drop-zone:leg_1] [drop-zone:leg_2]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2")), + incorrectChoice(new Content("feedback for choice"), item(item_5cm, "leg_1"), item(item_6cm, "leg_2"))) + .tapQuestion(q -> q.setDefaultFeedback(new Content("default feedback for question"))) + .setAnswer(choice(item(item_5cm, "leg_1"), item(item_12cm, "leg_2"))) + .expectCorrect(false).expectExplanation("default feedback for question"), + + new ExplanationTestCase().setTitle("matchedCorrectWithDefaultFeedback_shouldReturnDefaultFeedback") + .setChildren(List.of(new Content("[drop-zone:leg_1]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1"))) + .tapQuestion(q -> q.setDefaultFeedback(new Content("default feedback for question"))) + .setAnswer(choice(item(item_3cm, "leg_1"))) + .expectExplanation("default feedback for question").expectCorrect(true), + + new ExplanationTestCase().setTitle("matchedCorrectNoDefaultFeedback_shouldReturnNone") + .setChildren(List.of(new Content("[drop-zone:leg_1]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1"))) + .setAnswer(choice(item(item_3cm, "leg_1"))) + .expectNoExplanation().expectCorrect(true), + + new ExplanationTestCase().setTitle("noDefaultIncorrect_shouldReturnNone") + .setChildren(List.of(new Content("[drop-zone:leg_1]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1"))) + .setAnswer(choice(item(item_4cm, "leg_1"))) + .expectNoExplanation().expectCorrect(false), + + // these highlight inconsistent behaviour when a question violates our requirements for drop zones + new ExplanationTestCase().setTitle("unrecognisedDropZone_shouldReturnNone") + .setChildren(List.of(new Content("[drop-zone:leg_1]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1"))) + .setAnswer(choice(item(item_3cm, "leg_2"))) + .expectNoExplanation().expectCorrect(false), + + new ExplanationTestCase().setTitle("correctAnswerHasUnusedDropZones_notAcceptedCorrect") + .setChildren(List.of(new Content("[drop-zone:leg_1] [drop-zone:leg_2]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1")), + correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"))) + .setAnswer(choice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"))) + .expectCorrect(false) + .expectExplanation("The question is invalid, because it has an answer with more items than we have gaps.") + .expectNoDropZones() + ).map(Arguments::of); + } + + private static Stream dropZonesCorrectTestCases() { + Supplier disabledItemFeedbackNoDropZones = () -> new DropZonesTestCase() + .tapQuestion(q -> q.setDetailedItemFeedback(false)).expectNoDropZones(); + Supplier enabledItemFeedback = () -> new DropZonesTestCase() + .tapQuestion(q -> q.setDetailedItemFeedback(true)); + + return Stream.of( + disabledItemFeedbackNoDropZones.get().setTitle("incorrectNotRequested_NotReturned") + .setChildren(List.of(new Content("[drop-zone:leg_1]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1"))) + .setAnswer(choice(item(item_4cm, "leg_1"))).expectCorrect(false), + + disabledItemFeedbackNoDropZones.get().setTitle("correctNotRequested_NotReturned") + .setChildren(List.of(new Content("[drop-zone:leg_1]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1"))) + .setAnswer(choice(item(item_3cm, "leg_1"))).expectCorrect(true), + + enabledItemFeedback.get().setTitle("allCorrect_ShouldReturnAllCorrect") + .setQuestion(correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"), item(item_5cm, "hypothenuse"))) + .setAnswer(choice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"), item(item_5cm, "hypothenuse"))) + .expectCorrect(true).expectDropZonesCorrect(d -> d.setLeg1(true).setLeg2(true).setHypothenuse(true)), + + enabledItemFeedback.get().setTitle("someIncorrect_ShouldReturnWhetherCorrect") + .setQuestion(correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"), item(item_5cm, "hypothenuse"))) + .setAnswer(choice(item(item_6cm, "leg_1"), item(item_5cm, "leg_2"), item(item_5cm, "hypothenuse"))) + .expectCorrect(false).expectDropZonesCorrect(d -> d.setLeg1(false).setLeg2(false).setHypothenuse(true)), + + enabledItemFeedback.get().setTitle("multipleCorrectAnswers_decidesCorrectnessBasedOnClosestMatch") + .setQuestion(correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"), item(item_5cm, "hypothenuse")), + correctChoice(item(item_5cm, "leg_1"), item(item_12cm, "leg_2"), item(item_13cm, "hypothenuse"))) + .setAnswer(choice(item(item_5cm, "leg_1"))) + .expectCorrect(false).expectDropZonesCorrect(d -> d.setLeg1(true)), + + // these highlight inconsistent behaviour when a question violates our requirements for drop zones + enabledItemFeedback.get().setTitle("unrecognisedDropZone_treatsItAsAnyWrongAnswer") + .setChildren(List.of(new Content("[drop-zone:leg_1]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1"))) + .setAnswer(choice(item(item_3cm, "leg_2"))) + .expectCorrect(false).expectDropZonesCorrect(d -> d.setLeg2(false)), + + enabledItemFeedback.get().setTitle("correctAnswerHasUnusedDropZones_acceptedCorrect") + .setChildren(List.of(new Content("[drop-zone:leg_1] [drop-zone:leg_2]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1"))) + .setAnswer(choice(item(item_3cm, "leg_1"))) + .expectCorrect(true).expectDropZonesCorrect(d -> d.setLeg1(true)) + ).map(Arguments::of); + } + + private static Stream answerValidationTestCases() { + return Stream.of( + new AnswerValidationTestCase().setTitle("itemsNull") + .setAnswer(choice()) + .expectExplanation("You provided an empty answer."), + + new AnswerValidationTestCase().setTitle("itemsEmpty") + .setAnswer(new DndChoice()) + .expectExplanation("You provided an empty answer."), + + new AnswerValidationTestCase().setTitle("itemsNotEnough") + .setChildren(List.of(new Content("[drop-zone:leg_1] [drop-zone:leg_2]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"))) + .setAnswer(choice(item(item_3cm, "leg_1"))) + .expectExplanation(IsaacDndValidator.FEEDBACK_ANSWER_NOT_ENOUGH) + .expectDropZonesCorrect(f -> f.setLeg1(true)), + + new AnswerValidationTestCase().setTitle("itemsTooMany") + .setChildren(List.of(new Content("[drop-zone:leg_1]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1"))) + .setAnswer(choice(item(item_3cm, "leg_1"), item(item_4cm, "leg_1"))) + .expectExplanation("You provided an answer with more items than we have gaps."), + + new AnswerValidationTestCase().setTitle("itemNotOnQuestion") + .setChildren(List.of(new Content("[drop-zone:leg_1]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1"))) + .setAnswer(choice(item(new Item("bad_id", "some_value"), "leg_1"))) + .expectExplanation("You provided an answer with unrecognised items."), + + new AnswerValidationTestCase().setTitle("itemMissingId") + .setChildren(List.of(new Content("[drop-zone:leg_1]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1"))) + .setAnswer(choice(item(new Item(null, null), "leg_1"))) + .expectExplanation("You provided an answer in an unrecognised format."), + + new AnswerValidationTestCase().setTitle("itemMissingDropZoneId") + .setChildren(List.of(new Content("[drop-zone:leg_1]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1"))) + .setAnswer(choice(item(item_3cm, null))) + .expectExplanation("You provided an answer in an unrecognised format."), + + new AnswerValidationTestCase().setTitle("itemsNotEnough_providesSpecificExplanationFirst") + .setQuestion(correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"), item(item_5cm, "hypothenuse")), + incorrectChoice(new Content("Leg 1 should be less than 4 cm"), item(item_4cm, "leg_1"))) + .setAnswer(choice(item(item_4cm, "leg_1"))).expectExplanation("Leg 1 should be less than 4 cm") + .expectDropZonesCorrect(f -> f.setLeg1(false)) + ).map(Arguments::of); + } + + private static Stream questionValidationTestCases() { + Supplier itemUnrecognisedFormatCase = () -> new QuestionValidationTestCase() + .expectExplLog("The question is invalid, because it has an answer in an unrecognised format."); + Supplier noAnswersTestCase = () -> new QuestionValidationTestCase() + .expectExplLog(IsaacDndValidator.FEEDBACK_QUESTION_NO_ANSWERS); + Supplier noCorrectAnswersTestCase = () -> new QuestionValidationTestCase() + .expectExplLog(Constants.FEEDBACK_NO_CORRECT_ANSWERS); + + return Stream.of( + noAnswersTestCase.get().setTitle("answersEmpty") + .setQuestion(q -> q.setChoices(List.of())), + noAnswersTestCase.get().setTitle("answersNull") + .setQuestion(q -> q.setChoices(null)), + noCorrectAnswersTestCase.get().setTitle("answersAllIncorrect") + .setQuestion(incorrectChoice(item(item_3cm, "leg_1"))), + noCorrectAnswersTestCase.get().setTitle("answerNoExplicitCorrectness_Incorrect") + .setQuestion(choice(item(item_3cm, "leg_1"))), + new QuestionValidationTestCase().setTitle("answerWrongType") + .setQuestion(q -> q.setChoices(List.of(parsonsChoice()))) + .expectExplLog(IsaacDndValidator.FEEDBACK_QUESTION_INVALID_ANS), + new QuestionValidationTestCase().setTitle("answerItemsEmpty") + .setQuestion(correctChoice()) + .expectExplLog("The question is invalid, because it has an empty answer."), + new QuestionValidationTestCase().setTitle("answerItemsNull") + .setQuestion(q -> q.setChoices(Stream.of(new DndChoice()).peek(c -> c.setCorrect(true)).collect(Collectors.toList()))) + .expectExplLog("The question is invalid, because it has an empty answer."), + new QuestionValidationTestCase().setTitle("answerItemNonDnd") + .setQuestion(correctChoice(new DndItemEx("id", "value", "dropZoneId"))) + .expectExplLog("The question is invalid, because it has an invalid answer."), + itemUnrecognisedFormatCase.get().setTitle("answerItemMissingItemId") + .setQuestion(correctChoice(new DndItem(null, "value", "dropZoneId"))), + itemUnrecognisedFormatCase.get().setTitle("answerItemEmptyItemId") + .setQuestion(correctChoice(new DndItem("", "value", "dropZoneId"))), + itemUnrecognisedFormatCase.get().setTitle("answerItemMissingDropZoneId") + .setQuestion(correctChoice(new DndItem("item_id", "value", null))), + itemUnrecognisedFormatCase.get().setTitle("answerItemEmptyDropZoneId") + .setQuestion(correctChoice(new DndItem("item_id", "value", ""))), + new QuestionValidationTestCase().setTitle("itemsNull") + .tapQuestion(q -> q.setItems(null)) + .expectExplLog(IsaacDndValidator.FEEDBACK_QUESTION_MISSING_ITEMS), + new QuestionValidationTestCase().setTitle("itemsEmpty") + .tapQuestion(q -> q.setItems(List.of())) + .expectExplLog(IsaacDndValidator.FEEDBACK_QUESTION_MISSING_ITEMS), + new QuestionValidationTestCase().setTitle("answerInvalidItemReference") + .setChildren(List.of(new Content("[drop-zone:leg_1]"))) + .setQuestion(correctChoice(new DndItem("invalid_id", "some_value", "leg_1"))) + .expectExplLog("The question is invalid, because it has an answer with unrecognised items."), + new QuestionValidationTestCase().setTitle("answerDuplicateDropZones") + .setChildren(List.of(new Content("[drop-zone:leg_1] [drop-zone:leg_2]"))) + .setQuestion(correctChoice(item(item_3cm, "leg_1"), item(item_3cm, "leg_1"))) + .expectExplLog("The question is invalid, because it has an answer with duplicate drop zones.") + ).map(Arguments::of); + } + + @ParameterizedTest + @MethodSource("correctnessTestCases") public final void testCorrectness(final CorrectnessTestCase testCase) { - var response = testValidate(testCase.question, testCase.answer); + DndValidationResponse response = testValidate(testCase.question, testCase.answer); assertEquals(testCase.correct, response.isCorrect()); } - @DataPoints - public static ExplanationTestCase[] explanationTestCases = { - new ExplanationTestCase().setTitle("exactMatchIncorrect_shouldReturnMatching") - .setChildren(List.of(new Content("[drop-zone:leg_1]"))) - .setQuestion( - correctChoice(item(item_3cm, "leg_1")), - incorrectChoice(ExplanationTestCase.testFeedback, item(item_4cm, "leg_1")) - ).setAnswer(choice(item(item_4cm, "leg_1"))) - .expectCorrect(false) - .expectExplanation(ExplanationTestCase.testFeedback.getValue()), - - new ExplanationTestCase().setTitle("exactMatchCorrect_shouldReturnMatching") - .setChildren(List.of(new Content("[drop-zone:leg_1]"))) - .setQuestion(correctChoice(ExplanationTestCase.testFeedback, item(item_3cm, "leg_1"))) - .setAnswer(choice(item(item_3cm, "leg_1"))) - .expectCorrect(true) - .expectExplanation(ExplanationTestCase.testFeedback.getValue()), - - new ExplanationTestCase().setTitle("exactMatchIncorrect_shouldReturnDefaultFeedbackForQuestion") - .setChildren(List.of(new Content("[drop-zone:leg_1]"))) - .setQuestion(correctChoice(item(item_3cm, "leg_1")), incorrectChoice(item(item_4cm, "leg_1"))) - .tapQuestion(q -> q.setDefaultFeedback(ExplanationTestCase.testFeedback)) - .setAnswer(choice(item(item_4cm, "leg_1"))) - .expectCorrect(false) - .expectExplanation(ExplanationTestCase.testFeedback.getValue()), - - new ExplanationTestCase().setTitle("matchIncorrectSubset_shouldReturnMatching") - .setChildren(List.of(new Content("[drop-zone:leg_1] [drop-zone:leg_2]"))) - .setQuestion( - correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2")), - incorrectChoice(ExplanationTestCase.testFeedback, item(item_5cm, "leg_1")) - ).setAnswer(choice(item(item_5cm, "leg_1"), item(item_6cm, "leg_2"))) - .expectCorrect(false) - .expectExplanation(ExplanationTestCase.testFeedback.getValue()), - - new ExplanationTestCase().setTitle("multiMatchIncorrectSubset_shouldReturnMatching") - .setChildren(List.of(new Content("[drop-zone:leg_1] [drop-zone:leg_2]"))) - .setQuestion( - correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2")), - incorrectChoice(new Content("leg_1 can't be 5"), item(item_5cm, "leg_1")), - incorrectChoice(new Content("leg_2 can't be 6"), item(item_6cm, "leg_2")) - ).setAnswer(choice(item(item_5cm, "leg_1"), item(item_6cm, "leg_2"))) - .expectCorrect(false) - .expectExplanation("leg_1 can't be 5"), - - new ExplanationTestCase().setTitle("unMatchedIncorrect_shouldReturnDefaultFeedbackForQuestion") - .setChildren(List.of(new Content("[drop-zone:leg_1]"))) - .setQuestion(correctChoice(item(item_3cm, "leg_1"))) - .tapQuestion(q -> q.setDefaultFeedback(new Content("default feedback for question"))) - .setAnswer(choice(item(item_4cm, "leg_1"))) - .expectCorrect(false) - .expectExplanation("default feedback for question"), - - new ExplanationTestCase().setTitle("partialMatchIncorrect_shouldReturnDefaultFeedbackForQuestion") - .setChildren(List.of(new Content("[drop-zone:leg_1] [drop-zone:leg_2]"))) - .setQuestion( - correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2")), - incorrectChoice(new Content("feedback for choice"), item(item_5cm, "leg_1"), item(item_6cm, "leg_2")) - ).tapQuestion(q -> q.setDefaultFeedback(new Content("default feedback for question"))) - .setAnswer(choice(item(item_5cm, "leg_1"), item(item_12cm, "leg_2"))) - .expectCorrect(false) - .expectExplanation("default feedback for question"), - - new ExplanationTestCase().setTitle("matchedCorrectWithDefaultFeedback_shouldReturnDefaultFeedback") - .setChildren(List.of(new Content("[drop-zone:leg_1]"))) - .setQuestion(correctChoice(item(item_3cm, "leg_1"))) - .tapQuestion(q -> q.setDefaultFeedback(new Content("default feedback for question"))) - .setAnswer(choice(item(item_3cm, "leg_1"))) - .expectExplanation("default feedback for question") - .expectCorrect(true), - - new ExplanationTestCase().setTitle("matchedCorrectNoDefaultFeedback_shouldReturnNone") - .setChildren(List.of(new Content("[drop-zone:leg_1]"))) - .setQuestion(correctChoice(item(item_3cm, "leg_1"))) - .setAnswer(choice(item(item_3cm, "leg_1"))) - .expectNoExplanation() - .expectCorrect(true), - - new ExplanationTestCase().setTitle("noDefaultIncorrect_shouldReturnNone") - .setChildren(List.of(new Content("[drop-zone:leg_1]"))) - .setQuestion(correctChoice(item(item_3cm, "leg_1"))) - .setAnswer(choice(item(item_4cm, "leg_1"))) - .expectNoExplanation() - .expectCorrect(false), - - // these highlight inconsistent behaviour when a question violates our requirements for drop zones - new ExplanationTestCase().setTitle("unrecognisedDropZone_shouldReturnNone") - .setChildren(List.of(new Content("[drop-zone:leg_1]"))) - .setQuestion(correctChoice(item(item_3cm, "leg_1"))) - .setAnswer(choice(item(item_3cm, "leg_2"))) - .expectNoExplanation() - .expectCorrect(false), - - new ExplanationTestCase().setTitle("correctAnswerHasUnusedDropZones_notAcceptedCorrect") - .setChildren(List.of(new Content("[drop-zone:leg_1] [drop-zone:leg_2]"))) - .setQuestion( - correctChoice(item(item_3cm, "leg_1")), - correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2")) - ).setAnswer(choice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"))) - .expectCorrect(false) - .expectExplanation("The question is invalid, because it has an answer with more items than we have gaps.") - .expectNoDropZones() - }; - - - @SuppressWarnings("checkstyle:MissingJavadocMethod") - @Theory + @ParameterizedTest + @MethodSource("explanationTestCases") public final void testExplanation(final ExplanationTestCase testCase) { - var response = testValidate(testCase.question, testCase.answer); - assertEquals(response.isCorrect(), testCase.correct); + DndValidationResponse response = testValidate(testCase.question, testCase.answer); + assertEquals(testCase.correct, response.isCorrect()); if (testCase.feedback != null) { assertNotNull(response.getExplanation()); assertEquals(testCase.feedback.getValue(), response.getExplanation().getValue()); @@ -210,223 +347,48 @@ public final void testExplanation(final ExplanationTestCase testCase) { } } - static Supplier disabledItemFeedbackNoDropZones = () -> new DropZonesTestCase() - .tapQuestion(q -> q.setDetailedItemFeedback(false)) - .expectNoDropZones(); - - static Supplier enabledItemFeedback = () -> new DropZonesTestCase() - .tapQuestion(q -> q.setDetailedItemFeedback(true)); - - @DataPoints - public static DropZonesTestCase[] dropZonesCorrectTestCases = { - disabledItemFeedbackNoDropZones.get().setTitle("incorrectNotRequestsed_NotReturned") - .setChildren(List.of(new Content("[drop-zone:leg_1]"))) - .setQuestion(correctChoice(item(item_3cm, "leg_1"))) - .setAnswer(choice(item(item_4cm, "leg_1"))) - .expectCorrect(false), - - disabledItemFeedbackNoDropZones.get().setTitle("correctNotRequested_NotReturned") - .setChildren(List.of(new Content("[drop-zone:leg_1]"))) - .setQuestion(correctChoice(item(item_3cm, "leg_1"))) - .setAnswer(choice(item(item_3cm, "leg_1"))) - .expectCorrect(true), - - enabledItemFeedback.get().setTitle("allCorrect_ShouldReturnAllCorrect") - .setQuestion(correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"), item(item_5cm, "hypothenuse"))) - .setAnswer(choice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"), item(item_5cm, "hypothenuse"))) - .expectCorrect(true) - .expectDropZonesCorrect(d -> d.setLeg1(true).setLeg2(true).setHypothenuse(true)), - - enabledItemFeedback.get().setTitle("someIncorrect_ShouldReturnWhetherCorrect") - .setQuestion(correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"), item(item_5cm, "hypothenuse"))) - .setAnswer(choice(item(item_6cm, "leg_1"), item(item_5cm, "leg_2"), item(item_5cm, "hypothenuse"))) - .expectCorrect(false) - .expectDropZonesCorrect(d -> d.setLeg1(false).setLeg2(false).setHypothenuse(true)), - - enabledItemFeedback.get().setTitle("multipleCorrectAnswers_decidesCorrectnessBasedOnClosesMatch") - .setQuestion( - correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"), item(item_5cm, "hypothenuse")), - correctChoice(item(item_5cm, "leg_1"), item(item_12cm, "leg_2"), item(item_13cm, "hypothenuse")) - ).setAnswer(choice(item(item_5cm, "leg_1"))) - .expectCorrect(false) - .expectDropZonesCorrect(d -> d.setLeg1(true)), - - // these highlight inconsistent behaviour when a question violates our requirements for drop zones - enabledItemFeedback.get().setTitle("unrecognisedDropZone_treatsItAsAnyWrongAnswer") - .setChildren(List.of(new Content("[drop-zone:leg_1]"))) - .setQuestion(correctChoice(item(item_3cm, "leg_1"))) - .setAnswer(choice(item(item_3cm, "leg_2"))) - .expectCorrect(false) - .expectDropZonesCorrect(d -> d.setLeg2(false)), - - enabledItemFeedback.get().setTitle("correctAnswerHasUnusedDropZones_acceptedCorrect") - .setChildren(List.of(new Content("[drop-zone:leg_1] [drop-zone:leg_2]"))) - .setQuestion(correctChoice(item(item_3cm, "leg_1"))) - .setAnswer(choice(item(item_3cm, "leg_1"))) - .expectCorrect(true) - .expectDropZonesCorrect(d -> d.setLeg1(true)), - }; - - @SuppressWarnings("checkstyle:MissingJavadocMethod") - @Theory + @ParameterizedTest + @MethodSource("dropZonesCorrectTestCases") public final void testDropZonesCorrect(final DropZonesTestCase testCase) { - var response = testValidate(testCase.question, testCase.answer); + DndValidationResponse response = testValidate(testCase.question, testCase.answer); assertEquals(testCase.correct, response.isCorrect()); assertEquals(testCase.dropZonesCorrect, response.getDropZonesCorrect()); } - @DataPoints - public static AnswerValidationTestCase[] answerValidationTestCases = { - new AnswerValidationTestCase().setTitle("itemsNull") - .setAnswer(choice()) - .expectExplanation("You provided an empty answer."), - - new AnswerValidationTestCase().setTitle("itemsEmpty") - .setAnswer(new DndChoice()) - .expectExplanation("You provided an empty answer."), - - new AnswerValidationTestCase().setTitle("itemsNotEnough") - .setChildren(List.of(new Content("[drop-zone:leg_1] [drop-zone:leg_2]"))) - .setQuestion(correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"))) - .setAnswer(choice(item(item_3cm, "leg_1"))) - .expectExplanation(IsaacDndValidator.FEEDBACK_ANSWER_NOT_ENOUGH) - .expectDropZonesCorrect(f -> f.setLeg1(true)), - - new AnswerValidationTestCase().setTitle("itemsTooMany") - .setChildren(List.of(new Content("[drop-zone:leg_1]"))) - .setQuestion(correctChoice(item(item_3cm, "leg_1"))) - .setAnswer(choice(item(item_3cm, "leg_1"), item(item_4cm, "leg_1"))) - .expectExplanation("You provided an answer with more items than we have gaps."), - - new AnswerValidationTestCase().setTitle("itemNotOnQuestion") - .setChildren(List.of(new Content("[drop-zone:leg_1]"))) - .setQuestion(correctChoice(item(item_3cm, "leg_1"))) - .setAnswer(choice(item(new Item("bad_id", "some_value"), "leg_1"))) - .expectExplanation("You provided an answer with unrecognised items."), - - new AnswerValidationTestCase().setTitle("itemMissingId") - .setChildren(List.of(new Content("[drop-zone:leg_1]"))) - .setQuestion(correctChoice(item(item_3cm, "leg_1"))) - .setAnswer(choice(item(new Item(null, null), "leg_1"))) - .expectExplanation("You provided an answer in an unrecognised format."), - - new AnswerValidationTestCase().setTitle("itemMissingDropZoneId") - .setChildren(List.of(new Content("[drop-zone:leg_1]"))) - .setQuestion(correctChoice(item(item_3cm, "leg_1"))) - .setAnswer(choice(item(item_3cm, null))) - .expectExplanation("You provided an answer in an unrecognised format."), - - new AnswerValidationTestCase().setTitle("itemsNotEnough_providesSpecificExplanationFirst") - .setQuestion( - correctChoice(item(item_3cm, "leg_1"), item(item_4cm, "leg_2"), item(item_5cm, "hypothenuse")), - incorrectChoice(new Content("Leg 1 should be less than 4 cm"), item(item_4cm, "leg_1")) - ).setAnswer(choice(item(item_4cm, "leg_1"))) - .expectExplanation("Leg 1 should be less than 4 cm") - .expectDropZonesCorrect(f -> f.setLeg1(false)), - }; - - @SuppressWarnings("checkstyle:MissingJavadocMethod") - @Theory + @ParameterizedTest + @MethodSource("answerValidationTestCases") public final void testAnswerValidation(final AnswerValidationTestCase testCase) { testCase.question.setDetailedItemFeedback(true); - var response = testValidate(testCase.question, testCase.answer); + DndValidationResponse response = testValidate(testCase.question, testCase.answer); assertFalse(response.isCorrect()); assertEquals(testCase.feedback.getValue(), response.getExplanation().getValue()); assertEquals(testCase.dropZonesCorrect, response.getDropZonesCorrect()); } - static Supplier itemUnrecognisedFormatCase = () -> new QuestionValidationTestCase() - .expectExplLog("The question is invalid, because it has an answer in an unrecognised format."); - static Supplier noAnswersTestCase = () -> new QuestionValidationTestCase() - .expectExplLog(IsaacDndValidator.FEEDBACK_QUESTION_NO_ANSWERS); - static Supplier noCorrectAnswersTestCase = () -> new QuestionValidationTestCase() - .expectExplLog(Constants.FEEDBACK_NO_CORRECT_ANSWERS); - - - @DataPoints - public static QuestionValidationTestCase[] questionValidationTestCases = { - noAnswersTestCase.get().setTitle("answersEmpty").setQuestion(q -> q.setChoices(List.of())), - - noAnswersTestCase.get().setTitle("answersNull").setQuestion(q -> q.setChoices(null)), - - noCorrectAnswersTestCase.get().setTitle("answersAllIncorrect") - .setQuestion(incorrectChoice(item(item_3cm, "leg_1"))), - - noCorrectAnswersTestCase.get().setTitle("answerNoExplicitCorrectness_Incorrect") - .setQuestion(choice(item(item_3cm, "leg_1"))), - - new QuestionValidationTestCase().setTitle("answerWrongType") - .setQuestion(q -> q.setChoices(List.of(parsonsChoice()))) - .expectExplLog(IsaacDndValidator.FEEDBACK_QUESTION_INVALID_ANS), - - new QuestionValidationTestCase().setTitle("answerItemsEmpty").setQuestion(correctChoice()) - .expectExplLog("The question is invalid, because it has an empty answer."), - - new QuestionValidationTestCase().setTitle("answerItemsNull") - .setQuestion(q -> q.setChoices( - Stream.of(new DndChoice()).peek(c -> c.setCorrect(true)).collect(Collectors.toList()))) - .expectExplLog("The question is invalid, because it has an empty answer."), - - new QuestionValidationTestCase().setTitle("answerItemNonDnd") - .setQuestion(correctChoice(new DndItemEx("id", "value", "dropZoneId"))) - .expectExplLog("The question is invalid, because it has an invalid answer."), - - itemUnrecognisedFormatCase.get().setTitle("answerItemMissingItemId") - .setQuestion(correctChoice(new DndItem(null, "value", "dropZoneId"))), - - itemUnrecognisedFormatCase.get().setTitle("answerItemEmptyItemId") - .setQuestion(correctChoice(new DndItem("", "value", "dropZoneId"))), - - itemUnrecognisedFormatCase.get().setTitle("answerItemMissingDropZoneId") - .setQuestion(correctChoice(new DndItem("item_id", "value", null))), - - itemUnrecognisedFormatCase.get().setTitle("answerItemEmptyDropZoneId") - .setQuestion(correctChoice(new DndItem("item_id", "value", ""))), - - new QuestionValidationTestCase().setTitle("itemsNull") - .tapQuestion(q -> q.setItems(null)) - .expectExplLog(IsaacDndValidator.FEEDBACK_QUESTION_MISSING_ITEMS), - - new QuestionValidationTestCase().setTitle("itemsEmpty") - .tapQuestion(q -> q.setItems(List.of())) - .expectExplLog(IsaacDndValidator.FEEDBACK_QUESTION_MISSING_ITEMS), - - new QuestionValidationTestCase().setTitle("answerInvalidItemReference") - .setChildren(List.of(new Content("[drop-zone:leg_1]"))) - .setQuestion(correctChoice(new DndItem("invalid_id", "some_value", "leg_1"))) - .expectExplLog("The question is invalid, because it has an answer with unrecognised items."), - - new QuestionValidationTestCase().setTitle("answerDuplicateDropZones") - .setChildren(List.of(new Content("[drop-zone:leg_1] [drop-zone:leg_2]"))) - .setQuestion(correctChoice(item(item_3cm, "leg_1"), item(item_3cm, "leg_1"))) - .expectExplLog("The question is invalid, because it has an answer with duplicate drop zones.") - }; - - @SuppressWarnings("checkstyle:MissingJavadocMethod") - @Theory + @ParameterizedTest + @MethodSource("questionValidationTestCases") public final void testQuestionValidation(final QuestionValidationTestCase testCase) { testCase.question.setDetailedItemFeedback(true); - var response = testValidate(testCase.question, testCase.answer); + DndValidationResponse response = testValidate(testCase.question, testCase.answer); assertFalse(response.isCorrect()); assertEquals(testCase.feedback.getValue(), response.getExplanation().getValue()); assertEquals(testCase.dropZonesCorrect, response.getDropZonesCorrect()); - var appender = testValidateWithLogs(testCase.question, testCase.answer); + TestAppender appender = testValidateWithLogs(testCase.question, testCase.answer); appender.assertLevel(Level.ERROR); appender.assertMessage(testCase.loggedMessage); } - private static DndValidationResponse testValidate(final IsaacDndQuestion question, final Choice choice) { return new IsaacDndValidator().validateQuestionResponse(question, choice); } private static TestAppender testValidateWithLogs(final IsaacDndQuestion question, final Choice choice) { - var appender = new TestAppender(); + TestAppender appender = new TestAppender(); Logger logger = (Logger) LogManager.getLogger(IsaacDndValidator.class); logger.addAppender(appender); logger.setLevel(Level.WARN); @@ -435,56 +397,50 @@ private static TestAppender testValidateWithLogs(final IsaacDndQuestion question testValidate(question, choice); return appender; } finally { - logger.removeAppender(new TestAppender()); + logger.removeAppender(appender); } } - @SuppressWarnings("checkstyle:MissingJavadocMethod") public static DndChoice choice(final DndItem... list) { - var c = new DndChoice(); + DndChoice c = new DndChoice(); c.setItems(List.of(list)); c.setType("dndChoice"); return c; } - @SuppressWarnings("checkstyle:MissingJavadocMethod") public static DndChoice correctChoice(final DndItem... list) { - var choice = choice(list); + DndChoice choice = choice(list); choice.setCorrect(true); return choice; } - @SuppressWarnings("checkstyle:MissingJavadocMethod") public static DndChoice correctChoice(final ContentBase explanation, final DndItem... list) { - var choice = correctChoice(list); + DndChoice choice = correctChoice(list); choice.setExplanation(explanation); return choice; } private static DndChoice incorrectChoice(final DndItem... list) { - var choice = choice(list); + DndChoice choice = choice(list); choice.setCorrect(false); return choice; } - @SuppressWarnings("checkstyle:MissingJavadocMethod") public static DndChoice incorrectChoice(final ContentBase explanation, final DndItem... list) { - var choice = incorrectChoice(list); + DndChoice choice = incorrectChoice(list); choice.setExplanation(explanation); return choice; } private static ParsonsChoice parsonsChoice() { - var parsonsChoice = new ParsonsChoice(); + ParsonsChoice parsonsChoice = new ParsonsChoice(); parsonsChoice.setCorrect(true); parsonsChoice.setItems(List.of(new Item("", ""))); return parsonsChoice; } - - @SuppressWarnings("checkstyle:MissingJavadocMethod") public static DndItem item(final Item item, final String dropZoneId) { - var value = new DndItem(item.getId(), item.getValue(), dropZoneId); + DndItem value = new DndItem(item.getId(), item.getValue(), dropZoneId); value.setType("dndItem"); return value; } @@ -495,9 +451,8 @@ private static Item item(final String id, final String value) { return item; } - @SuppressWarnings("checkstyle:MissingJavadocMethod") public static IsaacDndQuestion question(final DndChoice... answers) { - var question = new IsaacDndQuestion(); + IsaacDndQuestion question = new IsaacDndQuestion(); question.setId(UUID.randomUUID().toString()); question.setItems(List.of(item_3cm, item_4cm, item_5cm, item_6cm, item_12cm, item_13cm)); question.setChoices(List.of(answers)); @@ -554,44 +509,44 @@ public T setQuestion(final DndChoice... choices) { this.question = question(choices); return self(); } - + public T setQuestion(final Consumer op) { - var question = question(); + IsaacDndQuestion question = question(); op.accept(question); this.question = question; return self(); } - + public T setChildren(final List content) { this.questionOps.add(q -> q.setChildren(content)); return self(); } - + public T tapQuestion(final Consumer op) { this.questionOps.add(op); return self(); } - + public T setAnswer(final DndChoice answer) { this.answer = answer; return self(); } - + public T expectCorrect(final boolean correct) { this.correct = correct; return self(); } - + public T expectExplanation(final String feedback) { this.feedback = new Content(feedback); return self(); } - + public T expectNoExplanation() { this.feedback = null; return self(); } - + public T expectExplLog(final String feedback) { this.feedback = new Content(feedback); this.logMessageOp = q -> { @@ -663,7 +618,7 @@ public static class ExplanationTestCase extends TestCase {} public static class DropZonesTestCase extends TestCase {} - public static class DndItemEx extends DndItem { + private static class DndItemEx extends DndItem { public DndItemEx(final String id, final String value, final String dropZoneId) { super(id, value, dropZoneId); } From caa45875fdbaf8b16308596748c80672ebf4a63b Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Wed, 25 Feb 2026 09:01:14 +0000 Subject: [PATCH 28/38] Correct exception expectation --- .../cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java index cd3b8295a6..5f766c133b 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/RaspberryPiOidcAuthenticatorTest.java @@ -78,7 +78,7 @@ public void getGivenNameFamilyName_emptyTokenisedNameProvided_returnsSensibleNam @Test public void getGivenNameFamilyName_invalidNicknameProvided_throwsException() { - assertThrows(Exception.class, () -> { + assertThrows(NoUserException.class, () -> { // Arrange String idpNickname = "*"; String idpFullName = "John Smith"; From 0a62dd5532a338bdd1b69a6a6f35cb4d10d8a37f Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Wed, 25 Feb 2026 10:39:58 +0000 Subject: [PATCH 29/38] Fix order of QuizQuestionManagerTest setup The additional objects (correctAnswer, wrongAnswer...) need to be initialised before the mock expectations that rely on them are set. --- .../cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java index 1c5580234c..1ca7f763c3 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizQuestionManagerTest.java @@ -77,6 +77,7 @@ public class QuizQuestionManagerTest extends AbstractManagerTest { @BeforeEach public void setUp() { + initializeAdditionalObjects(); quizQuestionAttemptPersistenceManager = createMock(IQuizQuestionAttemptPersistenceManager.class); questionManager = createMock(QuestionManager.class); MainMapper contentMapper = createMock(MainMapper.class); @@ -95,7 +96,6 @@ public void setUp() { replay(quizQuestionAttemptPersistenceManager, questionManager, contentMapper, quizAttemptManager); } - @BeforeEach public void initializeAdditionalObjects() { correctAnswer = new Choice(); correctAnswerDTO = new ChoiceDTO(); From ad91e128273c582032dd897d9a85866609b82fac Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Wed, 25 Feb 2026 10:50:16 +0000 Subject: [PATCH 30/38] Remove JUnit 4 dependency --- pom.xml | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/pom.xml b/pom.xml index a91f5c55af..3cb555e781 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,6 @@ typo from the maintainers - hopefully we can remove this next update. --> 2.20 2.0.9 - 4.13.2 5.14.1 4.13.2 0.16.0 @@ -202,12 +201,6 @@ swagger-annotations-jakarta ${swagger-core.version} - - junit - junit - ${junit-4.version} - test - org.junit.jupiter junit-jupiter-engine @@ -567,16 +560,6 @@ org.apache.maven.plugins maven-surefire-plugin 3.2.5 - - - - org.apache.maven.surefire - surefire-junit47 - 3.5.4 - - 3 true From 30efb4ffaf0ecf2139c3abc25b3ddfd46d960e30 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Wed, 25 Feb 2026 11:05:02 +0000 Subject: [PATCH 31/38] Use JUnit 5 in IsaacIntegrationTestWithREST and replace some 'var's --- .../api/IsaacIntegrationTestWithREST.java | 49 ++++++++++--------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/IsaacIntegrationTestWithREST.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/IsaacIntegrationTestWithREST.java index f2272c2d5f..4cc911c254 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/IsaacIntegrationTestWithREST.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/IsaacIntegrationTestWithREST.java @@ -6,12 +6,13 @@ import org.eclipse.jetty.servlet.ServletHolder; import org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher; import org.json.JSONObject; -import org.junit.function.ThrowingRunnable; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.function.Executable; import uk.ac.cam.cl.dtg.isaac.dos.users.RegisteredUser; import uk.ac.cam.cl.dtg.isaac.dto.LocalAuthDTO; import uk.ac.cam.cl.dtg.isaac.dto.users.RegisteredUserDTO; +import jakarta.servlet.http.HttpSession; import jakarta.ws.rs.client.Client; import jakarta.ws.rs.client.ClientBuilder; import jakarta.ws.rs.client.Entity; @@ -35,21 +36,21 @@ * interacting with the server. As the server runs in-process, mocking and debugging still work. */ public class IsaacIntegrationTestWithREST extends AbstractIsaacIntegrationTest { - private final HashSet cleanups = new HashSet<>(); + private final Set cleanups = new HashSet<>(); @SuppressWarnings({"checkstyle:EmptyCatchBlock", "checkstyle:MissingJavadocMethod"}) @AfterEach public void doCleanup() { - for (var cleanup : cleanups) { + for (Executable cleanup : cleanups) { try { - cleanup.run(); + cleanup.execute(); } catch (final Throwable ignored) { } } } - public void registerCleanup(final ThrowingRunnable cleanup) { + public void registerCleanup(final Executable cleanup) { this.cleanups.add(cleanup); } @@ -61,10 +62,10 @@ static class TestServer { private String sessionId; private final Server server; private final ServletContextHandler ctx; - private final Consumer registerCleanup; + private final Consumer registerCleanup; private TestServer( - final Server server, final ServletContextHandler ctx, final Consumer registerCleanup + final Server server, final ServletContextHandler ctx, final Consumer registerCleanup ) { this.server = server; this.ctx = ctx; @@ -72,16 +73,16 @@ private TestServer( } public static TestServer start( - final Set facades, final Consumer registerCleanup + final Set facades, final Consumer registerCleanup ) throws Exception { TestApp.facades = facades; - var server = new Server(0); - var ctx = new ServletContextHandler(ServletContextHandler.SESSIONS); + Server server = new Server(0); + ServletContextHandler ctx = new ServletContextHandler(ServletContextHandler.SESSIONS); ctx.setContextPath("/"); server.setHandler(ctx); - var servlet = new ServletHolder(new HttpServletDispatcher()); + ServletHolder servlet = new ServletHolder(new HttpServletDispatcher()); servlet.setInitParameter("jakarta.ws.rs.Application", TestApp.class.getName()); ctx.addServlet(servlet, "/*"); @@ -91,14 +92,14 @@ public static TestServer start( } public TestServer setSessionAttributes(final Map attributes) { - var session = ctx.getSessionHandler().newHttpSession(new Request(null, null)); + HttpSession session = ctx.getSessionHandler().newHttpSession(new Request(null, null)); attributes.keySet().forEach(k -> session.setAttribute(k, attributes.get(k))); sessionId = session.getId(); return this; } public TestClient client() { - var baseUrl = "http://localhost:" + server.getURI().getPort(); + String baseUrl = "http://localhost:" + server.getURI().getPort(); RequestBuilder builder = (null == this.sessionId) ? r -> r : r -> r.cookie("JSESSIONID", sessionId); return new TestClient(baseUrl, registerCleanup, builder); } @@ -115,12 +116,12 @@ public Set getSingletons() { static class TestClient { String baseUrl; - Consumer registerCleanup; + Consumer registerCleanup; RequestBuilder builder; RegisteredUserDTO currentUser; Client client; - TestClient(final String baseUrl, final Consumer registerCleanup, final RequestBuilder builder) { + TestClient(final String baseUrl, final Consumer registerCleanup, final RequestBuilder builder) { this.baseUrl = baseUrl; this.registerCleanup = registerCleanup; this.builder = builder; @@ -128,22 +129,22 @@ static class TestClient { } public TestResponse get(final String url) { - var request = client.target(baseUrl + url).request(MediaType.APPLICATION_JSON); - var response = builder.apply(request).get(); + Invocation.Builder request = client.target(baseUrl + url).request(MediaType.APPLICATION_JSON); + Response response = builder.apply(request).get(); registerCleanup.accept(response::close); return new TestResponse(response); } public TestResponse post(final String url, final Object body) { - var request = client.target(baseUrl + url).request(MediaType.APPLICATION_JSON); - var response = builder.apply(request).post(Entity.json(body)); + Invocation.Builder request = client.target(baseUrl + url).request(MediaType.APPLICATION_JSON); + Response response = builder.apply(request).post(Entity.json(body)); registerCleanup.accept(response::close); return new TestResponse(response); } public TestClient loginAs(final RegisteredUser user) { - var request = client.target(baseUrl + "/auth/SEGUE/authenticate").request(MediaType.APPLICATION_JSON); - var body = new LocalAuthDTO(); + Invocation.Builder request = client.target(baseUrl + "/auth/SEGUE/authenticate").request(MediaType.APPLICATION_JSON); + LocalAuthDTO body = new LocalAuthDTO(); body.setEmail(user.getEmail()); body.setPassword("test1234"); this.currentUser = builder.apply(request).post(Entity.json(body), RegisteredUserDTO.class); @@ -173,9 +174,9 @@ void assertNoUserLoggedIn() { } void assertUserLoggedIn(final Number userId) { - var base64Cookie = this.response.getCookies().get("SEGUE_AUTH_COOKIE").getValue(); - var cookieBytes = java.util.Base64.getDecoder().decode(base64Cookie); - var cookie = new JSONObject(new String(cookieBytes)); + String base64Cookie = this.response.getCookies().get("SEGUE_AUTH_COOKIE").getValue(); + byte[] cookieBytes = java.util.Base64.getDecoder().decode(base64Cookie); + JSONObject cookie = new JSONObject(new String(cookieBytes)); assertEquals(userId, cookie.getLong("id")); } From 558d91930553a7aa256edae051a1e24e3f1dc669 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Wed, 25 Feb 2026 11:28:04 +0000 Subject: [PATCH 32/38] Use JUnit 5 in ContentValidatorUtilsTest and fix some style issues --- .../isaac/util/ContentValidatorUtilsTest.java | 175 +++++++++--------- 1 file changed, 85 insertions(+), 90 deletions(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/util/ContentValidatorUtilsTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/util/ContentValidatorUtilsTest.java index 076b5b9f2e..084d1c7232 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/util/ContentValidatorUtilsTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/util/ContentValidatorUtilsTest.java @@ -1,9 +1,7 @@ package uk.ac.cam.cl.dtg.isaac.util; -import org.junit.experimental.theories.DataPoints; -import org.junit.experimental.theories.Theories; -import org.junit.experimental.theories.Theory; -import org.junit.runner.RunWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import uk.ac.cam.cl.dtg.isaac.dos.content.Content; import uk.ac.cam.cl.dtg.isaac.dos.content.Figure; import uk.ac.cam.cl.dtg.isaac.dos.content.FigureRegion; @@ -13,105 +11,102 @@ import java.util.LinkedList; import java.util.List; import java.util.function.Supplier; +import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertEquals; -@RunWith(Theories.class) @SuppressWarnings("checkstyle:MissingJavadocType") public class ContentValidatorUtilsTest { - static Supplier invalidDropZone = () -> new GetDropZonesTestCase() - .expectDropZones(); - @DataPoints - public static GetDropZonesTestCase[] getDropZonesTestCases = { - invalidDropZone.get().setChildren(List.of(new Content(""))), - - invalidDropZone.get().setChildren(List.of(new Content("no drop zone"))), - - invalidDropZone.get().setChildren(List.of(new Content("[drop-zone A1]"))), - - invalidDropZone.get().setChildren(List.of(new Content("[drop-zone: A1]"))), - - invalidDropZone.get().setChildren(List.of(new Content("[drop-zone:A1 | w-100]"))), - - invalidDropZone.get().setChildren(List.of(new Content("[drop-zone:A1|w-100 h-50]"))), - - invalidDropZone.get().setChildren(List.of(new Content("[drop-zone:A1|h-100w-50]"))), - - new GetDropZonesTestCase().setTitle("noContent_noDropZones").setChildren(null).expectDropZones(), - - new GetDropZonesTestCase().setTitle("singleDropZoneSingleText_returnsDropZone") - .setChildren(List.of(new Content("[drop-zone:A1]"))) - .expectDropZones("A1"), - - new GetDropZonesTestCase().setTitle("singleDropZoneSingleContent_returnsDropZone") - .setChildren(List.of(new Content("[drop-zone:A1|w-100]"))) - .expectDropZones("A1"), - - new GetDropZonesTestCase().setTitle("singleDropZoneSingleContentHeight_returnsDropZone") - .setChildren(List.of(new Content("[drop-zone:A1|h-100]"))) - .expectDropZones("A1"), - - new GetDropZonesTestCase().setTitle("singleDropZoneSingleContentWidthHeight_returnsDropZone") - .setChildren(List.of(new Content("[drop-zone:A1|w-100h-50]"))) - .expectDropZones("A1"), - - new GetDropZonesTestCase().setTitle("singleDropZoneSingleContentWithinLatex_returnsDropZone") - .setChildren(List.of(new Content("$$1 + \\text{[drop-zone:A1]}$$"))) - .expectDropZones("A1"), - - new GetDropZonesTestCase().setTitle("multiDropZoneSingleContent_returnsDropZones") - .setChildren(List.of(new Content("Some text [drop-zone:A1], other text [drop-zone:A2]"))) - .expectDropZones("A1", "A2"), - - new GetDropZonesTestCase().setTitle("multiDropZoneMultiContent_returnsDropZones") - .setChildren(List.of( - new Content("[drop-zone:A1] [drop-zone:A2]"), - new Content("[drop-zone:A3] [drop-zone:A4]") - )).expectDropZones("A1", "A2", "A3", "A4"), - - new GetDropZonesTestCase().setTitle("singleDropZoneNestedContent_returnsDropZones") - .setChildren(new LinkedList<>(List.of(new Content(), new Content("[drop-zone:A2]")))) - .tapQuestion(q -> ((Content) q.getChildren().get(0)).setChildren(List.of(new Content("[drop-zone:A1]")))) - .expectDropZones("A1", "A2"), - - new GetDropZonesTestCase().setTitle("figureContentWithoutDropZones_returnsNoZones") - .setChildren(List.of(new Figure())) - .expectDropZones(), - - new GetDropZonesTestCase().setTitle("figureContent_returnsDropZones") - .setChildren(List.of(createFigure("A1", "A2"))) - .expectDropZones("A1", "A2"), - - new GetDropZonesTestCase().setTitle("mixedButNoNesting_returnsDropZones") - .setChildren(new LinkedList<>(List.of(createFigure("A1", "A2"), new Content("[drop-zone:A3]")))) - .expectDropZones("A1", "A2", "A3"), - - new GetDropZonesTestCase().setTitle("mixedNested_returnsDropZones") - .setChildren(new LinkedList<>(List.of(new Content(), new Content("[drop-zone:A2]")))) - .tapQuestion(q -> { - Content content = (Content) q.getChildren().get(0); - content.setChildren(List.of( - new Content("[drop-zone:A1]"), - createFigure("F1", "F2") - )); - }).expectDropZones("A1", "F1", "F2", "A2") - }; + private static final Supplier invalidDropZone = () -> + new GetDropZonesTestCase().expectDropZones(); + + static Stream getDropZonesTestCases() { + return Stream.of( + invalidDropZone.get().setChildren(List.of(new Content(""))), + invalidDropZone.get().setChildren(List.of(new Content("no drop zone"))), + invalidDropZone.get().setChildren(List.of(new Content("[drop-zone A1]"))), + invalidDropZone.get().setChildren(List.of(new Content("[drop-zone: A1]"))), + invalidDropZone.get().setChildren(List.of(new Content("[drop-zone:A1 | w-100]"))), + invalidDropZone.get().setChildren(List.of(new Content("[drop-zone:A1|w-100 h-50]"))), + invalidDropZone.get().setChildren(List.of(new Content("[drop-zone:A1|h-100w-50]"))), + + new GetDropZonesTestCase().setTitle("noContent_noDropZones").setChildren(null).expectDropZones(), + + new GetDropZonesTestCase().setTitle("singleDropZoneSingleText_returnsDropZone") + .setChildren(List.of(new Content("[drop-zone:A1]"))) + .expectDropZones("A1"), + + new GetDropZonesTestCase().setTitle("singleDropZoneSingleContent_returnsDropZone") + .setChildren(List.of(new Content("[drop-zone:A1|w-100]"))) + .expectDropZones("A1"), + + new GetDropZonesTestCase().setTitle("singleDropZoneSingleContentHeight_returnsDropZone") + .setChildren(List.of(new Content("[drop-zone:A1|h-100]"))) + .expectDropZones("A1"), + + new GetDropZonesTestCase().setTitle("singleDropZoneSingleContentWidthHeight_returnsDropZone") + .setChildren(List.of(new Content("[drop-zone:A1|w-100h-50]"))) + .expectDropZones("A1"), + + new GetDropZonesTestCase().setTitle("singleDropZoneSingleContentWithinLatex_returnsDropZone") + .setChildren(List.of(new Content("$$1 + \\text{[drop-zone:A1]}$$"))) + .expectDropZones("A1"), + + new GetDropZonesTestCase().setTitle("multiDropZoneSingleContent_returnsDropZones") + .setChildren(List.of(new Content("Some text [drop-zone:A1], other text [drop-zone:A2]"))) + .expectDropZones("A1", "A2"), + + new GetDropZonesTestCase().setTitle("multiDropZoneMultiContent_returnsDropZones") + .setChildren(List.of( + new Content("[drop-zone:A1] [drop-zone:A2]"), + new Content("[drop-zone:A3] [drop-zone:A4]") + )).expectDropZones("A1", "A2", "A3", "A4"), + + new GetDropZonesTestCase().setTitle("singleDropZoneNestedContent_returnsDropZones") + .setChildren(new LinkedList<>(List.of(new Content(), new Content("[drop-zone:A2]")))) + .tapQuestion(q -> ((Content) q.getChildren().get(0)).setChildren(List.of(new Content("[drop-zone:A1]")))) + .expectDropZones("A1", "A2"), + + new GetDropZonesTestCase().setTitle("figureContentWithoutDropZones_returnsNoZones") + .setChildren(List.of(new Figure())) + .expectDropZones(), + + new GetDropZonesTestCase().setTitle("figureContent_returnsDropZones") + .setChildren(List.of(createFigure("A1", "A2"))) + .expectDropZones("A1", "A2"), + + new GetDropZonesTestCase().setTitle("mixedButNoNesting_returnsDropZones") + .setChildren(new LinkedList<>(List.of(createFigure("A1", "A2"), new Content("[drop-zone:A3]")))) + .expectDropZones("A1", "A2", "A3"), + + new GetDropZonesTestCase().setTitle("mixedNested_returnsDropZones") + .setChildren(new LinkedList<>(List.of(new Content(), new Content("[drop-zone:A2]")))) + .tapQuestion(q -> { + Content content = (Content) q.getChildren().get(0); + content.setChildren(List.of( + new Content("[drop-zone:A1]"), + createFigure("F1", "F2") + )); + }).expectDropZones("A1", "F1", "F2", "A2") + ); + } - @Theory - public final void testGetDropZones(final GetDropZonesTestCase testCase) { - var dropZones = ContentValidatorUtils.DropZones.getFromQuestion(testCase.question); + @ParameterizedTest + @MethodSource("getDropZonesTestCases") + public void testGetDropZones(final GetDropZonesTestCase testCase) { + List dropZones = ContentValidatorUtils.DropZones.getFromQuestion(testCase.question); assertEquals(testCase.dropZones, dropZones); } private static Figure createFigure(final String... dropZones) { - var figure = new Figure(); - figure.setFigureRegions(new ArrayList<>(List.of())); - List.of(dropZones).forEach(dropZoneId -> { - var region = new FigureRegion(); + Figure figure = new Figure(); + figure.setFigureRegions(new ArrayList<>()); + for (String dropZoneId : dropZones) { + FigureRegion region = new FigureRegion(); region.setId(dropZoneId); figure.getFigureRegions().add(region); - }); + } return figure; } From c666d544dca892fb493dbbb476030477096991bc Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Wed, 25 Feb 2026 17:13:23 +0000 Subject: [PATCH 33/38] Use JUnit 5 in Microsoft authenticator tests and fix some style issues --- .../auth/MicrosoftAuthenticatorTest.java | 328 +++++++++--------- 1 file changed, 171 insertions(+), 157 deletions(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/MicrosoftAuthenticatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/MicrosoftAuthenticatorTest.java index ec25226bf4..70a1d5b79a 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/segue/auth/MicrosoftAuthenticatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/segue/auth/MicrosoftAuthenticatorTest.java @@ -17,14 +17,15 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; - -import org.junit.experimental.runners.Enclosed; +import org.apache.commons.lang3.tuple.Pair; +import org.eclipse.jetty.server.Server; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.function.Executable; -import org.junit.runner.RunWith; - -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import uk.ac.cam.cl.dtg.isaac.dos.users.EmailVerificationStatus; import uk.ac.cam.cl.dtg.isaac.dos.users.UserFromAuthProvider; import uk.ac.cam.cl.dtg.segue.auth.exceptions.AuthenticationCodeException; @@ -36,21 +37,21 @@ import uk.ac.cam.cl.dtg.segue.auth.microsoft.Token; import java.util.Arrays; -import java.util.Collection; import java.util.Date; import java.util.List; import java.util.UUID; +import java.util.stream.Stream; -import static org.junit.jupiter.api.Assertions.*; import static java.lang.String.format; +import static org.junit.jupiter.api.Assertions.*; -@RunWith(Enclosed.class) -public class MicrosoftAuthenticatorTest { - @RunWith(Parameterized.class) - public static class TestInitialisation extends Helpers { - @Parameterized.Parameters(name="{0}") - public static Collection data() { - return Arrays.asList(new Object[][] { +class MicrosoftAuthenticatorTest { + + @Nested + class TestInitialisation extends Helpers { + + static Stream data() { + return Stream.of(new Object[][] { { "client_id", (C) v -> new MicrosoftAuthenticator(v, tenantId, clientSecret, jwksUrl, redirectUrl) }, { "tenant_id", (C) v -> new MicrosoftAuthenticator(clientId, v, clientSecret, jwksUrl, redirectUrl) }, { "client_secret", (C) v -> new MicrosoftAuthenticator(clientId, tenantId, v, jwksUrl, redirectUrl) }, @@ -59,20 +60,16 @@ public static Collection data() { }); } - @Parameterized.Parameter() - public String field; - - @Parameterized.Parameter(1) - public C consumer; - - @Test - public void microsoftAuthenticator_nullValue_throwsError() { + @ParameterizedTest + @MethodSource("data") + void microsoftAuthenticator_nullValue_throwsError(final String field, final C consumer) { Executable act = () -> consumer.consume(null); assertError(act, NullPointerException.class, format("Missing %s, can't be \"null\".", field)); } - @Test - public void microsoftAuthenticator_emptyValue_throwsError() { + @ParameterizedTest + @MethodSource("data") + void microsoftAuthenticator_emptyValue_throwsError(final String field, final C consumer) { Executable act = () -> consumer.consume(""); assertError(act, IllegalArgumentException.class, format("Missing %s, can't be \"\".", field)); } @@ -86,57 +83,62 @@ public interface C { // Contains tests for: // 1) getAuthorizationUrl, 2) extractAuthCode, 3) getAntiForgeryStateToken, 4) getUserInfo, // 5) getAuthenticationProvider, 6) exchangeCode - public static class TestShared extends IOAuth2AuthenticatorTest { + @Nested + class TestShared extends IOAuth2AuthenticatorTest { @BeforeEach - public final void setUp() throws Exception { + final void setUp() throws Exception { this.oauth2Authenticator = Helpers.subject(Helpers.getStore()); this.authenticator = this.oauth2Authenticator; } } - public static class TestExtractAuthCode extends Helpers { - /** happy path: {@link IOAuth2AuthenticatorTest#extractAuthCode_givenValidUrl_returnsCorrectCode} */ + @Nested + class TestExtractAuthCode extends Helpers { + /** happy path: {@link IOAuth2AuthenticatorTest#extractAuthCode_givenValidUrl_returnsCorrectCode}. */ @Test - public void extractAuthCode_givenInvalidUrl_throwsError() { + void extractAuthCode_givenInvalidUrl_throwsError() { Executable act = () -> subject(getStore()).extractAuthCode("https://example.com"); assertError(act, AuthenticationCodeException.class, "Error extracting authentication code."); } } - public static class TestGetAuthorizationUrl extends Helpers { + @Nested + class TestGetAuthorizationUrl extends Helpers { @Test - public void getAuthorizationUrl_validAntiForgeryToken_returnsUrl() { + void getAuthorizationUrl_validAntiForgeryToken_returnsUrl() { var csrfToken = "the_csrf_token"; var url = subject(getStore()).getAuthorizationUrl(csrfToken); - var expectedUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize" + - format("?client_id=%s", clientId) + - format("&redirect_uri=%s", redirectUrl) + - format("&response_type=%s", "code") + - format("&scope=%s", "openid%20profile%20email") + - format("&state=%s", csrfToken) + - format("&prompt=%s", "select_account") + - format("&response_mode=%s", "query"); + var expectedUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize" + + format("?client_id=%s", clientId) + + format("&redirect_uri=%s", redirectUrl) + + format("&response_type=%s", "code") + + format("&scope=%s", "openid%20profile%20email") + + format("&state=%s", csrfToken) + + format("&prompt=%s", "select_account") + + format("&response_mode=%s", "query"); assertEquals(expectedUrl, url); } } - public static class TestExchangeCode extends Helpers { + @Nested + class TestExchangeCode extends Helpers { @Test - public void exchangeCode_invalidCode_throwsCodeExchangeExceptionWithoutAnyDetails() { + void exchangeCode_invalidCode_throwsCodeExchangeExceptionWithoutAnyDetails() { Executable act = () -> subject(getStore()).exchangeCode(null); assertError(act, CodeExchangeException.class, "There was an error exchanging the code."); } } - @RunWith(Enclosed.class) - public static class TestGetUserInfo extends GetUserInfoHelpers { - @RunWith(Enclosed.class) - public static class TestUserClaims { - public static class TestValid { + @Nested + class TestGetUserInfo extends GetUserInfoHelpers { + @Nested + class TestUserClaims { + @Nested + class TestValid { @Test - public void getUserInfo_validToken_returnsUserInformation() throws Throwable { - var oid = UUID.randomUUID().toString(); - var t = token.valid(s -> s, u -> { + void getUserInfo_validToken_returnsUserInformation() throws Throwable { + String oid = UUID.randomUUID().toString(); + String t = token.valid(s -> s, u -> { u.put("oid", oid); u.put("email", "test@example.org"); u.put("family_name", "Doe"); @@ -144,7 +146,7 @@ public void getUserInfo_validToken_returnsUserInformation() throws Throwable { return null; }); - var userInfo = testGetUserInfo(t); + UserFromAuthProvider userInfo = testGetUserInfo(t); assertEquals(oid, userInfo.getProviderUserId()); assertEquals("test@example.org", userInfo.getEmail()); @@ -155,63 +157,64 @@ public void getUserInfo_validToken_returnsUserInformation() throws Throwable { } } - public static class TestOidClaim extends TestUUIDClaim { + @Nested + class TestOidClaim extends TestUUIDClaim { @Override String claim() { return "oid"; } } - @RunWith(Parameterized.class) - public static class TestValidNameClaims { - @Parameterized.Parameters(name="test case {index}") - public static Collection data() { - return Arrays.asList(new String[][][] { - { {"John", "Doe", "JohnDoe" }, {"John", "Doe"} }, - { {"John", "Doe", null }, {"John", "Doe"} }, - { {"John", "Doe", "" }, {"John", "Doe"} }, - { {"John", null, "John Doe" }, {"John", null} }, - { {"John", "", "John Doe" }, {"John", null} }, - { { null, "Doe", "John Doe" }, {null, "Doe"} }, - { { "", "Doe", "John Doe" }, {null, "Doe"} }, - { { null, null, "John Doe" }, {"John", "Doe"} }, - { { "", "", "John Doe" }, {"John", "Doe"} }, - { { null, null, "Doe" }, {null, "Doe"} }, - { { null, null, "John" }, {null, "John"} }, - { { null, null, " John " }, {null, "John"} }, - { { null, null, "John " }, {null, "John"} }, - { { null, null, "John " }, {null, "John"} }, - { { null, null, "John Joanne Doe" }, {"John Joanne", "Doe"} }, - { { null, null, "John Joanne Josephine Doe" }, {"John Joanne Josephine", "Doe"} }, - { { null, null, "John Joanne Josephine Doe " }, {"John Joanne Josephine", "Doe"} }, - }); + @Nested + class TestValidNameClaims { + static Stream data() { + return Stream.of( + Arguments.of(new String[]{"John", "Doe", "JohnDoe"}, new String[]{"John", "Doe"}), + Arguments.of(new String[]{"John", "Doe", null}, new String[]{"John", "Doe"}), + Arguments.of(new String[]{"John", "Doe", ""}, new String[]{"John", "Doe"}), + Arguments.of(new String[]{"John", null, "John Doe"}, new String[]{"John", null}), + Arguments.of(new String[]{"John", "", "John Doe"}, new String[]{"John", null}), + Arguments.of(new String[]{null, "Doe", "John Doe"}, new String[]{null, "Doe"}), + Arguments.of(new String[]{"", "Doe", "John Doe"}, new String[]{null, "Doe"}), + Arguments.of(new String[]{null, null, "John Doe"}, new String[]{"John", "Doe"}), + Arguments.of(new String[]{"", "", "John Doe"}, new String[]{"John", "Doe"}), + Arguments.of(new String[]{null, null, "Doe"}, new String[]{null, "Doe"}), + Arguments.of(new String[]{null, null, "John"}, new String[]{null, "John"}), + Arguments.of(new String[]{null, null, " John "}, new String[]{null, "John"}), + Arguments.of(new String[]{null, null, "John "}, new String[]{null, "John"}), + Arguments.of(new String[]{null, null, "John "}, new String[]{null, "John"}), + Arguments.of(new String[]{null, null, "John Joanne Doe"}, + new String[]{"John Joanne", "Doe"}), + Arguments.of(new String[]{null, null, "John Joanne Josephine Doe"}, + new String[]{"John Joanne Josephine", "Doe"}), + Arguments.of(new String[]{null, null, "John Joanne Josephine Doe "}, + new String[]{"John Joanne Josephine", "Doe"}) + ); } - @Parameterized.Parameter() - public String[] input; - - @Parameterized.Parameter(1) - public String[] expectedOutput; - - @Test - public void getUserInfo_validNameClaims_accepted() throws Throwable { - var t = token.valid(s -> s, u -> u.setName(input[0], input[1], input[2])); - var userInfo = testGetUserInfo(t); - assertEquals(expectedOutput[0], userInfo.getGivenName(), String.format("given name failed for %s", Arrays.toString(input))); - assertEquals(expectedOutput[1], userInfo.getFamilyName(), String.format("last name failed for %s", Arrays.toString(input))); + @ParameterizedTest + @MethodSource("data") + void getUserInfo_validNameClaims_accepted(final String[] input, final String[] expectedOutput) throws Throwable { + String t = token.valid(s -> s, u -> u.setName(input[0], input[1], input[2])); + UserFromAuthProvider userInfo = testGetUserInfo(t); + assertEquals(expectedOutput[0], userInfo.getGivenName(), + String.format("given name failed for %s", Arrays.toString(input))); + assertEquals(expectedOutput[1], userInfo.getFamilyName(), + String.format("last name failed for %s", Arrays.toString(input))); } } - public static class TestInvalidNameClaims { + @Nested + class TestInvalidNameClaims { @Test - public void getUserInfo_MissingNameClaims_rejected() { - var t = token.valid(s -> s, u -> u.setName(null, null, null)); + void getUserInfo_MissingNameClaims_rejected() { + String t = token.valid(s -> s, u -> u.setName(null, null, null)); testGetUserInfo(t, NoUserException.class, "Could not determine name"); } @Test - public void getUserInfo_nullNameClaims_rejected() { - var t = token.valid(s -> s, u -> { + void getUserInfo_nullNameClaims_rejected() { + String t = token.valid(s -> s, u -> { u.put("given_name", null); u.put("family_name", null); u.put("name", null); @@ -221,146 +224,155 @@ public void getUserInfo_nullNameClaims_rejected() { } @Test - public void getUserInfo_EmptyNameClaims_rejected() { - var t = token.valid(s -> s, u -> u.setName("", "", "")); + void getUserInfo_EmptyNameClaims_rejected() { + String t = token.valid(s -> s, u -> u.setName("", "", "")); testGetUserInfo(t, NoUserException.class, "Could not determine name"); } } - public static class TestTidClaim extends TestUUIDClaim { + @Nested + class TestTidClaim extends TestUUIDClaim { @Override String claim() { return "tid"; } } - public static class TestEmailClaim extends TestNonEmptyClaim { + @Nested + class TestEmailClaim extends TestNonEmptyClaim { @Override String claim() { return "email"; } @Test - public void getUserInfo_emailInvalid_throwsError() { - var t = token.valid(s -> s, u -> u.put("email", "some_bad_email")); + void getUserInfo_emailInvalid_throwsError() { + String t = token.valid(s -> s, u -> u.put("email", "some_bad_email")); testGetUserInfo(t, NoUserException.class, "User verification: BAD_CLAIM (email)"); } } } - @RunWith(Enclosed.class) - public static class TestSystemClaims { - public static class TestTokenMissing { + @Nested + class TestSystemClaims { + @Nested + class TestTokenMissing { @Test - public void getUserInfo_tryingToStoreNull_throwsError() { + void getUserInfo_tryingToStoreNull_throwsError() { assertThrows(NullPointerException.class, () -> testGetUserInfo(null)); } @Test - public void getUserInfo_noSuchToken_throwsError() { + void getUserInfo_noSuchToken_throwsError() { Executable act = () -> subject(getStore()).getUserInfo("no_token_for_id"); assertError(act, AuthenticatorSecurityException.class, "Token verification: TOKEN_MISSING"); } } - public static class TestSignatureVerification { + @Nested + class TestSignatureVerification { @Test - public void getUserInfo_tokenSignatureNoKeyId_throwsError() { - var t = token.valid(s -> s.withKeyId(null), u -> u); + void getUserInfo_tokenSignatureNoKeyId_throwsError() { + String t = token.valid(s -> s.withKeyId(null), u -> u); testGetUserInfo(t, AuthenticatorSecurityException.class, "Token verification: KEY_NOT_FOUND"); } @Test - public void getUserInfo_tokenSignatureKeyNotFound_throwsError() { - var t = token.valid(s -> s.withKeyId("no-such-key"), u -> u); + void getUserInfo_tokenSignatureKeyNotFound_throwsError() { + String t = token.valid(s -> s.withKeyId("no-such-key"), u -> u); testGetUserInfo(t, AuthenticatorSecurityException.class, "Token verification: KEY_NOT_FOUND"); } @Test - public void getUserInfo_tokenSignatureMismatch_throwsError() { - var t = Token.signed(invalidSigningKey, s -> s.withKeyId(validSigningKey.getPublic().id())); + void getUserInfo_tokenSignatureMismatch_throwsError() { + String t = Token.signed(invalidSigningKey, s -> s.withKeyId(validSigningKey.getPublic().id())); testGetUserInfo(t, AuthenticatorSecurityException.class, "Token verification: BAD_SIGNATURE"); } } - public static class TestExpirationClaim { + @Nested + class TestExpirationClaim { @Test - public void getUserInfo_tokenWithoutExp_accepted() { + void getUserInfo_tokenWithoutExp_accepted() { assertDoesNotThrow(() -> testGetUserInfo(token.valid(s -> s.withExpiresAt((Date) null), u -> u))); } @Test - public void getUserInfo_tokenExpired_throwsError() { - var t = token.valid(s -> s.withExpiresAt(Token.oneHourAgo), u -> u); + void getUserInfo_tokenExpired_throwsError() { + String t = token.valid(s -> s.withExpiresAt(Token.oneHourAgo), u -> u); testGetUserInfo(t, AuthenticatorSecurityException.class, "Token verification: TOKEN_EXPIRED"); } } - public static class TestIssuedAtClaim { + @Nested + class TestIssuedAtClaim { @Test - public void getUserInfo_tokenWithoutIat_accepted() { + void getUserInfo_tokenWithoutIat_accepted() { assertDoesNotThrow(() -> testGetUserInfo(token.valid(s -> s.withIssuedAt((Date) null), u -> u))); } @Test - public void getUserInfo_tokenIatFuture_throwsError() { + void getUserInfo_tokenIatFuture_throwsError() { var t = token.valid(s -> s.withIssuedAt(Token.inOneHour), u -> u); testGetUserInfo(t, AuthenticatorSecurityException.class, "Token verification: BAD_CLAIM (iat)"); } } - public static class TestNotBeforeClaim { + @Nested + class TestNotBeforeClaim { @Test - public void getUserInfo_tokenWithoutNbf_accepted() { + void getUserInfo_tokenWithoutNbf_accepted() { assertDoesNotThrow(() -> testGetUserInfo(token.valid(s -> s.withNotBefore((Date) null), u -> u))); } @Test - public void getUserInfo_tokenNbfFuture_throwsError() { - var t = token.valid(s -> s.withNotBefore(Token.inOneHour), u -> u); + void getUserInfo_tokenNbfFuture_throwsError() { + String t = token.valid(s -> s.withNotBefore(Token.inOneHour), u -> u); testGetUserInfo(t, AuthenticatorSecurityException.class, "Token verification: BAD_CLAIM (nbf)"); } } - public static class TestAudienceClaim { + @Nested + class TestAudienceClaim { @Test - public void getUserInfo_tokenMissingAud_throwsError() { - var t = token.valid(s -> s.withAudience((String) null), u -> u); + void getUserInfo_tokenMissingAud_throwsError() { + String t = token.valid(s -> s.withAudience((String) null), u -> u); testGetUserInfo(t, AuthenticatorSecurityException.class, "Token verification: BAD_CLAIM (aud)"); } @Test - public void getUserInfo_tokenAudIncorrect_throwsError() { - var t = token.valid(s -> s.withAudience("intended_for_somebody_else"), u -> u); + void getUserInfo_tokenAudIncorrect_throwsError() { + String t = token.valid(s -> s.withAudience("intended_for_somebody_else"), u -> u); testGetUserInfo(t, AuthenticatorSecurityException.class, "Token verification: BAD_CLAIM (aud)"); } } - public static class TestIssuerClaim { + @Nested + class TestIssuerClaim { @Test - public void getUserInfo_tokenMissingIssuer_throwsError() { - var t = token.valid(s -> s.withIssuer(null), u -> u); + void getUserInfo_tokenMissingIssuer_throwsError() { + String t = token.valid(s -> s.withIssuer(null), u -> u); testGetUserInfo(t, AuthenticatorSecurityException.class, "Token verification: BAD_CLAIM (iss)"); } @Test - public void getUserInfo_tokenIncorrectIssuer_throwsError() { - var t = token.valid(s -> s.withIssuer("some_bad_issuer"), u -> u); + void getUserInfo_tokenIncorrectIssuer_throwsError() { + String t = token.valid(s -> s.withIssuer("some_bad_issuer"), u -> u); testGetUserInfo(t, AuthenticatorSecurityException.class, "Token verification: BAD_CLAIM (iss)"); } @Test - public void getUserInfo_tokenTenantIssuerMismatch_throwsError() { - var tid = UUID.randomUUID().toString(); - var t = token.valid(s -> s.withIssuer(Token.expectedIssuer(Token.msTenantId)), + void getUserInfo_tokenTenantIssuerMismatch_throwsError() { + String tid = UUID.randomUUID().toString(); + String t = token.valid(s -> s.withIssuer(Token.expectedIssuer(Token.msTenantId)), u -> u.put("tid", tid)); testGetUserInfo(t, AuthenticatorSecurityException.class, "Token verification: BAD_CLAIM (iss)"); } @Test - public void getUserInfo_tokenTenantSpecificIssuer_accepted() { - var tid = UUID.randomUUID().toString(); - var t = token.valid(s -> s.withIssuer(Token.expectedIssuer(tid)), u -> u.put("tid", tid)); + void getUserInfo_tokenTenantSpecificIssuer_accepted() { + String tid = UUID.randomUUID().toString(); + String t = token.valid(s -> s.withIssuer(Token.expectedIssuer(tid)), u -> u.put("tid", tid)); assertDoesNotThrow(() -> testGetUserInfo(t)); } } @@ -381,8 +393,8 @@ static Cache getStore() { return CacheBuilder.newBuilder().build(); } - static void assertError(Executable action, Class errorClass, String errorMessage) { - var error = assertThrows(errorClass, action); + static void assertError(final Executable action, final Class errorClass, final String errorMessage) { + Exception error = assertThrows(errorClass, action); assertEquals(errorMessage, error.getMessage()); } @@ -394,30 +406,30 @@ static void assertError(Executable action, Class errorC } class GetUserInfoHelpers extends Helpers { - static abstract class TestNonEmptyClaim { + abstract static class TestNonEmptyClaim { abstract String claim(); @Test - public void getUserInfo_missing_throwsError() { - var t = token.valid(s -> s, u -> u.remove(claim())); + void getUserInfo_missing_throwsError() { + String t = token.valid(s -> s, u -> u.remove(claim())); testGetUserInfo(t, NoUserException.class, expectedMessage()); } @Test - public void getUserInfo_null_throwsError() { - var t = token.valid(s -> s, u -> u.put(claim(), null)); + void getUserInfo_null_throwsError() { + String t = token.valid(s -> s, u -> u.put(claim(), null)); testGetUserInfo(t, NoUserException.class, expectedMessage()); } @Test - public void getUserInfo_empty_throwsError() { - var t = token.valid(s -> s, u -> u.put(claim(), "")); + void getUserInfo_empty_throwsError() { + String t = token.valid(s -> s, u -> u.put(claim(), "")); testGetUserInfo(t, NoUserException.class, expectedMessage()); } @Test - public void getUserInfo_blank_throwsError() { - var t = token.valid(s -> s, u -> u.put(claim(), " ")); + void getUserInfo_blank_throwsError() { + String t = token.valid(s -> s, u -> u.put(claim(), " ")); testGetUserInfo(t, NoUserException.class, expectedMessage()); } @@ -426,25 +438,26 @@ String expectedMessage() { } } - static abstract class TestUUIDClaim extends TestNonEmptyClaim { + abstract static class TestUUIDClaim extends TestNonEmptyClaim { @Test - public void getUserInfo_invalid_throwsError() { - var t = token.valid(s -> s, u -> u.put(claim(), "some_bad_uuid")); + void getUserInfo_invalid_throwsError() { + String t = token.valid(s -> s, u -> u.put(claim(), "some_bad_uuid")); testGetUserInfo(t, NoUserException.class, expectedMessage()); } @Test - public void getUserInfo_prefixValidButOverallInvalid_throwsError() { - var t = token.valid(s -> s, u -> u.put(claim(), format("%s/hello/", UUID.randomUUID()))); + void getUserInfo_prefixValidButOverallInvalid_throwsError() { + String t = token.valid(s -> s, u -> u.put(claim(), format("%s/hello/", UUID.randomUUID()))); testGetUserInfo(t, NoUserException.class, expectedMessage()); } } - static UserFromAuthProvider testGetUserInfo(String token) throws Throwable { - var store = getStore(); - var subject = subject(store); + static UserFromAuthProvider testGetUserInfo(final String token) throws Throwable { + Cache store = getStore(); + MicrosoftAuthenticator subject = subject(store); store.put("the_internal_id", token); - var keySetServer = KeySetServlet.startServer(8888, List.of(validSigningKey, anotherValidSigningKey)); + Pair keySetServer = + KeySetServlet.startServer(8888, List.of(validSigningKey, anotherValidSigningKey)); try { return subject.getUserInfo("the_internal_id"); } finally { @@ -452,7 +465,8 @@ static UserFromAuthProvider testGetUserInfo(String token) throws Throwable { } } - static void testGetUserInfo(String token, Class errorClass, String errorMessage) { + static void testGetUserInfo(final String token, final Class errorClass, + final String errorMessage) { assertError(() -> testGetUserInfo(token), errorClass, errorMessage); } From 9acb233d3fbf07abbad15c71dfa18cc43be91906 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Wed, 25 Feb 2026 17:27:06 +0000 Subject: [PATCH 34/38] Restore unused "description" parameter This serves absolutely no purpose but it's hardcoded into the test cases so I'm changing the test method to match for now. --- .../ac/cam/cl/dtg/isaac/quiz/IsaacLLMFreeTextValidatorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacLLMFreeTextValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacLLMFreeTextValidatorTest.java index 335bb175a2..7c7d71ce8e 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacLLMFreeTextValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacLLMFreeTextValidatorTest.java @@ -92,7 +92,7 @@ static Stream data() { @ParameterizedTest(name = "{index}: {0}") @MethodSource("data") - void test(final IsaacLLMFreeTextQuestion question, final String breakdown, + void test(final String description, final IsaacLLMFreeTextQuestion question, final String breakdown, final boolean expectedResult, final int expectedMarkTotal) throws Exception { LLMFreeTextQuestionValidationResponse resp = validate(question, answer(), client(breakdown)); expectMark(resp, expectedResult, expectedMarkTotal, toMarkScheme(breakdown)); From eddaa7a6901f2934850f1651800fe08f0e8f7abf Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Thu, 26 Feb 2026 10:02:27 +0000 Subject: [PATCH 35/38] Restore access modifier For consistency with other tests in suite --- .../cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java index 321bb54aae..29aebcc790 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/api/managers/QuizAssignmentManagerTest.java @@ -102,7 +102,7 @@ public void createAnotherAssignmentAfterFirstIsDueSucceeds() throws SegueDatabas } @Test - void createAssignmentFailsInThePast() { + public void createAssignmentFailsInThePast() { assertThrows(DueBeforeNowException.class, () -> { newAssignment.setDueDate(somePastDate); quizAssignmentManager.createAssignment(newAssignment); From b509faaf7a2436f2effb65bdf5c10c568d6fc88e Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Thu, 26 Feb 2026 10:02:49 +0000 Subject: [PATCH 36/38] Restore comment --- .../uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java index 0a03637aa7..f6124c5bd1 100644 --- a/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java +++ b/src/test/java/uk/ac/cam/cl/dtg/isaac/quiz/IsaacParsonsValidatorTest.java @@ -190,6 +190,7 @@ public final void isaacParsonsValidator_IncorrectItemType_ExceptionShouldBeThrow Item submittedItem2 = new Item("id002", null); c.setItems(ImmutableList.of(submittedItem1, submittedItem2)); + // This should throw an exception: IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { validator.validateQuestionResponse(someParsonsQuestion, c); }); From 3b15d22b8711034bd0fb3639ff1d22a79fcdc9b8 Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Thu, 26 Feb 2026 10:20:13 +0000 Subject: [PATCH 37/38] Remove PowerMock version property --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3cb555e781..7178ad6d67 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,6 @@ 2.20 - 2.0.9 5.14.1 4.13.2 0.16.0 From 08832ca9ed00f26892b1140349e3f9b96156947e Mon Sep 17 00:00:00 2001 From: Alex Lewin Date: Thu, 26 Feb 2026 10:24:00 +0000 Subject: [PATCH 38/38] Add Mockito version property --- pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 7178ad6d67..9507088c8e 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,7 @@ 2.20 + 5.11.0 5.14.1 4.13.2 0.16.0 @@ -256,13 +257,13 @@ org.mockito mockito-core - 5.11.0 + ${mockito.version} test org.mockito mockito-junit-jupiter - 5.11.0 + ${mockito.version} test