From 52906f21c16e89448e00acee343dd31a5a207007 Mon Sep 17 00:00:00 2001 From: guqing <38999863+guqing@users.noreply.github.com> Date: Mon, 12 Dec 2022 11:48:22 +0800 Subject: [PATCH] fix: single page does not count visits (#2918) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /kind bug /area core #### What this PR does / why we need it: 修复自定义页面没有统计访问量的问题 #### Which issue(s) this PR fixes: Fixes #2912 #### Special notes for your reviewer: how to test it? 创建自定义页面并到主题端访问,可以看到访问量增加 /cc @halo-dev/sig-halo #### Does this PR introduce a user-facing change? ```release-note 修复自定义页面没有统计访问量的问题 ``` --- .../strategy/SinglePageRouteStrategy.java | 1 + .../strategy/SinglePageRouteStrategyTest.java | 50 +++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/src/main/java/run/halo/app/theme/router/strategy/SinglePageRouteStrategy.java b/src/main/java/run/halo/app/theme/router/strategy/SinglePageRouteStrategy.java index c4e43ae99..3085e789f 100644 --- a/src/main/java/run/halo/app/theme/router/strategy/SinglePageRouteStrategy.java +++ b/src/main/java/run/halo/app/theme/router/strategy/SinglePageRouteStrategy.java @@ -42,6 +42,7 @@ public class SinglePageRouteStrategy implements DetailsPageRouteHandlerStrategy String name) { return request -> { Map model = new HashMap<>(); + model.put("name", name); model.put("groupVersionKind", gvk); model.put("plural", getPlural()); model.put(ModelConst.TEMPLATE_ID, DefaultTemplateEnum.SINGLE_PAGE.getValue()); diff --git a/src/test/java/run/halo/app/theme/router/strategy/SinglePageRouteStrategyTest.java b/src/test/java/run/halo/app/theme/router/strategy/SinglePageRouteStrategyTest.java index 48859f354..6dd836186 100644 --- a/src/test/java/run/halo/app/theme/router/strategy/SinglePageRouteStrategyTest.java +++ b/src/test/java/run/halo/app/theme/router/strategy/SinglePageRouteStrategyTest.java @@ -1,21 +1,30 @@ package run.halo.app.theme.router.strategy; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.when; import static run.halo.app.theme.DefaultTemplateEnum.SINGLE_PAGE; +import java.util.Map; 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 org.springframework.http.MediaType; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; +import run.halo.app.core.extension.content.SinglePage; +import run.halo.app.extension.GroupVersionKind; +import run.halo.app.extension.Metadata; import run.halo.app.theme.finders.SinglePageFinder; +import run.halo.app.theme.finders.vo.SinglePageVo; +import run.halo.app.theme.router.ViewNameResolver; /** * Tests for {@link SinglePageRouteStrategy}. @@ -28,9 +37,13 @@ class SinglePageRouteStrategyTest extends RouterStrategyTestSuite { @Mock private SinglePageFinder singlePageFinder; + @Mock + private ViewNameResolver viewNameResolver; + @InjectMocks private SinglePageRouteStrategy strategy; + @Override public void setUp() { lenient().when(viewResolver.resolveViewName(eq(SINGLE_PAGE.getValue()), any())) @@ -82,6 +95,43 @@ class SinglePageRouteStrategyTest extends RouterStrategyTestSuite { .expectStatus().isOk(); } + @Test + void ensureModel() { + // fix gh-2912 + Metadata metadata = new Metadata(); + metadata.setName("fake-name"); + SinglePageVo singlePageVo = SinglePageVo.builder() + .metadata(metadata) + .spec(new SinglePage.SinglePageSpec()) + .build(); + + when(singlePageFinder.getByName(eq("fake-name"))).thenReturn(Mono.just(singlePageVo)); + permalinkHttpGetRouter.insert("/fake-slug", + strategy.getHandler(getThemeRouteRules(), "fake-name")); + + when(viewNameResolver.resolveViewNameOrDefault(any(), any(), any())) + .thenReturn(Mono.just("page")); + when(viewResolver.resolveViewName(eq(SINGLE_PAGE.getValue()), any())) + .thenReturn(Mono.just(new EmptyView() { + @Override + public Mono render(Map model, MediaType contentType, + ServerWebExchange exchange) { + assertThat(model.get("name")).isEqualTo("fake-name"); + assertThat(model.get("plural")).isEqualTo("singlepages"); + assertThat(model.get("_templateId")).isEqualTo("page"); + assertThat(model.get("singlePage")).isEqualTo(singlePageVo); + assertThat(model.get("groupVersionKind")).isEqualTo( + GroupVersionKind.fromExtension(SinglePage.class)); + return Mono.empty(); + } + })); + createClient().get() + .uri("/fake-slug") + .exchange() + .expectStatus().isOk() + .expectBody(); + } + WebTestClient createClient() { RouterFunction routeFunction = getRouterFunction(); return getWebTestClient(routeFunction);