Skip to content

Commit

Permalink
[release-2.3] fix: posts and pages cannot be counted for visits (#3487)
Browse files Browse the repository at this point in the history
This is an automated cherry-pick of #3471

/assign ruibaby

```release-note
修复文章和自定义页面缺失属性导致的访问量无法计数问题
```
  • Loading branch information
halo-dev-bot committed Mar 8, 2023
1 parent 6a9a1bd commit eb87116
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 0 deletions.
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
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
@@ -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();
}
}
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 eb87116

Please sign in to comment.