Skip to content
Merged
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
51 changes: 51 additions & 0 deletions src/test/java/org/folio/dataexp/service/JobProfileServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,14 @@
import java.util.List;
import java.util.Set;
import java.util.UUID;
import org.folio.dataexp.TestMate;
import org.folio.dataexp.client.UserClient;
import org.folio.dataexp.domain.dto.JobExecution;
import org.folio.dataexp.domain.dto.JobExecutionExportedFilesInner;
import org.folio.dataexp.domain.dto.JobProfile;
import org.folio.dataexp.domain.dto.Metadata;
import org.folio.dataexp.domain.dto.User;
import org.folio.dataexp.domain.dto.UserInfo;
import org.folio.dataexp.domain.entity.JobProfileEntity;
import org.folio.dataexp.exception.job.profile.DefaultJobProfileException;
import org.folio.dataexp.exception.job.profile.LockJobProfileException;
Expand Down Expand Up @@ -885,6 +887,55 @@ void shouldHandleUnlockingWhenCurrentUserHasPermission() {
assertThat(savedProfile.getLockedAt()).isNull();
}

@Test
@TestMate(name = "TestMate-029c7d5c8c6c036fad395b01ed77f442")
void postJobProfileShouldLockProfileWhenLockedIsTrueAndPermissionExists() {
// Given
jobProfile.setLocked(TRUE);
when(folioExecutionContext.getUserId()).thenReturn(userId);
when(userClient.getUserById(userId.toString())).thenReturn(user);
when(permissionsValidator.checkLockJobProfilePermission()).thenReturn(true);
when(jobProfileEntityRepository.save(any(JobProfileEntity.class)))
.thenAnswer(
invocation -> {
// Simulate DB saving and returning the saved entity
return invocation.getArgument(0);
});
// When
JobProfile savedProfile = jobProfileService.postJobProfile(jobProfile);
// Then
verify(permissionsValidator).checkLockJobProfilePermission();
verify(jobProfileEntityRepository).save(jobProfileEntityCaptor.capture());
JobProfile capturedProfile = jobProfileEntityCaptor.getValue().getJobProfile();
assertThat(savedProfile).isSameAs(capturedProfile);
assertThat(savedProfile.getLocked()).isTrue();
assertThat(savedProfile.getLockedBy()).isEqualTo(userId);
assertThat(savedProfile.getLockedAt()).isNotNull();
Metadata metadata = savedProfile.getMetadata();
assertThat(metadata.getCreatedByUserId()).isEqualTo(userId.toString());
assertThat(metadata.getUpdatedByUserId()).isEqualTo(userId.toString());
UserInfo userInfo = savedProfile.getUserInfo();
assertThat(userInfo.getFirstName()).isEqualTo("Test");
assertThat(userInfo.getLastName()).isEqualTo("User");
assertThat(userInfo.getUserName()).isEqualTo("testuser");
}

@Test
@TestMate(name = "TestMate-cb876ac745b745330a34d6ebf401dcba")
void postJobProfileShouldThrowExceptionWhenLockingAndPermissionIsMissing() {
// Given
jobProfile.setLocked(TRUE);
when(folioExecutionContext.getUserId()).thenReturn(userId);
when(userClient.getUserById(userId.toString())).thenReturn(user);
when(permissionsValidator.checkLockJobProfilePermission()).thenReturn(false);
// When & Then
assertThatThrownBy(() -> jobProfileService.postJobProfile(jobProfile))
.isInstanceOf(LockJobProfilePermissionException.class)
.hasMessage("You do not have permission to lock this profile.");
verify(permissionsValidator).checkLockJobProfilePermission();
verify(jobProfileEntityRepository, never()).save(any(JobProfileEntity.class));
}

// Helper methods

