Skip to content

Commit 29b1b38

Browse files
committed
Migrate Thymeleaf tests to application runner
1 parent cf0811b commit 29b1b38

File tree

2 files changed

+308
-302
lines changed

2 files changed

+308
-302
lines changed

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafReactiveAutoConfigurationTests.java

Lines changed: 126 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222

2323
import nz.net.ultraq.thymeleaf.LayoutDialect;
2424
import nz.net.ultraq.thymeleaf.decorators.strategies.GroupingStrategy;
25-
import org.junit.After;
2625
import org.junit.Rule;
2726
import org.junit.Test;
2827
import org.thymeleaf.TemplateEngine;
@@ -36,14 +35,11 @@
3635
import org.thymeleaf.spring5.view.reactive.ThymeleafReactiveViewResolver;
3736
import org.thymeleaf.templateresolver.ITemplateResolver;
3837

39-
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
40-
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
38+
import org.springframework.boot.autoconfigure.AutoConfigurations;
39+
import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner;
4140
import org.springframework.boot.test.rule.OutputCapture;
42-
import org.springframework.boot.test.util.TestPropertyValues;
43-
import org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebApplicationContext;
4441
import org.springframework.context.annotation.Bean;
4542
import org.springframework.context.annotation.Configuration;
46-
import org.springframework.context.annotation.Import;
4743
import org.springframework.http.MediaType;
4844
import org.springframework.mock.http.server.reactive.MockServerHttpRequest;
4945
import org.springframework.mock.web.server.MockServerWebExchange;
@@ -60,212 +56,215 @@
6056
*
6157
* @author Brian Clozel
6258
* @author Kazuki Shimizu
59+
* @author Stephane Nicoll
6360
*/
6461
public class ThymeleafReactiveAutoConfigurationTests {
6562

6663
@Rule
6764
public OutputCapture output = new OutputCapture();
6865

69-
private AnnotationConfigReactiveWebApplicationContext context;
70-
71-
@After
72-
public void close() {
73-
if (this.context != null) {
74-
this.context.close();
75-
}
76-
}
66+
private ReactiveWebApplicationContextRunner contextRunner = new ReactiveWebApplicationContextRunner()
67+
.withConfiguration(AutoConfigurations.of(ThymeleafAutoConfiguration.class));
7768

7869
@Test
7970
public void createFromConfigClass() {
80-
load(BaseConfiguration.class, "spring.thymeleaf.suffix:.html");
81-
TemplateEngine engine = this.context.getBean(TemplateEngine.class);
82-
Context attrs = new Context(Locale.UK, Collections.singletonMap("foo", "bar"));
83-
String result = engine.process("template", attrs);
84-
assertThat(result).isEqualTo("<html>bar</html>");
71+
this.contextRunner.withPropertyValues("spring.thymeleaf.suffix:.html")
72+
.run((context) -> {
73+
TemplateEngine engine = context.getBean(TemplateEngine.class);
74+
Context attrs = new Context(Locale.UK,
75+
Collections.singletonMap("foo", "bar"));
76+
String result = engine.process("template", attrs);
77+
assertThat(result).isEqualTo("<html>bar</html>");
78+
});
8579
}
8680

8781
@Test
8882
public void overrideCharacterEncoding() {
89-
load(BaseConfiguration.class, "spring.thymeleaf.encoding:UTF-16");
90-
ITemplateResolver resolver = this.context.getBean(ITemplateResolver.class);
91-
assertThat(resolver instanceof SpringResourceTemplateResolver).isTrue();
92-
assertThat(((SpringResourceTemplateResolver) resolver).getCharacterEncoding())
93-
.isEqualTo("UTF-16");
94-
ThymeleafReactiveViewResolver views = this.context
95-
.getBean(ThymeleafReactiveViewResolver.class);
96-
assertThat(views.getDefaultCharset().name()).isEqualTo("UTF-16");
83+
this.contextRunner.withPropertyValues("spring.thymeleaf.encoding:UTF-16")
84+
.run((context) -> {
85+
ITemplateResolver resolver = context.getBean(ITemplateResolver.class);
86+
assertThat(resolver)
87+
.isInstanceOf(SpringResourceTemplateResolver.class);
88+
assertThat(((SpringResourceTemplateResolver) resolver)
89+
.getCharacterEncoding()).isEqualTo("UTF-16");
90+
ThymeleafReactiveViewResolver views = context
91+
.getBean(ThymeleafReactiveViewResolver.class);
92+
assertThat(views.getDefaultCharset().name()).isEqualTo("UTF-16");
93+
});
9794
}
9895

9996
@Test
10097
public void overrideMediaTypes() {
101-
load(BaseConfiguration.class,
102-
"spring.thymeleaf.reactive.media-types:text/html,text/plain");
103-
ThymeleafReactiveViewResolver views = this.context
104-
.getBean(ThymeleafReactiveViewResolver.class);
105-
assertThat(views.getSupportedMediaTypes()).contains(MediaType.TEXT_HTML,
106-
MediaType.TEXT_PLAIN);
98+
this.contextRunner
99+
.withPropertyValues(
100+
"spring.thymeleaf.reactive.media-types:text/html,text/plain")
101+
.run((context) -> assertThat(
102+
context.getBean(ThymeleafReactiveViewResolver.class)
103+
.getSupportedMediaTypes()).contains(MediaType.TEXT_HTML,
104+
MediaType.TEXT_PLAIN));
107105
}
108106

109107
@Test
110108
public void overrideTemplateResolverOrder() {
111-
load(BaseConfiguration.class, "spring.thymeleaf.templateResolverOrder:25");
112-
ITemplateResolver resolver = this.context.getBean(ITemplateResolver.class);
113-
assertThat(resolver.getOrder()).isEqualTo(Integer.valueOf(25));
109+
this.contextRunner.withPropertyValues("spring.thymeleaf.templateResolverOrder:25")
110+
.run((context) -> assertThat(
111+
context.getBean(ITemplateResolver.class).getOrder())
112+
.isEqualTo(Integer.valueOf(25)));
114113
}
115114

116115
@Test
117116
public void overrideViewNames() {
118-
load(BaseConfiguration.class, "spring.thymeleaf.viewNames:foo,bar");
119-
ThymeleafReactiveViewResolver views = this.context
120-
.getBean(ThymeleafReactiveViewResolver.class);
121-
assertThat(views.getViewNames()).isEqualTo(new String[] { "foo", "bar" });
117+
this.contextRunner.withPropertyValues("spring.thymeleaf.viewNames:foo,bar")
118+
.run((context) -> assertThat(context
119+
.getBean(ThymeleafReactiveViewResolver.class).getViewNames())
120+
.isEqualTo(new String[] { "foo", "bar" }));
122121
}
123122

124123
@Test
125124
public void overrideMaxChunkSize() {
126-
load(BaseConfiguration.class, "spring.thymeleaf.reactive.maxChunkSize:8KB");
127-
ThymeleafReactiveViewResolver views = this.context
128-
.getBean(ThymeleafReactiveViewResolver.class);
129-
assertThat(views.getResponseMaxChunkSizeBytes()).isEqualTo(Integer.valueOf(8192));
125+
this.contextRunner
126+
.withPropertyValues("spring.thymeleaf.reactive.maxChunkSize:8KB")
127+
.run((context) -> assertThat(
128+
context.getBean(ThymeleafReactiveViewResolver.class)
129+
.getResponseMaxChunkSizeBytes())
130+
.isEqualTo(Integer.valueOf(8192)));
130131
}
131132

132133
@Test
133134
public void overrideFullModeViewNames() {
134-
load(BaseConfiguration.class,
135-
"spring.thymeleaf.reactive.fullModeViewNames:foo,bar");
136-
ThymeleafReactiveViewResolver views = this.context
137-
.getBean(ThymeleafReactiveViewResolver.class);
138-
assertThat(views.getFullModeViewNames()).isEqualTo(new String[] { "foo", "bar" });
135+
this.contextRunner
136+
.withPropertyValues("spring.thymeleaf.reactive.fullModeViewNames:foo,bar")
137+
.run((context) -> assertThat(
138+
context.getBean(ThymeleafReactiveViewResolver.class)
139+
.getFullModeViewNames())
140+
.isEqualTo(new String[] { "foo", "bar" }));
139141
}
140142

141143
@Test
142144
public void overrideChunkedModeViewNames() {
143-
load(BaseConfiguration.class,
144-
"spring.thymeleaf.reactive.chunkedModeViewNames:foo,bar");
145-
ThymeleafReactiveViewResolver views = this.context
146-
.getBean(ThymeleafReactiveViewResolver.class);
147-
assertThat(views.getChunkedModeViewNames())
148-
.isEqualTo(new String[] { "foo", "bar" });
145+
this.contextRunner
146+
.withPropertyValues(
147+
"spring.thymeleaf.reactive.chunkedModeViewNames:foo,bar")
148+
.run((context) -> assertThat(
149+
context.getBean(ThymeleafReactiveViewResolver.class)
150+
.getChunkedModeViewNames())
151+
.isEqualTo(new String[] { "foo", "bar" }));
149152
}
150153

151154
@Test
152155
public void overrideEnableSpringElCompiler() {
153-
load(BaseConfiguration.class, "spring.thymeleaf.enable-spring-el-compiler:true");
154-
assertThat(this.context.getBean(SpringWebFluxTemplateEngine.class)
155-
.getEnableSpringELCompiler()).isTrue();
156+
this.contextRunner
157+
.withPropertyValues("spring.thymeleaf.enable-spring-el-compiler:true")
158+
.run((context) -> assertThat(
159+
context.getBean(SpringWebFluxTemplateEngine.class)
160+
.getEnableSpringELCompiler()).isTrue());
156161
}
157162

158163
@Test
159164
public void enableSpringElCompilerIsDisabledByDefault() {
160-
load(BaseConfiguration.class);
161-
assertThat(this.context.getBean(SpringWebFluxTemplateEngine.class)
162-
.getEnableSpringELCompiler()).isFalse();
165+
this.contextRunner.run(
166+
(context) -> assertThat(context.getBean(SpringWebFluxTemplateEngine.class)
167+
.getEnableSpringELCompiler()).isFalse());
163168
}
164169

165170
@Test
166171
public void overrideRenderHiddenMarkersBeforeCheckboxes() {
167-
load(BaseConfiguration.class,
168-
"spring.thymeleaf.render-hidden-markers-before-checkboxes:true");
169-
assertThat(this.context.getBean(SpringWebFluxTemplateEngine.class)
170-
.getRenderHiddenMarkersBeforeCheckboxes()).isTrue();
172+
this.contextRunner
173+
.withPropertyValues(
174+
"spring.thymeleaf.render-hidden-markers-before-checkboxes:true")
175+
.run((context) -> assertThat(
176+
context.getBean(SpringWebFluxTemplateEngine.class)
177+
.getRenderHiddenMarkersBeforeCheckboxes()).isTrue());
171178
}
172179

173180
@Test
174181
public void enableRenderHiddenMarkersBeforeCheckboxesIsDisabledByDefault() {
175-
load(BaseConfiguration.class);
176-
assertThat(this.context.getBean(SpringWebFluxTemplateEngine.class)
177-
.getRenderHiddenMarkersBeforeCheckboxes()).isFalse();
182+
this.contextRunner.run(
183+
(context) -> assertThat(context.getBean(SpringWebFluxTemplateEngine.class)
184+
.getRenderHiddenMarkersBeforeCheckboxes()).isFalse());
178185
}
179186

180187
@Test
181188
public void templateLocationDoesNotExist() {
182-
load(BaseConfiguration.class,
183-
"spring.thymeleaf.prefix:classpath:/no-such-directory/");
184-
this.output.expect(containsString("Cannot find template location"));
189+
this.contextRunner
190+
.withPropertyValues(
191+
"spring.thymeleaf.prefix:classpath:/no-such-directory/")
192+
.run((context) -> this.output
193+
.expect(containsString("Cannot find template location")));
185194
}
186195

187196
@Test
188197
public void templateLocationEmpty() {
189198
new File("target/test-classes/templates/empty-directory").mkdir();
190-
load(BaseConfiguration.class,
191-
"spring.thymeleaf.prefix:classpath:/templates/empty-directory/");
192-
this.output.expect(not(containsString("Cannot find template location")));
199+
this.contextRunner
200+
.withPropertyValues(
201+
"spring.thymeleaf.prefix:classpath:/templates/empty-directory/")
202+
.run((context) -> this.output
203+
.expect(not(containsString("Cannot find template location"))));
193204
}
194205

195206
@Test
196207
public void useDataDialect() {
197-
load(BaseConfiguration.class);
198-
ISpringWebFluxTemplateEngine engine = this.context
199-
.getBean(ISpringWebFluxTemplateEngine.class);
200-
Context attrs = new Context(Locale.UK, Collections.singletonMap("foo", "bar"));
201-
String result = engine.process("data-dialect", attrs);
202-
assertThat(result).isEqualTo("<html><body data-foo=\"bar\"></body></html>");
208+
this.contextRunner.run((context) -> {
209+
ISpringWebFluxTemplateEngine engine = context
210+
.getBean(ISpringWebFluxTemplateEngine.class);
211+
Context attrs = new Context(Locale.UK,
212+
Collections.singletonMap("foo", "bar"));
213+
String result = engine.process("data-dialect", attrs);
214+
assertThat(result).isEqualTo("<html><body data-foo=\"bar\"></body></html>");
215+
});
203216
}
204217

205218
@Test
206219
public void useJava8TimeDialect() {
207-
load(BaseConfiguration.class);
208-
ISpringWebFluxTemplateEngine engine = this.context
209-
.getBean(ISpringWebFluxTemplateEngine.class);
210-
Context attrs = new Context(Locale.UK);
211-
String result = engine.process("java8time-dialect", attrs);
212-
assertThat(result).isEqualTo("<html><body>2015-11-24</body></html>");
220+
this.contextRunner.run((context) -> {
221+
ISpringWebFluxTemplateEngine engine = context
222+
.getBean(ISpringWebFluxTemplateEngine.class);
223+
Context attrs = new Context(Locale.UK);
224+
String result = engine.process("java8time-dialect", attrs);
225+
assertThat(result).isEqualTo("<html><body>2015-11-24</body></html>");
226+
});
213227
}
214228

215229
@Test
216230
public void useSecurityDialect() {
217-
load(BaseConfiguration.class);
218-
ISpringWebFluxTemplateEngine engine = this.context
219-
.getBean(ISpringWebFluxTemplateEngine.class);
220-
MockServerWebExchange exchange = MockServerWebExchange
221-
.from(MockServerHttpRequest.get("/test").build());
222-
exchange.getAttributes().put(
223-
SpringSecurityContextUtils.SECURITY_CONTEXT_MODEL_ATTRIBUTE_NAME,
224-
new SecurityContextImpl(
225-
new TestingAuthenticationToken("alice", "admin")));
226-
IContext attrs = new SpringWebFluxContext(exchange);
227-
String result = engine.process("security-dialect", attrs);
228-
assertThat(result).isEqualTo(
229-
"<html><body><div>alice</div></body></html>" + System.lineSeparator());
231+
this.contextRunner.run((context) -> {
232+
ISpringWebFluxTemplateEngine engine = context
233+
.getBean(ISpringWebFluxTemplateEngine.class);
234+
MockServerWebExchange exchange = MockServerWebExchange
235+
.from(MockServerHttpRequest.get("/test").build());
236+
exchange.getAttributes().put(
237+
SpringSecurityContextUtils.SECURITY_CONTEXT_MODEL_ATTRIBUTE_NAME,
238+
new SecurityContextImpl(
239+
new TestingAuthenticationToken("alice", "admin")));
240+
IContext attrs = new SpringWebFluxContext(exchange);
241+
String result = engine.process("security-dialect", attrs);
242+
assertThat(result).isEqualTo("<html><body><div>alice</div></body></html>"
243+
+ System.lineSeparator());
244+
});
230245
}
231246

232247
@Test
233248
public void renderTemplate() {
234-
load(BaseConfiguration.class);
235-
ISpringWebFluxTemplateEngine engine = this.context
236-
.getBean(ISpringWebFluxTemplateEngine.class);
237-
Context attrs = new Context(Locale.UK, Collections.singletonMap("foo", "bar"));
238-
String result = engine.process("home", attrs);
239-
assertThat(result).isEqualTo("<html><body>bar</body></html>");
249+
this.contextRunner.run((context) -> {
250+
ISpringWebFluxTemplateEngine engine = context
251+
.getBean(ISpringWebFluxTemplateEngine.class);
252+
Context attrs = new Context(Locale.UK,
253+
Collections.singletonMap("foo", "bar"));
254+
String result = engine.process("home", attrs);
255+
assertThat(result).isEqualTo("<html><body>bar</body></html>");
256+
});
240257
}
241258

242259
@Test
243260
public void layoutDialectCanBeCustomized() {
244-
load(LayoutDialectConfiguration.class);
245-
LayoutDialect layoutDialect = this.context.getBean(LayoutDialect.class);
246-
assertThat(ReflectionTestUtils.getField(layoutDialect, "sortingStrategy"))
247-
.isInstanceOf(GroupingStrategy.class);
248-
}
249-
250-
private void load(Class<?> config, String... envVariables) {
251-
this.context = new AnnotationConfigReactiveWebApplicationContext();
252-
TestPropertyValues.of(envVariables).applyTo(this.context);
253-
if (config != null) {
254-
this.context.register(config);
255-
}
256-
this.context.register(config);
257-
this.context.refresh();
258-
}
259-
260-
@Configuration
261-
@ImportAutoConfiguration({ ThymeleafAutoConfiguration.class,
262-
PropertyPlaceholderAutoConfiguration.class })
263-
protected static class BaseConfiguration {
264-
261+
this.contextRunner.withUserConfiguration(LayoutDialectConfiguration.class)
262+
.run((context) -> assertThat(ReflectionTestUtils.getField(
263+
context.getBean(LayoutDialect.class), "sortingStrategy"))
264+
.isInstanceOf(GroupingStrategy.class));
265265
}
266266

267267
@Configuration
268-
@Import(BaseConfiguration.class)
269268
static class LayoutDialectConfiguration {
270269

271270
@Bean

0 commit comments

Comments
 (0)