diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/SharedApiService.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/SharedApiService.java index c899534..8c0584a 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/SharedApiService.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/SharedApiService.java @@ -25,8 +25,9 @@ import java.nio.file.StandardCopyOption; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; +import java.util.Map; @Service public class SharedApiService { @@ -95,31 +96,36 @@ public class SharedApiService { } Project project = this.projectService.getProjectById(projectId); - List allSectionCells = new ArrayList(); - project.getListSectionCell() + + Map latestSectionCellsMap = + new HashMap<>(); // List for the intermediate result + + // Iterate through all SectionCells associated with the project + // This loop iterates over project.getListSectionCell() but does NOT modify it which causes + // ConcurrentModificationException. + // Modifications are done only on the latestSectionCellsMap (which is safe). + project.getListSectionCell() // <-- Iterating over the original list (read-only) .forEach( projectCell -> { - AtomicBoolean sameReferenceId = - new AtomicBoolean(false); // side effect lambdas - allSectionCells.forEach( - selectedCell -> { - if (projectCell - .getIdReference() - .equals(selectedCell.getIdReference())) { - sameReferenceId.set(true); - if (projectCell - .getModificationDate() - .isAfter(selectedCell.getModificationDate())) { - allSectionCells.remove(selectedCell); - allSectionCells.add(projectCell); - } - } - }); - if (!sameReferenceId.get()) { - allSectionCells.add(projectCell); + Long idReference = projectCell.getIdReference(); + // Check if we have already seen a SectionCell with this idReference in + // our map + if (latestSectionCellsMap.containsKey(idReference)) { + SectionCell existingCell = latestSectionCellsMap.get(idReference); + // Compare modification dates. If the current cell is newer, replace + // the one in the map. + if (projectCell + .getModificationDate() + .isAfter(existingCell.getModificationDate())) { + latestSectionCellsMap.put(idReference, projectCell); + } + } else { + // If this is the first time we encounter this idReference, add the + // cell to the map. + latestSectionCellsMap.put(idReference, projectCell); } }); - return allSectionCells; + return new ArrayList<>(latestSectionCellsMap.values()); } // TODO: test diff --git a/MyINPulse-back/src/test/java/enseirb/myinpulse/SharedApiServiceTest.java b/MyINPulse-back/src/test/java/enseirb/myinpulse/SharedApiServiceTest.java index 7eb2b60..54f3573 100644 --- a/MyINPulse-back/src/test/java/enseirb/myinpulse/SharedApiServiceTest.java +++ b/MyINPulse-back/src/test/java/enseirb/myinpulse/SharedApiServiceTest.java @@ -391,15 +391,6 @@ public class SharedApiServiceTest { List resultList = TestUtils.toList(result); - // Assert - /* - assertEquals( - latestBeforeFilter.getIdReference(), resultList.get(0).getIdReference(), "The 0"); - assertEquals( - latestBeforeFilter.getIdReference(), resultList.get(1).getIdReference(), "The 1"); - assertEquals( - latestBeforeFilter.getIdReference(), resultList.get(2).getIdReference(), "The 2");*/ - assertEquals(1, resultList.size()); // Verify that the returned cell is the 'latestBeforeFilter' cell // Comparing by idSectionCell is a good way to verify the exact entity @@ -419,6 +410,156 @@ public class SharedApiServiceTest { "The returned cell should have the correct content."); } + /* + * Tests retrieving the most recent section cell for each unique idReference + * within a project when the user is authorized and cells exist. + * Verifies that only the latest version of each referenced cell is returned. + */ + // Tests getAllSectionCells + @Test + // Commenting out failing test - Removed this comment as we are fixing it + void testGetAllSectionCells_Authorized_FoundLatest() { + // Arrange: Create specific SectionCells for this test + // Define the idReference values we will use for grouping + Long refIdGroup1 = 101L; + Long refIdGroup2 = 102L; + Long refIdOtherProject = 103L; + + // --- Create and Add Cells for Group 1 (refIdGroup1) --- + // Create the older cell for group 1 + SectionCell tempOldCell1 = + getTestSectionCell( + staticAuthorizedProject, // Project + 1L, // Section ID (assuming this groups by section within refId) + "Ref1 Old", // Name + LocalDateTime.now().minusDays(3), // Date (older) + null); // Pass null or let getTestSectionCell handle it, we'll set + // idReference later + final SectionCell oldCell1 = + sectionCellService.addNewSectionCell(tempOldCell1); // Add to DB + + // Create the newer cell for group 1 + SectionCell tempNewerCell1 = + getTestSectionCell( + staticAuthorizedProject, // Project + 1L, // Section ID + "Ref1 Newer", // Name + LocalDateTime.now().minusDays(2), // Date (newer than oldCell1) + null); // Pass null + final SectionCell newerCell1 = + sectionCellService.addNewSectionCell(tempNewerCell1); // Add to DB + + // Now, update the idReference for both cells in Group 1 to the desired value + sectionCellService.updateSectionCellReferenceId(oldCell1.getIdSectionCell(), refIdGroup1); + sectionCellService.updateSectionCellReferenceId(newerCell1.getIdSectionCell(), refIdGroup1); + + // --- Create and Add Cells for Group 2 (refIdGroup2) --- + // Create the older cell for group 2 + SectionCell tempOldCell2 = + getTestSectionCell( + staticAuthorizedProject, // Project + 2L, // Section ID (different section) + "Ref2 Old", // Name + LocalDateTime.now().minusDays(1), // Date (older than newerCell2) + null); // Pass null + final SectionCell oldCell2 = + sectionCellService.addNewSectionCell(tempOldCell2); // Add to DB + + // Create the newer cell for group 2 + SectionCell tempNewerCell2 = + getTestSectionCell( + staticAuthorizedProject, // Project + 2L, // Section ID + "Ref2 Newer", // Name + LocalDateTime.now(), // Date (latest) + null); // Pass null + final SectionCell newerCell2 = + sectionCellService.addNewSectionCell(tempNewerCell2); // Add to DB + + // Now, update the idReference for both cells in Group 2 to the desired value + sectionCellService.updateSectionCellReferenceId(oldCell2.getIdSectionCell(), refIdGroup2); + sectionCellService.updateSectionCellReferenceId(newerCell2.getIdSectionCell(), refIdGroup2); + + // --- Create and Add Cell for Other Project (refIdOtherProject) --- + Project otherProject = + projectService.addNewProject( + getTestProject( + "other_project_for_cell_test", + administratorService.addAdministrator( + getTestAdmin("other_admin_cell_test")))); + + SectionCell tempOtherProjectCell = + getTestSectionCell( + otherProject, // DIFFERENT Project + 1L, // Section ID + "Other Project Cell", // Name + LocalDateTime.now(), // Date + null); // Pass null + final SectionCell otherProjectCell = + sectionCellService.addNewSectionCell(tempOtherProjectCell); // Add to DB + + // Now, update the idReference for the Other Project cell + sectionCellService.updateSectionCellReferenceId( + otherProjectCell.getIdSectionCell(), refIdOtherProject); + + // Act + // Ensure the service call uses the correct project ID and mail + Iterable result = + sharedApiService.getAllSectionCells( + staticAuthorizedProject.getIdProject(), // Use static project ID + staticAuthorizedMail); // Use static authorized mail + + List resultList = TestUtils.toList(result); + + // Assert + // We expect 2 cells from the staticAuthorizedProject: + // - The latest one from refIdGroup1 (newerCell1) + // - The latest one from refIdGroup2 (newerCell2) + assertEquals(2, resultList.size()); + + // Assert that the result list contains the LATEST cell from each group within the correct + // project + assertTrue( + resultList.stream() + .anyMatch( + cell -> + cell.getIdSectionCell() + .equals(newerCell1.getIdSectionCell())), + "Should contain the latest cell for Group 1"); // Add assertion message + assertTrue( + resultList.stream() + .anyMatch( + cell -> + cell.getIdSectionCell() + .equals(newerCell2.getIdSectionCell())), + "Should contain the latest cell for Group 2"); // Add assertion message + + // Assert that the result list does NOT contain the OLDER cells from the correct project + assertFalse( + resultList.stream() + .anyMatch( + cell -> + cell.getIdSectionCell() + .equals(oldCell1.getIdSectionCell())), + "Should not contain the older cell for Group 1"); // Add assertion message + assertFalse( + resultList.stream() + .anyMatch( + cell -> + cell.getIdSectionCell() + .equals(oldCell2.getIdSectionCell())), + "Should not contain the older cell for Group 2"); // Add assertion message + + // Assert that the result list does NOT contain the cell from the other project + assertFalse( + resultList.stream() + .anyMatch( + cell -> + cell.getIdSectionCell() + .equals(otherProjectCell.getIdSectionCell())), + "Should not contain cells from other projects"); // Add assertion message + } + /* * _____ _ ____ _ ____ _ _ ____ * |_ _|__ ___| |_ / ___| ___| |_| _ \ _ __ ___ (_) ___ ___| |_| __ ) _ _ @@ -717,109 +858,6 @@ public class SharedApiServiceTest { */ - /* these tests fail because of the use of mockito's eq(), - * and since thee instances are technically not the same as - * as the classes used to turn them into persistant data - * (for e.g id are set by DB) so I have to add some equal functions - * probably and look at peer tests to see what they have done but for now - * I pushed this half-human code. - */ - - /* - * Tests retrieving the most recent section cell for each unique idReference - * within a project when the user is authorized and cells exist. - * Verifies that only the latest version of each referenced cell is returned. - */ - // Tests getAllSectionCells - /*@Test*/ - // Commenting out failing test - void testGetAllSectionCells_Authorized_FoundLatest() { - // Arrange: Create specific SectionCells for this test - Long refId1 = 101L; - Long refId2 = 102L; - - SectionCell tempOldCell1 = - getTestSectionCell( - staticAuthorizedProject, 1L, "Ref1 Old", LocalDateTime.now().minusDays(3)); - tempOldCell1.setIdReference(refId1); - final SectionCell oldCell1 = sectionCellService.addNewSectionCell(tempOldCell1); - - SectionCell tempNewerCell1 = - getTestSectionCell( - staticAuthorizedProject, - 1L, - "Ref1 Newer", - LocalDateTime.now().minusDays(2)); - tempNewerCell1.setIdReference(refId1); - final SectionCell newerCell1 = sectionCellService.addNewSectionCell(tempNewerCell1); - - SectionCell tempOldCell2 = - getTestSectionCell( - staticAuthorizedProject, 2L, "Ref2 Old", LocalDateTime.now().minusDays(1)); - tempOldCell2.setIdReference(refId2); - final SectionCell oldCell2 = sectionCellService.addNewSectionCell(tempOldCell2); - - SectionCell tempNewerCell2 = - getTestSectionCell(staticAuthorizedProject, 2L, "Ref2 Newer", LocalDateTime.now()); - tempNewerCell2.setIdReference(refId2); - final SectionCell newerCell2 = sectionCellService.addNewSectionCell(tempNewerCell2); - - Project otherProject = - projectService.addNewProject( - getTestProject( - "other_project_for_cell_test", - administratorService.addAdministrator( - getTestAdmin("other_admin_cell_test")))); - SectionCell tempOtherProjectCell = - getTestSectionCell(otherProject, 1L, "Other Project Cell", LocalDateTime.now()); - tempOtherProjectCell.setIdReference(103L); - final SectionCell otherProjectCell = - sectionCellService.addNewSectionCell(tempOtherProjectCell); - - // Act - Iterable result = - sharedApiService.getAllSectionCells( - staticAuthorizedProject.getIdProject(), // Use static project ID - staticAuthorizedMail); // Use static authorized mail - - List resultList = TestUtils.toList(result); - - // Assert - assertEquals(2, resultList.size()); // Expect 2 cells (one per idReference) - - assertTrue( - resultList.stream() - .anyMatch( - cell -> - cell.getIdSectionCell() - .equals(newerCell1.getIdSectionCell()))); - assertTrue( - resultList.stream() - .anyMatch( - cell -> - cell.getIdSectionCell() - .equals(newerCell2.getIdSectionCell()))); - - assertFalse( - resultList.stream() - .anyMatch( - cell -> - cell.getIdSectionCell() - .equals(oldCell1.getIdSectionCell()))); - assertFalse( - resultList.stream() - .anyMatch( - cell -> - cell.getIdSectionCell() - .equals(oldCell2.getIdSectionCell()))); - assertFalse( - resultList.stream() - .anyMatch( - cell -> - cell.getIdSectionCell() - .equals(otherProjectCell.getIdSectionCell()))); - } - /* * Tests retrieving entrepreneurs linked to a project when the user is authorized * and entrepreneurs are linked.