diff --git a/application/src/main/java/run/halo/app/theme/finders/impl/ThumbnailFinderImpl.java b/application/src/main/java/run/halo/app/theme/finders/impl/ThumbnailFinderImpl.java index 19a7922ce2..e8eac936b8 100644 --- a/application/src/main/java/run/halo/app/theme/finders/impl/ThumbnailFinderImpl.java +++ b/application/src/main/java/run/halo/app/theme/finders/impl/ThumbnailFinderImpl.java @@ -2,12 +2,14 @@ import java.net.URI; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Mono; import run.halo.app.core.attachment.ThumbnailService; import run.halo.app.core.attachment.ThumbnailSize; import run.halo.app.theme.finders.Finder; import run.halo.app.theme.finders.ThumbnailFinder; +@Slf4j @Finder("thumbnail") @RequiredArgsConstructor public class ThumbnailFinderImpl implements ThumbnailFinder { @@ -15,8 +17,14 @@ public class ThumbnailFinderImpl implements ThumbnailFinder { @Override public Mono gen(String uriStr, String size) { - return thumbnailService.generate(URI.create(uriStr), ThumbnailSize.fromName(size)) + return Mono.fromSupplier(() -> URI.create(uriStr)) + .flatMap(uri -> thumbnailService.generate(uri, ThumbnailSize.fromName(size))) .map(URI::toString) + .onErrorResume(Throwable.class, e -> { + log.debug("Failed to generate thumbnail for [{}], error: [{}]", uriStr, + e.getMessage()); + return Mono.just(uriStr); + }) .defaultIfEmpty(uriStr); } } diff --git a/application/src/test/java/run/halo/app/theme/finders/impl/ThumbnailFinderImplTest.java b/application/src/test/java/run/halo/app/theme/finders/impl/ThumbnailFinderImplTest.java new file mode 100644 index 0000000000..3fb8d6e3b9 --- /dev/null +++ b/application/src/test/java/run/halo/app/theme/finders/impl/ThumbnailFinderImplTest.java @@ -0,0 +1,54 @@ +package run.halo.app.theme.finders.impl; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.net.URI; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; +import run.halo.app.core.attachment.ThumbnailService; + +/** + * Tests for {@link ThumbnailFinderImpl}. + * + * @author guqing + * @since 2.20.0 + */ +@ExtendWith(MockitoExtension.class) +class ThumbnailFinderImplTest { + + @Mock + ThumbnailService thumbnailService; + + @InjectMocks + ThumbnailFinderImpl thumbnailFinder; + + @Test + void shouldNotGenWhenUriIsInvalid() { + thumbnailFinder.gen("invalid uri", "l") + .as(StepVerifier::create) + .expectNext("invalid uri") + .verifyComplete(); + + verify(thumbnailService, times(0)).generate(any(), any()); + } + + @Test + void shouldGenWhenUriIsValid() { + when(thumbnailService.generate(any(), any())) + .thenReturn(Mono.just(URI.create("/test-thumb.jpg"))); + thumbnailFinder.gen("/test.jpg", "l") + .as(StepVerifier::create) + .expectNext("/test-thumb.jpg") + .verifyComplete(); + + verify(thumbnailService).generate(any(), any()); + } +}