mirror of
https://github.com/imgfloat/server.git
synced 2026-05-08 10:19:35 +00:00
test: add StringNormalizerTest and AssetCleanupService unit tests
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
package dev.kruhlmann.imgfloat.service;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.anySet;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import dev.kruhlmann.imgfloat.model.db.imgfloat.Asset;
|
||||
import dev.kruhlmann.imgfloat.model.db.imgfloat.ScriptAsset;
|
||||
import dev.kruhlmann.imgfloat.model.db.imgfloat.ScriptAssetAttachment;
|
||||
import dev.kruhlmann.imgfloat.repository.AssetRepository;
|
||||
import dev.kruhlmann.imgfloat.repository.ScriptAssetAttachmentRepository;
|
||||
import dev.kruhlmann.imgfloat.repository.ScriptAssetRepository;
|
||||
import dev.kruhlmann.imgfloat.model.AssetType;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
class AssetCleanupServiceTest {
|
||||
|
||||
private AssetRepository assetRepository;
|
||||
private AssetStorageService assetStorageService;
|
||||
private ScriptAssetAttachmentRepository attachmentRepository;
|
||||
private ScriptAssetRepository scriptAssetRepository;
|
||||
private AssetCleanupService service;
|
||||
|
||||
@BeforeEach
|
||||
void setup() {
|
||||
assetRepository = mock(AssetRepository.class);
|
||||
assetStorageService = mock(AssetStorageService.class);
|
||||
attachmentRepository = mock(ScriptAssetAttachmentRepository.class);
|
||||
scriptAssetRepository = mock(ScriptAssetRepository.class);
|
||||
service = new AssetCleanupService(
|
||||
assetRepository, assetStorageService, attachmentRepository, scriptAssetRepository
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
void cleanupPassesAllReferencedIdsToStorageService() {
|
||||
Asset asset = new Asset("broadcaster", AssetType.IMAGE);
|
||||
String assetId = asset.getId(); // UUID generated by constructor
|
||||
|
||||
ScriptAsset script = new ScriptAsset();
|
||||
script.setId("script-1");
|
||||
script.setSourceFileId("source-file-1");
|
||||
script.setLogoFileId("logo-file-1");
|
||||
|
||||
ScriptAssetAttachment attachment = new ScriptAssetAttachment("script-1", "attach.png");
|
||||
attachment.setFileId("attachment-file-1");
|
||||
|
||||
when(assetRepository.findAll()).thenReturn(List.of(asset));
|
||||
when(scriptAssetRepository.findAll()).thenReturn(List.of(script));
|
||||
when(attachmentRepository.findAll()).thenReturn(List.of(attachment));
|
||||
|
||||
service.cleanup();
|
||||
|
||||
ArgumentCaptor<Set<String>> captor = ArgumentCaptor.forClass((Class) Set.class);
|
||||
verify(assetStorageService).deleteOrphanedAssets(captor.capture());
|
||||
Set<String> referenced = captor.getValue();
|
||||
assertThat(referenced).contains(assetId, "source-file-1", "logo-file-1", "attachment-file-1");
|
||||
}
|
||||
|
||||
@Test
|
||||
void cleanupIncludesAttachmentIdWhenFileIdIsNull() {
|
||||
ScriptAssetAttachment attachment = new ScriptAssetAttachment("script-1", "attach.png");
|
||||
attachment.setId("fallback-id");
|
||||
attachment.setFileId(null);
|
||||
|
||||
when(assetRepository.findAll()).thenReturn(List.of());
|
||||
when(scriptAssetRepository.findAll()).thenReturn(List.of());
|
||||
when(attachmentRepository.findAll()).thenReturn(List.of(attachment));
|
||||
|
||||
service.cleanup();
|
||||
|
||||
ArgumentCaptor<Set<String>> captor = ArgumentCaptor.forClass((Class) Set.class);
|
||||
verify(assetStorageService).deleteOrphanedAssets(captor.capture());
|
||||
assertThat(captor.getValue()).contains("fallback-id");
|
||||
}
|
||||
|
||||
@Test
|
||||
void cleanupSkipsBlankScriptFileIds() {
|
||||
ScriptAsset script = new ScriptAsset();
|
||||
script.setId("script-1");
|
||||
script.setSourceFileId(null);
|
||||
script.setLogoFileId(" ");
|
||||
|
||||
when(assetRepository.findAll()).thenReturn(List.of());
|
||||
when(scriptAssetRepository.findAll()).thenReturn(List.of(script));
|
||||
when(attachmentRepository.findAll()).thenReturn(List.of());
|
||||
|
||||
service.cleanup();
|
||||
|
||||
ArgumentCaptor<Set<String>> captor = ArgumentCaptor.forClass((Class) Set.class);
|
||||
verify(assetStorageService).deleteOrphanedAssets(captor.capture());
|
||||
assertThat(captor.getValue()).doesNotContain(" ").doesNotContain("script-1");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package dev.kruhlmann.imgfloat.util;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
class StringNormalizerTest {
|
||||
|
||||
@Test
|
||||
void toLowerCaseRootReturnsNullForNull() {
|
||||
assertThat(StringNormalizer.toLowerCaseRoot(null)).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
void toLowerCaseRootConvertsToLowercase() {
|
||||
assertThat(StringNormalizer.toLowerCaseRoot("Hello")).isEqualTo("hello");
|
||||
assertThat(StringNormalizer.toLowerCaseRoot("BROADCASTER")).isEqualTo("broadcaster");
|
||||
assertThat(StringNormalizer.toLowerCaseRoot("MiXeDcAsE")).isEqualTo("mixedcase");
|
||||
}
|
||||
|
||||
@Test
|
||||
void toLowerCaseRootHandlesAlreadyLowercase() {
|
||||
assertThat(StringNormalizer.toLowerCaseRoot("already_lower")).isEqualTo("already_lower");
|
||||
}
|
||||
|
||||
@Test
|
||||
void toLowerCaseRootHandlesEmptyString() {
|
||||
assertThat(StringNormalizer.toLowerCaseRoot("")).isEqualTo("");
|
||||
}
|
||||
|
||||
@Test
|
||||
void toLowerCaseRootUsesRootLocale() {
|
||||
// Turkish locale would uppercase 'i' to 'İ' but ROOT locale must not
|
||||
assertThat(StringNormalizer.toLowerCaseRoot("TITLE")).isEqualTo("title");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user