private JobExecution createJobExecution(UUID id, String profileName, UUID profileId) {
Expand Down
174 changes: 174 additions & 0 deletions src/test/java/org/folio/dataexp/service/StorageCleanUpServiceTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
package org.folio.dataexp.service;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.stream.Stream;
import org.folio.dataexp.TestMate;
import org.folio.dataexp.domain.dto.FileDefinition;
import org.folio.dataexp.domain.entity.FileDefinitionEntity;
import org.folio.dataexp.repository.FileDefinitionEntityRepository;
import org.folio.dataexp.util.S3FilePathUtils;
import org.folio.s3.client.FolioS3Client;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.test.util.ReflectionTestUtils;

@ExtendWith(MockitoExtension.class)
class StorageCleanUpServiceTest {

@Mock private FileDefinitionEntityRepository fileDefinitionEntityRepository;

@Mock private FolioS3Client storageClient;

@InjectMocks private StorageCleanUpService storageCleanUpService;

@Captor private ArgumentCaptor<FileDefinitionEntity> fileDefinitionEntityCaptor;

private static Stream<String> emptyDelayProvider() {
return Stream.of(null, "");
}

@Test
@TestMate(name = "TestMate-3d5279a2547feaa5ee0c3879052df208")
void cleanExpiredFilesAndFileDefinitionsShouldDeleteExpiredFilesAndDefinitions() {
try (MockedStatic<S3FilePathUtils> s3FilePathUtilsMockedStatic =
mockStatic(S3FilePathUtils.class)) {
// Given
ReflectionTestUtils.setField(storageCleanUpService, "cleanUpFilesDelay", "24");
var fileDefinition1 =
new FileDefinition()
.id(UUID.fromString("a72432c0-8a56-45a4-9264-3990666345a8"))
.fileName("file1.csv");
var fileDefinitionEntity1 =
FileDefinitionEntity.builder().fileDefinition(fileDefinition1).build();
var path1 = "path/to/file1.csv";
var fileDefinition2 =
new FileDefinition()
.id(UUID.fromString("f36551b3-4983-4f32-a5d6-0a693c10a316"))
.fileName("file2.csv");
var fileDefinitionEntity2 =
FileDefinitionEntity.builder().fileDefinition(fileDefinition2).build();
var path2 = "path/to/file2.csv";
var expiredEntities = List.of(fileDefinitionEntity1, fileDefinitionEntity2);
when(fileDefinitionEntityRepository.getExpiredEntities(any(Date.class)))
.thenReturn(expiredEntities);
s3FilePathUtilsMockedStatic
.when(
() ->
S3FilePathUtils.getPathToUploadedFiles(
fileDefinition1.getId(), fileDefinition1.getFileName()))
.thenReturn(path1);
s3FilePathUtilsMockedStatic
.when(
() ->
S3FilePathUtils.getPathToUploadedFiles(
fileDefinition2.getId(), fileDefinition2.getFileName()))
.thenReturn(path2);
// When
storageCleanUpService.cleanExpiredFilesAndFileDefinitions();
// Then
verify(storageClient, times(2)).remove(any(String.class));
verify(storageClient).remove(path1);
verify(storageClient).remove(path2);
verify(fileDefinitionEntityRepository, times(2)).delete(fileDefinitionEntityCaptor.capture());
assertThat(fileDefinitionEntityCaptor.getAllValues())
.containsExactlyInAnyOrder(fileDefinitionEntity1, fileDefinitionEntity2);
}
}

@Test
@TestMate(name = "TestMate-d683600f14b8bc58f1fe10bde54c70fb")
void cleanExpiredFilesAndFileDefinitionsShouldDoNothingWhenNoFilesExpired() {
// Given
ReflectionTestUtils.setField(storageCleanUpService, "cleanUpFilesDelay", "24");
when(fileDefinitionEntityRepository.getExpiredEntities(any(Date.class)))
.thenReturn(Collections.emptyList());
// When
storageCleanUpService.cleanExpiredFilesAndFileDefinitions();
// Then
verify(storageClient, never()).remove(any(String.class));
verify(fileDefinitionEntityRepository, never()).delete(any(FileDefinitionEntity.class));
}

@ParameterizedTest
@TestMate(name = "TestMate-d55056655d850cc9e9572e201b440a92")
@ValueSource(strings = {"invalid-value", "-10"})
void cleanExpiredFilesAndFileDefinitionsShouldUseDefaultExpirationWhenDelayIsInvalid(
String invalidDelay) {
try (MockedStatic<S3FilePathUtils> s3FilePathUtilsMockedStatic =
mockStatic(S3FilePathUtils.class)) {
// Given
ReflectionTestUtils.setField(storageCleanUpService, "cleanUpFilesDelay", invalidDelay);
var fileDefinition =
new FileDefinition()
.id(UUID.fromString("a72432c0-8a56-45a4-9264-3990666345a8"))
.fileName("expired_file.csv");
var fileDefinitionEntity =
FileDefinitionEntity.builder().fileDefinition(fileDefinition).build();
var expiredEntities = List.of(fileDefinitionEntity);
var expectedPath = "path/to/expired_file.csv";
when(fileDefinitionEntityRepository.getExpiredEntities(any(Date.class)))
.thenReturn(expiredEntities);
s3FilePathUtilsMockedStatic
.when(() -> S3FilePathUtils.getPathToUploadedFiles(any(UUID.class), anyString()))
.thenReturn(expectedPath);
// When
storageCleanUpService.cleanExpiredFilesAndFileDefinitions();
// Then
verify(storageClient).remove(expectedPath);
verify(fileDefinitionEntityRepository).delete(fileDefinitionEntityCaptor.capture());
assertThat(fileDefinitionEntityCaptor.getValue()).isEqualTo(fileDefinitionEntity);
}
}

@ParameterizedTest
@TestMate(name = "TestMate-02eafb490bd2a9cdd3ef22c8628deabf")
@MethodSource("emptyDelayProvider")
void cleanExpiredFilesAndFileDefinitionsShouldUseDefaultExpirationWhenDelayIsEmpty(
String emptyDelay) {
try (MockedStatic<S3FilePathUtils> s3FilePathUtilsMockedStatic =
mockStatic(S3FilePathUtils.class)) {
// Given
ReflectionTestUtils.setField(storageCleanUpService, "cleanUpFilesDelay", emptyDelay);
var fileDefinition =
new FileDefinition()
.id(UUID.fromString("a72432c0-8a56-45a4-9264-3990666345a8"))
.fileName("expired-file.csv");
var fileDefinitionEntity =
FileDefinitionEntity.builder().fileDefinition(fileDefinition).build();
var expiredEntities = List.of(fileDefinitionEntity);
var expectedPath = "path/to/expired-file.csv";
when(fileDefinitionEntityRepository.getExpiredEntities(any(Date.class)))
.thenReturn(expiredEntities);
s3FilePathUtilsMockedStatic
.when(() -> S3FilePathUtils.getPathToUploadedFiles(any(UUID.class), anyString()))
.thenReturn(expectedPath);
// When
storageCleanUpService.cleanExpiredFilesAndFileDefinitions();
// Then
verify(storageClient).remove(expectedPath);
verify(fileDefinitionEntityRepository).delete(fileDefinitionEntityCaptor.capture());
assertThat(fileDefinitionEntityCaptor.getValue()).isEqualTo(fileDefinitionEntity);
}
}
}
Loading