Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DMP-4316: fix default sorting on tables on admin portal #2561

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@

import java.net.URI;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import static org.hamcrest.Matchers.hasSize;
import static org.junit.jupiter.params.provider.EnumSource.Mode.EXCLUDE;
Expand Down Expand Up @@ -312,6 +314,51 @@ void getMediaById_shouldReturnCaseWithCasIdAndActualHearing_whenMediaHasLinkedCa
.andExpect(jsonPath("$.hearings[0].courtroom.name").value(COURTROOM_NAME));
}

@Test
void getMediaById_shouldSortByCaseNumberDecending() throws Exception {
// Given
given.anAuthenticatedUserWithGlobalAccessAndRole(SecurityRoleEnum.SUPER_USER);


// Create hearing and mark it as actual
var hearingEntity1 = databaseStub.createHearing(COURTHOUSE_NAME, COURTROOM_NAME, "CASE_B", HEARING_START_AT.toLocalDateTime());
hearingEntity1.setHearingIsActual(true);
databaseStub.getHearingRepository().save(hearingEntity1);

var hearingEntity2 = databaseStub.createHearing(COURTHOUSE_NAME, COURTROOM_NAME, "CASE_C", HEARING_START_AT.toLocalDateTime());
hearingEntity2.setHearingIsActual(true);
databaseStub.getHearingRepository().save(hearingEntity2);

var hearingEntity3 = databaseStub.createHearing(COURTHOUSE_NAME, COURTROOM_NAME, "CASE_A", HEARING_START_AT.toLocalDateTime());
hearingEntity3.setHearingIsActual(true);
databaseStub.getHearingRepository().save(hearingEntity3);

UserAccountEntity userAccountEntity = databaseStub.getUserAccountRepository().findAll()
.stream()
.findFirst()
.orElseThrow();

// Create media and link it to hearing
var mediaEntity = createAndSaveMediaEntity(List.of(hearingEntity1, hearingEntity2, hearingEntity3), userAccountEntity, false);

// Create media linked case with court case
databaseStub.createMediaLinkedCase(mediaEntity, hearingEntity1.getCourtCase());
databaseStub.createMediaLinkedCase(mediaEntity, hearingEntity2.getCourtCase());
databaseStub.createMediaLinkedCase(mediaEntity, hearingEntity3.getCourtCase());

// When
mockMvc.perform(get(ENDPOINT.resolve(String.valueOf(mediaEntity.getId()))))
.andExpect(status().isOk())
.andExpect(jsonPath("$.cases", hasSize(3)))
.andExpect(jsonPath("$.cases[0].case_number").value("CASE_C"))
.andExpect(jsonPath("$.cases[1].case_number").value("CASE_B"))
.andExpect(jsonPath("$.cases[2].case_number").value("CASE_A"))
.andExpect(jsonPath("$.hearings", hasSize(3)))
.andExpect(jsonPath("$.hearings[0].case_number").value("CASE_C"))
.andExpect(jsonPath("$.hearings[1].case_number").value("CASE_B"))
.andExpect(jsonPath("$.hearings[2].case_number").value("CASE_A"));
}

