fix: single page does not count visits (#2918)

#### 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
修复自定义页面没有统计访问量的问题
```
pull/2919/head^2
guqing 2022-12-12 11:48:22 +08:00 committed by GitHub
parent d06078893e
commit 52906f21c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 51 additions and 0 deletions

View File

@ -42,6 +42,7 @@ public class SinglePageRouteStrategy implements DetailsPageRouteHandlerStrategy
String name) {
return request -> {
Map<String, Object> model = new HashMap<>();
model.put("name", name);
model.put("groupVersionKind", gvk);
model.put("plural", getPlural());
model.put(ModelConst.TEMPLATE_ID, DefaultTemplateEnum.SINGLE_PAGE.getValue());

View File

@ -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<Void> render(Map<String, ?> 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<ServerResponse> routeFunction = getRouterFunction();
return getWebTestClient(routeFunction);