mirror of
https://github.com/imgfloat/server.git
synced 2026-02-05 11:49:25 +00:00
Refactor
This commit is contained in:
@@ -8,6 +8,10 @@ import com.imgfloat.app.model.Channel;
|
||||
import com.imgfloat.app.repository.AssetRepository;
|
||||
import com.imgfloat.app.repository.ChannelRepository;
|
||||
import com.imgfloat.app.service.ChannelDirectoryService;
|
||||
import com.imgfloat.app.service.AssetStorageService;
|
||||
import com.imgfloat.app.service.media.MediaDetectionService;
|
||||
import com.imgfloat.app.service.media.MediaOptimizationService;
|
||||
import com.imgfloat.app.service.media.MediaPreviewService;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
@@ -52,8 +56,12 @@ class ChannelDirectoryServiceTest {
|
||||
setupInMemoryPersistence();
|
||||
Path assetRoot = Files.createTempDirectory("imgfloat-assets-test");
|
||||
Path previewRoot = Files.createTempDirectory("imgfloat-previews-test");
|
||||
AssetStorageService assetStorageService = new AssetStorageService(assetRoot.toString(), previewRoot.toString());
|
||||
MediaPreviewService mediaPreviewService = new MediaPreviewService();
|
||||
MediaOptimizationService mediaOptimizationService = new MediaOptimizationService(mediaPreviewService);
|
||||
MediaDetectionService mediaDetectionService = new MediaDetectionService();
|
||||
service = new ChannelDirectoryService(channelRepository, assetRepository, messagingTemplate,
|
||||
assetRoot.toString(), previewRoot.toString());
|
||||
assetStorageService, mediaDetectionService, mediaOptimizationService);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
package com.imgfloat.app.service;
|
||||
|
||||
import com.imgfloat.app.service.media.AssetContent;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
|
||||
class AssetStorageServiceTest {
|
||||
private AssetStorageService service;
|
||||
private Path assets;
|
||||
private Path previews;
|
||||
|
||||
@BeforeEach
|
||||
void setUp() throws IOException {
|
||||
assets = Files.createTempDirectory("asset-storage-service");
|
||||
previews = Files.createTempDirectory("preview-storage-service");
|
||||
service = new AssetStorageService(assets.toString(), previews.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
void refusesToStoreEmptyAsset() {
|
||||
assertThatThrownBy(() -> service.storeAsset("caster", "id", new byte[0], "image/png"))
|
||||
.isInstanceOf(IOException.class)
|
||||
.hasMessageContaining("empty");
|
||||
}
|
||||
|
||||
@Test
|
||||
void storesAndLoadsAssets() throws IOException {
|
||||
byte[] bytes = new byte[]{1, 2, 3};
|
||||
|
||||
String path = service.storeAsset("caster", "id", bytes, "image/png");
|
||||
assertThat(Files.exists(Path.of(path))).isTrue();
|
||||
|
||||
AssetContent loaded = service.loadAssetFile(path, "image/png").orElseThrow();
|
||||
assertThat(loaded.bytes()).containsExactly(bytes);
|
||||
assertThat(loaded.mediaType()).isEqualTo("image/png");
|
||||
}
|
||||
|
||||
@Test
|
||||
void ignoresEmptyPreview() throws IOException {
|
||||
assertThat(service.storePreview("caster", "id", new byte[0])).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
void storesAndLoadsPreviews() throws IOException {
|
||||
byte[] preview = new byte[]{9, 8, 7};
|
||||
|
||||
String path = service.storePreview("caster", "id", preview);
|
||||
assertThat(service.loadPreview(path)).isPresent();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package com.imgfloat.app.service.media;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.mock.web.MockMultipartFile;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
class MediaDetectionServiceTest {
|
||||
private final MediaDetectionService service = new MediaDetectionService();
|
||||
|
||||
@Test
|
||||
void prefersProvidedContentType() throws IOException {
|
||||
MockMultipartFile file = new MockMultipartFile("file", "image.png", "image/png", new byte[]{1, 2, 3});
|
||||
|
||||
assertThat(service.detectMediaType(file, file.getBytes())).isEqualTo("image/png");
|
||||
}
|
||||
|
||||
@Test
|
||||
void fallsBackToFilenameAndStream() throws IOException {
|
||||
byte[] png = new byte[]{(byte) 0x89, 0x50, 0x4E, 0x47};
|
||||
MockMultipartFile file = new MockMultipartFile("file", "picture.png", null, png);
|
||||
|
||||
assertThat(service.detectMediaType(file, file.getBytes())).isEqualTo("image/png");
|
||||
}
|
||||
|
||||
@Test
|
||||
void returnsOctetStreamForUnknownType() throws IOException {
|
||||
MockMultipartFile file = new MockMultipartFile("file", "unknown.bin", null, new byte[]{1, 2, 3});
|
||||
|
||||
assertThat(service.detectMediaType(file, file.getBytes())).isEqualTo("application/octet-stream");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
package com.imgfloat.app.service.media;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
class MediaOptimizationServiceTest {
|
||||
private MediaOptimizationService service;
|
||||
|
||||
@BeforeEach
|
||||
void setUp() {
|
||||
service = new MediaOptimizationService(new MediaPreviewService());
|
||||
}
|
||||
|
||||
@Test
|
||||
void returnsNullForEmptyInput() throws IOException {
|
||||
assertThat(service.optimizeAsset(new byte[0], "image/png")).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
void optimizesPngImages() throws IOException {
|
||||
byte[] png = samplePng();
|
||||
|
||||
OptimizedAsset optimized = service.optimizeAsset(png, "image/png");
|
||||
|
||||
assertThat(optimized).isNotNull();
|
||||
assertThat(optimized.mediaType()).isEqualTo("image/png");
|
||||
assertThat(optimized.width()).isEqualTo(2);
|
||||
assertThat(optimized.height()).isEqualTo(2);
|
||||
assertThat(optimized.previewBytes()).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
void returnsNullForUnsupportedBytes() throws IOException {
|
||||
OptimizedAsset optimized = service.optimizeAsset(new byte[]{1, 2, 3}, "application/octet-stream");
|
||||
|
||||
assertThat(optimized).isNull();
|
||||
}
|
||||
|
||||
private byte[] samplePng() throws IOException {
|
||||
BufferedImage image = new BufferedImage(2, 2, BufferedImage.TYPE_INT_ARGB);
|
||||
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
|
||||
ImageIO.write(image, "png", out);
|
||||
return out.toByteArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user