@Test
void getMediaById_shouldReturnCaseWithBaseDetails_whenCaseHasNoCourtCaseRecord() throws Exception {
// Given
Expand All @@ -321,7 +368,7 @@ void getMediaById_shouldReturnCaseWithBaseDetails_whenCaseHasNoCourtCaseRecord()
.orElseThrow();

// Create media without hearing
var mediaEntity = createAndSaveMediaEntity(null, userAccountEntity, false);
var mediaEntity = createAndSaveMediaEntity(new ArrayList<>(), userAccountEntity, false);

// Create media linked case without court case
databaseStub.createMediaLinkedCase(
Expand All @@ -342,6 +389,10 @@ void getMediaById_shouldReturnCaseWithBaseDetails_whenCaseHasNoCourtCaseRecord()
}

private MediaEntity createAndSaveMediaEntity(HearingEntity hearingEntity, UserAccountEntity userAccountEntity, boolean isDeleted) {
return createAndSaveMediaEntity(List.of(hearingEntity), userAccountEntity, isDeleted);
}

private MediaEntity createAndSaveMediaEntity(List<HearingEntity> hearingEntities, UserAccountEntity userAccountEntity, boolean isDeleted) {
MediaEntity mediaEntity = databaseStub.createMediaEntity(COURTHOUSE_NAME,
COURTROOM_NAME,
MEDIA_START_AT,
Expand All @@ -361,20 +412,18 @@ private MediaEntity createAndSaveMediaEntity(HearingEntity hearingEntity, UserAc
mediaEntity.setLastModifiedBy(userAccountEntity);
mediaEntity.setIsCurrent(true);

mediaEntity.setHearingList(Collections.singletonList(hearingEntity));
if (hearingEntity != null) {
mediaEntity.setHearingList(Collections.singletonList(hearingEntity));
mediaEntity.setHearingList(hearingEntities);
for (HearingEntity hearingEntity : hearingEntities) {
hearingEntity.setMediaList(Collections.singletonList(mediaEntity));
databaseStub.getHearingRepository()
.save(hearingEntity);
databaseStub.getHearingRepository().save(hearingEntity);
}

return databaseStub.getMediaRepository()
.saveAndFlush(mediaEntity);
}

private MediaEntity createAndSaveMediaEntityWithHiddenAndDeletedAndCurrentSetFalse(HearingEntity hearingEntity, UserAccountEntity userAccountEntity) {
var mediaEntity = createAndSaveMediaEntity(hearingEntity, userAccountEntity, false);
var mediaEntity = createAndSaveMediaEntity(List.of(hearingEntity), userAccountEntity, false);

mediaEntity.setHidden(false);
mediaEntity.setIsCurrent(false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,8 @@ void getMediasMarkedForDeletionShouldReturnExpectedResponseWhenMediaExistsWithDe
userAccountStub.getSystemUserAccountEntity());

// And a media that's marked for deletion, but not yet approved for deletion (not marked for manual deletion)
var expectedMediaEntity = createAndSaveMediaEntity(courtroomEntity);
var expectedObjectAdminActionEntity = objectAdminActionStub.createAndSave(ObjectAdminActionStub.ObjectAdminActionSpec.builder()
var expectedMediaEntity = createAndSaveMediaEntity(courtroomEntity, 1);
objectAdminActionStub.createAndSave(ObjectAdminActionStub.ObjectAdminActionSpec.builder()
.media(expectedMediaEntity)
.objectHiddenReason(
objectHiddenReasonStub.getAnyWithMarkedForDeletion(true))
Expand Down Expand Up @@ -130,8 +130,104 @@ void getMediasMarkedForDeletionShouldReturnExpectedResponseWhenMediaExistsWithDe
]
}
}
]""".formatted(expectedMediaEntity.getId(),
expectedObjectAdminActionEntity.getId()),
]""",
mvcResult.getResponse().getContentAsString(),
JSONCompareMode.NON_EXTENSIBLE);
}

@Test
void getMediasMarkedForDeletion_shouldSortMediaByChannelAscending() throws Exception {
// Given
superAdminUserStub.givenUserIsAuthorised(userIdentity);

var courtroomEntity = courtroomStub.createCourtroomUnlessExists("Test Courthouse", "Test Courtroom",
userAccountStub.getSystemUserAccountEntity());

// And a media that's marked for deletion, but not yet approved for deletion (not marked for manual deletion)
var expectedMediaEntity1 = createAndSaveMediaEntity(courtroomEntity, 2);
var expectedMediaEntity2 = createAndSaveMediaEntity(courtroomEntity, 1);
var expectedMediaEntity3 = createAndSaveMediaEntity(courtroomEntity, 3);
objectAdminActionStub.createAndSave(ObjectAdminActionStub.ObjectAdminActionSpec.builder()
.media(expectedMediaEntity1)
.objectHiddenReason(
objectHiddenReasonStub.getAnyWithMarkedForDeletion(true))
.markedForManualDeletion(false)
.markedForManualDelBy(null)
.markedForManualDelDateTime(null)
.build());
objectAdminActionStub.createAndSave(ObjectAdminActionStub.ObjectAdminActionSpec.builder()
.media(expectedMediaEntity2)
.objectHiddenReason(
objectHiddenReasonStub.getAnyWithMarkedForDeletion(true))
.markedForManualDeletion(false)
.markedForManualDelBy(null)
.markedForManualDelDateTime(null)
.build());
objectAdminActionStub.createAndSave(ObjectAdminActionStub.ObjectAdminActionSpec.builder()
.media(expectedMediaEntity3)
.objectHiddenReason(
objectHiddenReasonStub.getAnyWithMarkedForDeletion(true))
.markedForManualDeletion(false)
.markedForManualDelBy(null)
.markedForManualDelDateTime(null)
.build());

// When
MvcResult mvcResult = mockMvc.perform(
get(ENDPOINT)
.contentType("application/json"))
.andExpect(status().isOk())
.andReturn();

// Then
JSONAssert.assertEquals("""
[
{
"media": [
{
"id": 2,
"channel": 1,
"total_channels": 2,
"is_current": true,
"version_count": 0
},
{
"id": 1,
"channel": 2,
"total_channels": 2,
"is_current": true,
"version_count": 0
},
{
"id": 3,
"channel": 3,
"total_channels": 2,
"is_current": true,
"version_count": 0
}
],
"start_at": "2024-01-01T00:00:00Z",
"end_at": "2024-01-01T00:00:00Z",
"courthouse": {
"id": 1,
"display_name": "TEST COURTHOUSE"
},
"courtroom": {
"id": 1,
"name": "TEST COURTROOM"
},
"admin_action": {
"ticket_reference": "Some ticket reference",
"hidden_by_id": 0,
"reason_id": 1,
"comments": [
"Some comment",
"Some comment",
"Some comment"
]
}
}
]""",
mvcResult.getResponse().getContentAsString(),
JSONCompareMode.NON_EXTENSIBLE);
}
Expand Down Expand Up @@ -160,12 +256,12 @@ void getMediasMarkedForDeletionShouldFailWhenUserIsNotAuthorised() throws Except
JSONCompareMode.NON_EXTENSIBLE);
}

