Skip to content

Commit

Permalink
fix: posts and pages cannot be counted for visits (#3471)
Browse files Browse the repository at this point in the history
#### What type of PR is this?
/kind bug
/area core
/milestone 2.3.x

#### What this PR does / why we need it:
修复文章和自定义页面缺失 name 模型属性导致的访问量无法计数问题
此为 2.3.0 引入的问题 see #3300

how to test it?
1. 切换文章的路由为不带 name 的规则
2. 访问文章看 `/apis/api.halo.run/v1alpha1/trackers/counter` API 是否有如下参数,且 name 值正确
```json
{
    "group": "content.halo.run",
    "plural": "posts",
    "name": "335",
    "hostname": "localhost",
    "screen": "1920x1080",
    "language": "zh-CN",
    "url": "/?p=halo-150-released",
    "referrer": "http://localhost:8090/?p=how-to-development-a-halo-plugin"
}
```
3. 观察文章访问量是否有增加
4. 重复上述 2、3 步骤检查自定义页面的访问量功能是否正确

#### Which issue(s) this PR fixes:

Fixes #3448

#### Does this PR introduce a user-facing change?
```release-note
修复文章和自定义页面缺失属性导致的访问量无法计数问题
```
  • Loading branch information
guqing committed Mar 8, 2023
1 parent 633c489 commit ce9c33c
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ HandlerFunction<ServerResponse> handlerFunction(String name) {
return request -> singlePageFinder.getByName(name)
.flatMap(singlePageVo -> {
Map<String, Object> model = new HashMap<>();
model.put("name", singlePageVo.getMetadata().getName());
model.put("groupVersionKind", gvk);
model.put("plural", getPlural());
model.put(ModelConst.TEMPLATE_ID, DefaultTemplateEnum.SINGLE_PAGE.getValue());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ private Mono<ServerResponse> postResponse(ServerRequest request,
return postVoMono
.flatMap(postVo -> {
Map<String, Object> model = new HashMap<>();
model.put("name", postVo.getMetadata().getName());
model.put(ModelConst.TEMPLATE_ID, DefaultTemplateEnum.POST.getValue());
model.put("groupVersionKind", GroupVersionKind.fromExtension(Post.class));
GVK gvk = Post.class.getAnnotation(GVK.class);
Expand Down
101 changes: 101 additions & 0 deletions src/test/java/run/halo/app/theme/router/SinglePageRouteTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package run.halo.app.theme.router;

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.when;

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.HandlerFunction;
import org.springframework.web.reactive.function.server.HandlerStrategies;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import org.springframework.web.reactive.result.view.ViewResolver;
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.DefaultTemplateEnum;
import run.halo.app.theme.finders.SinglePageFinder;
import run.halo.app.theme.finders.vo.SinglePageVo;
import run.halo.app.theme.router.factories.ModelConst;

/**
* Tests for {@link SinglePageRoute}.
*
* @author guqing
* @since 2.0.0
*/
@ExtendWith(MockitoExtension.class)
class SinglePageRouteTest {

@Mock
private ViewNameResolver viewNameResolver;

@Mock
private SinglePageFinder singlePageFinder;

@Mock
protected ViewResolver viewResolver;

@InjectMocks
private SinglePageRoute singlePageRoute;

@Test
void handlerFunction() {
// fix gh-3448
when(viewNameResolver.resolveViewNameOrDefault(any(), any(), any()))
.thenReturn(Mono.just(DefaultTemplateEnum.POST.getValue()));

String pageName = "fake-page";
when(viewResolver.resolveViewName(any(), any()))
.thenReturn(Mono.just(new EmptyView() {
@Override
public Mono<Void> render(Map<String, ?> model, MediaType contentType,
ServerWebExchange exchange) {
assertThat(model).containsKey(ModelConst.TEMPLATE_ID);
assertThat(model.get(ModelConst.TEMPLATE_ID))
.isEqualTo(DefaultTemplateEnum.SINGLE_PAGE.getValue());
assertThat(model.get("name"))
.isEqualTo(pageName);
assertThat(model.get("plural")).isEqualTo("singlepages");
assertThat(model.get("singlePage")).isNotNull();
assertThat(model.get("groupVersionKind"))
.isEqualTo(GroupVersionKind.fromExtension(SinglePage.class));
return super.render(model, contentType, exchange);
}
}));

SinglePage singlePage = new SinglePage();
singlePage.setMetadata(new Metadata());
singlePage.getMetadata().setName(pageName);
singlePage.setSpec(new SinglePage.SinglePageSpec());
when(singlePageFinder.getByName(eq(pageName)))
.thenReturn(Mono.just(SinglePageVo.from(singlePage)));

HandlerFunction<ServerResponse> handlerFunction =
singlePageRoute.handlerFunction(pageName);
RouterFunction<ServerResponse> routerFunction =
RouterFunctions.route().GET("/archives/{name}", handlerFunction).build();

WebTestClient webTestClient = WebTestClient.bindToRouterFunction(routerFunction)
.handlerStrategies(HandlerStrategies.builder()
.viewResolver(viewResolver)
.build())
.build();

webTestClient.get()
.uri("/archives/fake-name")
.exchange()
.expectStatus().isOk();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ public Mono<Void> render(Map<String, ?> model, MediaType contentType,
assertThat(model).containsKey(ModelConst.TEMPLATE_ID);
assertThat(model.get(ModelConst.TEMPLATE_ID))
.isEqualTo(DefaultTemplateEnum.POST.getValue());
assertThat(model.get("name"))
.isEqualTo(post.getMetadata().getName());
assertThat(model.get("plural")).isEqualTo("posts");
assertThat(model.get("post")).isNotNull();
assertThat(model.get("groupVersionKind"))
Expand Down

0 comments on commit ce9c33c

Please sign in to comment.