From 8616e0687ffa7ed1fddb9b811c13defe4801bfed Mon Sep 17 00:00:00 2001 From: guqing <1484563614@qq.com> Date: Mon, 19 Dec 2022 16:02:11 +0800 Subject: [PATCH] fix: page stats does not subscribe in finder --- .../finders/impl/SinglePageFinderImpl.java | 9 ++- .../impl/SinglePageFinderImplTest.java | 79 +++++++++++++++++++ 2 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 src/test/java/run/halo/app/theme/finders/impl/SinglePageFinderImplTest.java diff --git a/src/main/java/run/halo/app/theme/finders/impl/SinglePageFinderImpl.java b/src/main/java/run/halo/app/theme/finders/impl/SinglePageFinderImpl.java index 21186579e5..9d0b0b696c 100644 --- a/src/main/java/run/halo/app/theme/finders/impl/SinglePageFinderImpl.java +++ b/src/main/java/run/halo/app/theme/finders/impl/SinglePageFinderImpl.java @@ -61,9 +61,12 @@ public Mono getByName(String pageName) { SinglePageVo pageVo = SinglePageVo.from(page); pageVo.setContributors(List.of()); pageVo.setContent(ContentVo.empty()); - populateStats(pageVo); return pageVo; }) + .flatMap(singlePageVo -> fetchStats(singlePageVo) + .doOnNext(singlePageVo::setStats) + .thenReturn(singlePageVo) + ) .flatMap(this::populateContributors) .flatMap(page -> content(pageName) .doOnNext(page::setContent) @@ -94,7 +97,7 @@ public Mono> list(Integer page, Integer size) { pageVo.setContributors(List.of()); return pageVo; }) - .flatMap(lp -> populateStats(lp).doOnNext(lp::setStats).thenReturn(lp)) + .flatMap(lp -> fetchStats(lp).doOnNext(lp::setStats).thenReturn(lp)) .concatMap(this::populateContributors) .collectList() .map(pageVos -> new ListResult<>(list.getPage(), list.getSize(), list.getTotal(), @@ -104,7 +107,7 @@ public Mono> list(Integer page, Integer size) { .defaultIfEmpty(new ListResult<>(0, 0, 0, List.of())); } - Mono populateStats(T pageVo) { + Mono fetchStats(T pageVo) { String name = pageVo.getMetadata().getName(); return counterService.getByName(MeterUtils.nameOf(SinglePage.class, name)) .map(counter -> StatsVo.builder() diff --git a/src/test/java/run/halo/app/theme/finders/impl/SinglePageFinderImplTest.java b/src/test/java/run/halo/app/theme/finders/impl/SinglePageFinderImplTest.java new file mode 100644 index 0000000000..6ce42727e8 --- /dev/null +++ b/src/test/java/run/halo/app/theme/finders/impl/SinglePageFinderImplTest.java @@ -0,0 +1,79 @@ +package run.halo.app.theme.finders.impl; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +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.content.ContentService; +import run.halo.app.core.extension.content.SinglePage; +import run.halo.app.extension.Metadata; +import run.halo.app.extension.ReactiveExtensionClient; +import run.halo.app.metrics.CounterService; +import run.halo.app.theme.finders.ContributorFinder; + +/** + * Tests for {@link SinglePageFinderImpl}. + * + * @author guqing + * @since 2.0.1 + */ +@ExtendWith(MockitoExtension.class) +class SinglePageFinderImplTest { + + @Mock + private ReactiveExtensionClient client; + + @Mock + private ContentService contentService; + + @Mock + private ContributorFinder contributorFinder; + + @Mock + private CounterService counterService; + + @InjectMocks + private SinglePageFinderImpl singlePageFinder; + + @Test + void getByName() { + // fix gh-2992 + String fakePageName = "fake-page"; + SinglePage singlePage = new SinglePage(); + singlePage.setMetadata(new Metadata()); + singlePage.getMetadata().setName(fakePageName); + singlePage.setSpec(new SinglePage.SinglePageSpec()); + singlePage.getSpec().setOwner("fake-owner"); + singlePage.getSpec().setReleaseSnapshot("fake-release"); + singlePage.setStatus(new SinglePage.SinglePageStatus()); + when(client.fetch(eq(SinglePage.class), eq(fakePageName))) + .thenReturn(Mono.just(singlePage)); + + when(counterService.getByName(anyString())).thenReturn(Mono.empty()); + when(contributorFinder.getContributor(anyString())).thenReturn(Mono.empty()); + when(contentService.getContent(anyString())).thenReturn(Mono.empty()); + + singlePageFinder.getByName(fakePageName) + .as(StepVerifier::create) + .consumeNextWith(page -> { + assertThat(page.getStats()).isNotNull(); + assertThat(page.getContent()).isNotNull(); + }) + .verifyComplete(); + + verify(client, times(2)).fetch(SinglePage.class, fakePageName); + verify(counterService).getByName(anyString()); + verify(contentService).getContent(anyString()); + verify(contributorFinder).getContributor(anyString()); + } +} \ No newline at end of file