private MediaEntity createAndSaveMediaEntity(CourtroomEntity courtroomEntity) {
private MediaEntity createAndSaveMediaEntity(CourtroomEntity courtroomEntity, int channel) {
return mediaStub.createMediaEntity(courtroomEntity.getCourthouse().getCourthouseName(),
courtroomEntity.getName(),
OffsetDateTime.parse("2024-01-01T00:00:00Z"),
OffsetDateTime.parse("2024-01-01T00:00:00Z"),
1,
channel,
"MP2");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,10 @@ public AdminMediaResponse getMediasById(Integer id) {
var mediaEntity = mediaRepository.findById(id)
.orElseThrow(() -> new DartsApiException(AudioApiError.MEDIA_NOT_FOUND));

return adminMediaMapper.toApiModel(mediaEntity);
AdminMediaResponse adminMediaResponse = adminMediaMapper.toApiModel(mediaEntity);
adminMediaResponse.getCases().sort((o1, o2) -> o2.getCaseNumber().compareTo(o1.getCaseNumber()));
adminMediaResponse.getHearings().sort((o1, o2) -> o2.getCaseNumber().compareTo(o1.getCaseNumber()));
return adminMediaResponse;
}

@Override
Expand Down Expand Up @@ -151,7 +154,12 @@ public List<GetAdminMediasMarkedForDeletionItem> getMediasMarkedForDeletion() {
.stream()
.filter(objectAdminActionEntities -> !objectAdminActionEntities.isEmpty())
.map(actions -> toGetAdminMediasMarkedForDeletionItem(actions))
.toList();
.peek(getAdminMediasMarkedForDeletionItem -> {
//We need to add the Media Entities to a List that supports sorting as the default one from Hibernate does not
List<GetAdminMediasMarkedForDeletionMediaItem> mediaEntities = new ArrayList<>(getAdminMediasMarkedForDeletionItem.getMedia());
mediaEntities.sort((o1, o2) -> o1.getChannel().compareTo(o2.getChannel()));
getAdminMediasMarkedForDeletionItem.setMedia(mediaEntities);
}).toList();
}

GetAdminMediasMarkedForDeletionItem toGetAdminMediasMarkedForDeletionItem(List<ObjectAdminActionEntity> actions) {
Expand Down