backend-test #10
@ -25,8 +25,9 @@ import java.nio.file.StandardCopyOption;
|
|||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.Map;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class SharedApiService {
|
public class SharedApiService {
|
||||||
@ -95,31 +96,36 @@ public class SharedApiService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Project project = this.projectService.getProjectById(projectId);
|
Project project = this.projectService.getProjectById(projectId);
|
||||||
List<SectionCell> allSectionCells = new ArrayList<SectionCell>();
|
|
||||||
project.getListSectionCell()
|
Map<Long, SectionCell> 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(
|
.forEach(
|
||||||
projectCell -> {
|
projectCell -> {
|
||||||
AtomicBoolean sameReferenceId =
|
Long idReference = projectCell.getIdReference();
|
||||||
new AtomicBoolean(false); // side effect lambdas
|
// Check if we have already seen a SectionCell with this idReference in
|
||||||
allSectionCells.forEach(
|
// our map
|
||||||
selectedCell -> {
|
if (latestSectionCellsMap.containsKey(idReference)) {
|
||||||
if (projectCell
|
SectionCell existingCell = latestSectionCellsMap.get(idReference);
|
||||||
.getIdReference()
|
// Compare modification dates. If the current cell is newer, replace
|
||||||
.equals(selectedCell.getIdReference())) {
|
// the one in the map.
|
||||||
sameReferenceId.set(true);
|
if (projectCell
|
||||||
if (projectCell
|
.getModificationDate()
|
||||||
.getModificationDate()
|
.isAfter(existingCell.getModificationDate())) {
|
||||||
.isAfter(selectedCell.getModificationDate())) {
|
latestSectionCellsMap.put(idReference, projectCell);
|
||||||
allSectionCells.remove(selectedCell);
|
}
|
||||||
allSectionCells.add(projectCell);
|
} else {
|
||||||
}
|
// If this is the first time we encounter this idReference, add the
|
||||||
}
|
// cell to the map.
|
||||||
});
|
latestSectionCellsMap.put(idReference, projectCell);
|
||||||
if (!sameReferenceId.get()) {
|
|
||||||
allSectionCells.add(projectCell);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return allSectionCells;
|
return new ArrayList<>(latestSectionCellsMap.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: test
|
// TODO: test
|
||||||
|
@ -391,15 +391,6 @@ public class SharedApiServiceTest {
|
|||||||
|
|
||||||
List<SectionCell> resultList = TestUtils.toList(result);
|
List<SectionCell> 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());
|
assertEquals(1, resultList.size());
|
||||||
// Verify that the returned cell is the 'latestBeforeFilter' cell
|
// Verify that the returned cell is the 'latestBeforeFilter' cell
|
||||||
// Comparing by idSectionCell is a good way to verify the exact entity
|
// 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.");
|
"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<SectionCell> result =
|
||||||
|
sharedApiService.getAllSectionCells(
|
||||||
|
staticAuthorizedProject.getIdProject(), // Use static project ID
|
||||||
|
staticAuthorizedMail); // Use static authorized mail
|
||||||
|
|
||||||
|
List<SectionCell> 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<SectionCell> result =
|
|
||||||
sharedApiService.getAllSectionCells(
|
|
||||||
staticAuthorizedProject.getIdProject(), // Use static project ID
|
|
||||||
staticAuthorizedMail); // Use static authorized mail
|
|
||||||
|
|
||||||
List<SectionCell> 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
|
* Tests retrieving entrepreneurs linked to a project when the user is authorized
|
||||||
* and entrepreneurs are linked.
|
* and entrepreneurs are linked.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user