package com.talentcard.server.upload;
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
|
import java.nio.file.Files;
|
import java.nio.file.Path;
|
import java.util.stream.Stream;
|
|
import com.talentcard.server.common.BusinessException;
|
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.io.TempDir;
|
import org.springframework.mock.web.MockMultipartFile;
|
|
class ImageUploadServiceTests {
|
|
@TempDir
|
Path temporaryDirectory;
|
|
@Test
|
void savesPngWithGeneratedFilename() throws Exception {
|
ImageUploadService service = new ImageUploadService(temporaryDirectory);
|
MockMultipartFile image = new MockMultipartFile(
|
"file", "cover.png", "image/png", new byte[] {(byte) 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a});
|
|
ImageUploadResult result = service.upload(image);
|
|
assertThat(result.url()).matches("/uploads/[0-9a-f-]+\\.png");
|
try (Stream<Path> files = Files.list(temporaryDirectory)) {
|
assertThat(files).hasSize(1);
|
}
|
}
|
|
@Test
|
void rejectsNonImageUploads() {
|
ImageUploadService service = new ImageUploadService(temporaryDirectory);
|
MockMultipartFile text = new MockMultipartFile("file", "cover.txt", "text/plain", "not an image".getBytes());
|
|
assertThatThrownBy(() -> service.upload(text))
|
.isInstanceOf(BusinessException.class)
|
.hasMessageContaining("Only JPG, PNG, and WEBP");
|
}
|
|
@Test
|
void savesPdfWithGeneratedFilename() throws Exception {
|
ImageUploadService service = new ImageUploadService(temporaryDirectory);
|
MockMultipartFile pdf = new MockMultipartFile("file", "window.pdf", "application/pdf", "%PDF-1.7".getBytes());
|
|
ImageUploadResult result = service.uploadPdf(pdf);
|
|
assertThat(result.url()).matches("/uploads/[0-9a-f-]+\\.pdf");
|
try (Stream<Path> files = Files.list(temporaryDirectory)) {
|
assertThat(files).hasSize(1);
|
}
|
}
|
|
@Test
|
void rejectsNonPdfUploads() {
|
ImageUploadService service = new ImageUploadService(temporaryDirectory);
|
MockMultipartFile image = new MockMultipartFile("file", "window.pdf", "application/pdf", "not a pdf".getBytes());
|
|
assertThatThrownBy(() -> service.uploadPdf(image))
|
.isInstanceOf(BusinessException.class)
|
.hasMessageContaining("仅支持 PDF");
|
}
|
}
|