Skip to content

Commit

Permalink
fix: not using the default template when the custom template does not…
Browse files Browse the repository at this point in the history
… exist
  • Loading branch information
guqing committed Sep 18, 2023
1 parent da2d56e commit 83aec9e
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 34 deletions.
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package run.halo.app.theme.router;

import java.util.Locale;
import java.nio.file.Files;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.autoconfigure.thymeleaf.ThymeleafProperties;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.ServerRequest;
import reactor.core.publisher.Mono;
import run.halo.app.theme.HaloViewResolver;
import run.halo.app.theme.ThemeResolver;

/**
* The {@link ViewNameResolver} is used to resolve view name.
Expand All @@ -19,7 +18,8 @@
@Component
@AllArgsConstructor
public class ViewNameResolver {
private final HaloViewResolver haloViewResolver;
private static final String TEMPLATES = "templates";
private final ThemeResolver themeResolver;
private final ThymeleafProperties thymeleafProperties;

/**
Expand All @@ -29,20 +29,24 @@ public class ViewNameResolver {
public Mono<String> resolveViewNameOrDefault(ServerRequest request, String name,
String defaultName) {
if (StringUtils.isBlank(name)) {
return Mono.just(defaultName);
return Mono.justOrEmpty(defaultName);
}
final String nameToUse = processName(name);
Locale locale = LocaleContextHolder.getLocale(request.exchange().getLocaleContext());
return haloViewResolver.resolveViewName(nameToUse, locale)
.map(view -> nameToUse)
.switchIfEmpty(Mono.just(defaultName));
return themeResolver.getTheme(request.exchange())
.mapNotNull(themeContext -> {
String templateResourceName = computeResourceName(name);
var resourcePath = themeContext.getPath()
.resolve(TEMPLATES)
.resolve(templateResourceName);
return Files.exists(resourcePath) ? name : defaultName;
})
.switchIfEmpty(Mono.justOrEmpty(defaultName));
}

String processName(String name) {
String nameToLookup = name;
if (StringUtils.endsWith(name, thymeleafProperties.getSuffix())) {
nameToLookup = StringUtils.substringBeforeLast(name, thymeleafProperties.getSuffix());
String computeResourceName(String name) {
if (StringUtils.isBlank(name)) {
return name;
}
return nameToLookup;
return StringUtils.endsWith(name, thymeleafProperties.getSuffix())
? name : name + thymeleafProperties.getSuffix();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,29 @@

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.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.Files;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.io.TempDir;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.springframework.boot.autoconfigure.thymeleaf.ThymeleafProperties;
import org.springframework.http.HttpMethod;
import org.springframework.mock.web.reactive.function.server.MockServerRequest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.web.reactive.result.view.View;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import run.halo.app.theme.HaloViewResolver;
import run.halo.app.theme.ThemeContext;
import run.halo.app.theme.ThemeResolver;

/**
* Tests for {@link ViewNameResolver}.
Expand All @@ -33,25 +36,35 @@
class ViewNameResolverTest {

@Mock
private HaloViewResolver haloViewResolver;
private ThemeResolver themeResolver;

@Mock
private ThymeleafProperties thymeleafProperties;

@InjectMocks
private ViewNameResolver viewNameResolver;

@TempDir
private File themePath;

@BeforeEach
void setUp() {
void setUp() throws IOException {
when(thymeleafProperties.getSuffix()).thenReturn(ThymeleafProperties.DEFAULT_SUFFIX);

when(haloViewResolver.resolveViewName(eq("post_news"), any()))
.thenReturn(Mono.just(Mockito.mock(View.class)));
when(haloViewResolver.resolveViewName(eq("post_docs"), any()))
.thenReturn(Mono.just(new EmptyView()));
var templatesPath = themePath.toPath().resolve("templates");
if (!Files.exists(templatesPath)) {
Files.createDirectory(templatesPath);
}
Files.createFile(templatesPath.resolve("post_news.html"));
Files.createFile(templatesPath.resolve("post_docs.html"));

when(haloViewResolver.resolveViewName(eq("post_nothing"), any()))
.thenReturn(Mono.empty());
when(themeResolver.getTheme(any()))
.thenReturn(Mono.fromSupplier(() -> ThemeContext.builder()
.name("fake-theme")
.path(themePath.toPath())
.active(true)
.build())
);
}

@Test
Expand All @@ -71,7 +84,7 @@ void resolveViewNameOrDefault() throws URISyntaxException {
String viewName = "post_docs" + thymeleafProperties.getSuffix();
viewNameResolver.resolveViewNameOrDefault(request, viewName, "post")
.as(StepVerifier::create)
.expectNext("post_docs")
.expectNext(viewName)
.verifyComplete();

viewNameResolver.resolveViewNameOrDefault(request, "post_nothing", "post")
Expand All @@ -82,11 +95,14 @@ void resolveViewNameOrDefault() throws URISyntaxException {

@Test
void processName() {
assertThat(viewNameResolver.processName("post_news")).isEqualTo("post_news");
assertThat(viewNameResolver.processName("post_news" + thymeleafProperties.getSuffix()))
.isEqualTo("post_news");
assertThat(viewNameResolver.processName("post_news.test"))
.isEqualTo("post_news.test");
assertThat(viewNameResolver.processName(null)).isNull();
var suffix = thymeleafProperties.getSuffix();
assertThat(viewNameResolver.computeResourceName("post_news"))
.isEqualTo("post_news" + suffix);
assertThat(
viewNameResolver.computeResourceName("post_news" + suffix))
.isEqualTo("post_news" + suffix);
assertThat(viewNameResolver.computeResourceName("post_news.test"))
.isEqualTo("post_news.test" + suffix);
assertThat(viewNameResolver.computeResourceName(null)).isNull();
}
}
}

0 comments on commit 83aec9e

Please sign in to comment.