test: add StringNormalizerTest and AssetCleanupService unit tests

This commit is contained in:
2026-04-21 16:36:48 +02:00
parent 2e6ead0382
commit 8c04b9c755
2 changed files with 137 additions and 0 deletions
@@ -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");
}
}