From 54f8d8e4c5b6f29500cab7f5ae2796dfc44ec73c Mon Sep 17 00:00:00 2001 From: andrewpols Date: Tue, 2 Dec 2025 22:30:27 -0500 Subject: [PATCH 1/3] Finalize full coverage tests --- .../InMemoryGroupDataAccessObject.java | 24 +++++++++++++++++++ .../CreateGroupDataAccessInterface.java | 4 +--- .../create_group/CreateGroupInteractor.java | 2 ++ .../CreateGroupInteractorTest.java | 3 +++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/main/java/data_access/InMemoryGroupDataAccessObject.java b/src/main/java/data_access/InMemoryGroupDataAccessObject.java index 63821fd..6881951 100644 --- a/src/main/java/data_access/InMemoryGroupDataAccessObject.java +++ b/src/main/java/data_access/InMemoryGroupDataAccessObject.java @@ -8,6 +8,7 @@ import use_case.login.LoginGroupsDataAccessInterface; import use_case.viewgrouptasks.ViewGroupTasksGroupDataAccessInterface; +import java.security.SecureRandom; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -23,6 +24,10 @@ public class InMemoryGroupDataAccessObject implements private final Map groups = new HashMap<>(); private String currentGroupID; + private static final String JOIN_CODE_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + private static final int JOIN_CODE_LENGTH = 6; + private final SecureRandom random = new SecureRandom(); + /** * Checks if the given groupCode exists. @@ -53,6 +58,7 @@ public Group getGroup(String groupId) { */ @Override public void save(Group group) { + group.setGroupId(generateUniqueJoinCode()); groups.put(group.getGroupID(), group); } @@ -89,4 +95,22 @@ public String getCurrentGroupID() { public void saveMasterSchedule(Group group) { groups.put(group.getGroupID(), group); } + + + private String generateUniqueJoinCode() { + String code; + do { + code = generateRandomJoinCode(); + } while (groupCodeExists(code)); + return code; + } + + private String generateRandomJoinCode() { + StringBuilder sb = new StringBuilder(JOIN_CODE_LENGTH); + for (int i = 0; i < JOIN_CODE_LENGTH; i++) { + int idx = random.nextInt(JOIN_CODE_CHARS.length()); + sb.append(JOIN_CODE_CHARS.charAt(idx)); + } + return sb.toString(); + } } diff --git a/src/main/java/use_case/create_group/CreateGroupDataAccessInterface.java b/src/main/java/use_case/create_group/CreateGroupDataAccessInterface.java index 91adfa8..907030b 100644 --- a/src/main/java/use_case/create_group/CreateGroupDataAccessInterface.java +++ b/src/main/java/use_case/create_group/CreateGroupDataAccessInterface.java @@ -23,7 +23,5 @@ public interface CreateGroupDataAccessInterface { * @param username the username whose group memberships are requested * @return a list of Group entities the user is a member of **/ - default List getGroupsForUser(String username) { - return null; - } + List getGroupsForUser(String username); } diff --git a/src/main/java/use_case/create_group/CreateGroupInteractor.java b/src/main/java/use_case/create_group/CreateGroupInteractor.java index fa758bb..c953c18 100644 --- a/src/main/java/use_case/create_group/CreateGroupInteractor.java +++ b/src/main/java/use_case/create_group/CreateGroupInteractor.java @@ -57,6 +57,8 @@ public void execute(CreateGroupInputData createGroupInputData) { group.getGroupID(), UserRole.MODERATOR, true); membershipDataAccessObject.save(membership); + groupCreator.addMembership(membership); + group.addMembership(membership); List newGroups = groupDataAccessObject.getGroupsForUser(groupCreator.getName()); Map newGroupHashMap = new HashMap<>(); for (Group newGroup : newGroups) { diff --git a/src/test/java/use_case/create_group/CreateGroupInteractorTest.java b/src/test/java/use_case/create_group/CreateGroupInteractorTest.java index bc3f346..5711c7a 100644 --- a/src/test/java/use_case/create_group/CreateGroupInteractorTest.java +++ b/src/test/java/use_case/create_group/CreateGroupInteractorTest.java @@ -33,6 +33,8 @@ void successTest() { public void prepareSuccessView(CreateGroupOutputData outputData) { assertEquals("Andrew's Group", outputData.getGroupName()); assertEquals(GroupType.PROJECT, outputData.getGroupType()); + assertFalse(outputData.getGroupID().isBlank()); + assertTrue(outputData.getGroups().containsKey(outputData.getGroupID())); } @Override @@ -61,6 +63,7 @@ public void openCreateGroupModal() { membershipFactory ); + interactor.openCreateGroupModal(); interactor.execute(inputData); } From 11fd4fea70ff346693ea543918362a4351dc1b49 Mon Sep 17 00:00:00 2001 From: andrewpols Date: Tue, 2 Dec 2025 22:36:51 -0500 Subject: [PATCH 2/3] Ensure all tests pass with new logic --- src/main/java/data_access/InMemoryGroupDataAccessObject.java | 4 +++- .../java/use_case/join_group/JoinGroupInteractorTest.java | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/data_access/InMemoryGroupDataAccessObject.java b/src/main/java/data_access/InMemoryGroupDataAccessObject.java index 6881951..cbbe38c 100644 --- a/src/main/java/data_access/InMemoryGroupDataAccessObject.java +++ b/src/main/java/data_access/InMemoryGroupDataAccessObject.java @@ -58,7 +58,9 @@ public Group getGroup(String groupId) { */ @Override public void save(Group group) { - group.setGroupId(generateUniqueJoinCode()); + if (group.getGroupID().isBlank()) { + group.setGroupId(generateUniqueJoinCode()); + } groups.put(group.getGroupID(), group); } diff --git a/src/test/java/use_case/join_group/JoinGroupInteractorTest.java b/src/test/java/use_case/join_group/JoinGroupInteractorTest.java index b8c5bd5..292cb91 100644 --- a/src/test/java/use_case/join_group/JoinGroupInteractorTest.java +++ b/src/test/java/use_case/join_group/JoinGroupInteractorTest.java @@ -45,6 +45,7 @@ void successValidGroupCodeTest() throws IOException { userDataAccess.save(myUser); userDataAccess.setCurrentUsername(myUser.getName()); + JoinGroupOutputBoundary successPresenter = new JoinGroupOutputBoundary() { @Override public void prepareSuccessView(JoinGroupOutputData outputData) { @@ -75,6 +76,7 @@ void failureEmptyGroupCodeTest() throws IOException { User moderator = new User("moderator", "moderator@gmail.com", "pass"); Group group = new Group("existing group to join", validCode, GroupType.STUDY); + group.setGroupId(validCode); Membership moderatorMembership = new Membership(moderator.getName(), group.getGroupID(), UserRole.MODERATOR, true); moderator.addMembership(moderatorMembership); From 7d068f68b6c4061b8c829f1478d7372bcf0a2dfe Mon Sep 17 00:00:00 2001 From: andrewpols Date: Tue, 2 Dec 2025 22:39:14 -0500 Subject: [PATCH 3/3] Fix consecutive lines checkstyle --- src/main/java/data_access/InMemoryGroupDataAccessObject.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/data_access/InMemoryGroupDataAccessObject.java b/src/main/java/data_access/InMemoryGroupDataAccessObject.java index cbbe38c..c8cc49c 100644 --- a/src/main/java/data_access/InMemoryGroupDataAccessObject.java +++ b/src/main/java/data_access/InMemoryGroupDataAccessObject.java @@ -28,7 +28,6 @@ public class InMemoryGroupDataAccessObject implements private static final int JOIN_CODE_LENGTH = 6; private final SecureRandom random = new SecureRandom(); - /** * Checks if the given groupCode exists. * @@ -98,7 +97,6 @@ public void saveMasterSchedule(Group group) { groups.put(group.getGroupID(), group); } - private String generateUniqueJoinCode() { String code; do {