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 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 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"); } }