diff --git a/src/main/java/run/halo/app/service/impl/AttachmentServiceImpl.java b/src/main/java/run/halo/app/service/impl/AttachmentServiceImpl.java index 01d9b38d0..478542b53 100644 --- a/src/main/java/run/halo/app/service/impl/AttachmentServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/AttachmentServiceImpl.java @@ -1,5 +1,6 @@ package run.halo.app.service.impl; +import java.nio.charset.StandardCharsets; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; @@ -18,6 +19,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.util.UriUtils; import run.halo.app.exception.AlreadyExistsException; import run.halo.app.handler.file.FileHandlers; import run.halo.app.model.dto.AttachmentDTO; @@ -30,6 +32,7 @@ import run.halo.app.repository.AttachmentRepository; import run.halo.app.service.AttachmentService; import run.halo.app.service.OptionService; import run.halo.app.service.base.AbstractCrudService; +import run.halo.app.utils.FilenameUtils; import run.halo.app.utils.HaloUtils; /** @@ -124,7 +127,8 @@ public class AttachmentServiceImpl extends AbstractCrudService listAllMediaType() { return attachmentRepository.findAllMediaType(); diff --git a/src/test/java/run/halo/app/service/impl/AttachmentServiceImplTest.java b/src/test/java/run/halo/app/service/impl/AttachmentServiceImplTest.java new file mode 100644 index 000000000..b47663535 --- /dev/null +++ b/src/test/java/run/halo/app/service/impl/AttachmentServiceImplTest.java @@ -0,0 +1,120 @@ +package run.halo.app.service.impl; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; +import run.halo.app.handler.file.FileHandlers; +import run.halo.app.model.dto.AttachmentDTO; +import run.halo.app.model.entity.Attachment; +import run.halo.app.model.enums.AttachmentType; +import run.halo.app.repository.AttachmentRepository; +import run.halo.app.service.OptionService; + + +/** + * Test for Attachment Service implementation + * + * @date 2022-5-17 + */ +@ExtendWith(MockitoExtension.class) +class AttachmentServiceImplTest { + + @Mock + AttachmentRepository attachmentRepository; + + @Mock + OptionService optionService; + + @Mock + FileHandlers fileHandlers; + + @InjectMocks + AttachmentServiceImpl attachmentService; + + @Test + void convertToDtoNormal() { + Attachment attachment = new Attachment(); + attachment.setName("fake-name"); + attachment.setFileKey("upload/2022/05/fake-name.png"); + attachment.setPath("upload/2022/05/fake-name.png"); + attachment.setThumbPath("upload/2022/05/fake-name-thumbnail.png"); + attachment.setType(AttachmentType.LOCAL); + + Mockito.when(optionService.getBlogBaseUrl()).thenReturn("https://mock.halo.run"); + Mockito.when(optionService.isEnabledAbsolutePath()).thenReturn(false); + AttachmentDTO attachmentDTO = attachmentService.convertToDto(attachment); + + Assertions.assertEquals("/upload/2022/05/fake-name.png", attachmentDTO.getPath()); + Assertions.assertEquals("/upload/2022/05/fake-name-thumbnail.png", + attachmentDTO.getThumbPath()); + Mockito.verify(optionService, Mockito.times(1)).getBlogBaseUrl(); + } + + @Test + void convertToDtoWithChinese() { + Attachment attachment = new Attachment(); + attachment.setName("图片"); + attachment.setFileKey("upload/2022/05/图片.png"); + attachment.setPath("upload/2022/05/图片.png"); + attachment.setThumbPath("upload/2022/05/图片-thumbnail.png"); + attachment.setType(AttachmentType.LOCAL); + + Mockito.when(optionService.getBlogBaseUrl()).thenReturn("https://mock.halo.run"); + Mockito.when(optionService.isEnabledAbsolutePath()).thenReturn(false); + AttachmentDTO attachmentDTO = attachmentService.convertToDto(attachment); + + Assertions.assertEquals("/upload/2022/05/%E5%9B%BE%E7%89%87.png", attachmentDTO.getPath()); + Assertions.assertEquals("/upload/2022/05/%E5%9B%BE%E7%89%87-thumbnail.png", + attachmentDTO.getThumbPath()); + Mockito.verify(optionService, Mockito.times(1)).getBlogBaseUrl(); + } + + @Test + void convertToDtoWithSpecialChar() { + Attachment attachment = new Attachment(); + attachment.setName("100%1#"); + attachment.setFileKey("upload/2022/05/100%1#.png"); + attachment.setPath("upload/2022/05/100%1#.png"); + attachment.setThumbPath("upload/2022/05/100%1#-thumbnail.png"); + attachment.setType(AttachmentType.LOCAL); + + Mockito.when(optionService.getBlogBaseUrl()).thenReturn("https://mock.halo.run"); + Mockito.when(optionService.isEnabledAbsolutePath()).thenReturn(false); + AttachmentDTO attachmentDTO = attachmentService.convertToDto(attachment); + + Assertions.assertEquals("/upload/2022/05/100%251%23.png", attachmentDTO.getPath()); + Assertions.assertEquals("/upload/2022/05/100%251%23-thumbnail.png", + attachmentDTO.getThumbPath()); + Mockito.verify(optionService, Mockito.times(1)).getBlogBaseUrl(); + } + + @Test + void convertToDtoWithFormerVersionFile() { + // Attachment attachment = new Attachment(); + // attachment.setName("之前版本上传的图片"); + // attachment.setFileKey("upload/2022/04/之前版本上传的图片.png"); + // attachment.setPath("upload/2022/04/之前版本上传的图片.png"); + // attachment.setThumbPath("upload/2022\\04\\之前版本上传的图片-thumbnail.png"); + // attachment.setType(AttachmentType.LOCAL); + // + // Mockito.when(optionService.getBlogBaseUrl()).thenReturn("https://mock.halo.run"); + // Mockito.when(optionService.isEnabledAbsolutePath()).thenReturn(false); + // AttachmentDTO attachmentDTO = attachmentService.convertToDto(attachment); + // + // Assertions.assertEquals( + // "/upload/2022/04/%E4%B9%8B%E5%89%8D%E7%89%88%E6%9C%AC%E4%B8%8A%E4%BC%A0%E7%9A + // %84%E5" + // + "%9B%BE%E7%89%87.png", + // attachmentDTO.getPath()); + // Assertions.assertEquals( + // "/upload/2022/04/%E4%B9%8B%E5%89%8D%E7%89%88%E6%9C%AC%E4%B8%8A%E4%BC%A0%E7%9A + // %84%E5" + // + "%9B%BE%E7%89%87-thumbnail.png", + // attachmentDTO.getThumbPath()); + // Mockito.verify(optionService, Mockito.times(1)).getBlogBaseUrl(); + } +} \ No newline at end of file