Modify more tests for static resource location filtering

Fix `WebFluxAutoConfigurationTests` following upstream Spring Framework
changes. Also refine `WebMvcAutoConfigurationTests` to check the locations
are set even if they are filtered.

See gh-28223
This commit is contained in:
Phillip Webb 2021-10-13 18:41:29 -07:00
parent 3d21ac7a20
commit 9abf9e6731
2 changed files with 30 additions and 20 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2020 the original author or authors. * Copyright 2012-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -50,7 +50,6 @@ import org.springframework.context.i18n.LocaleContext;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.ConversionService;
import org.springframework.core.io.ClassPathResource;
import org.springframework.format.Parser; import org.springframework.format.Parser;
import org.springframework.format.Printer; import org.springframework.format.Printer;
import org.springframework.format.support.FormattingConversionService; import org.springframework.format.support.FormattingConversionService;
@ -151,12 +150,13 @@ class WebFluxAutoConfigurationTests {
SimpleUrlHandlerMapping hm = context.getBean("resourceHandlerMapping", SimpleUrlHandlerMapping.class); SimpleUrlHandlerMapping hm = context.getBean("resourceHandlerMapping", SimpleUrlHandlerMapping.class);
assertThat(hm.getUrlMap().get("/**")).isInstanceOf(ResourceWebHandler.class); assertThat(hm.getUrlMap().get("/**")).isInstanceOf(ResourceWebHandler.class);
ResourceWebHandler staticHandler = (ResourceWebHandler) hm.getUrlMap().get("/**"); ResourceWebHandler staticHandler = (ResourceWebHandler) hm.getUrlMap().get("/**");
assertThat(staticHandler.getLocations()).hasSize(4); assertThat(staticHandler).extracting("locationValues").asList().hasSize(4);
assertThat(staticHandler.getLocations()).hasSize(1);
assertThat(staticHandler.getLocations().get(0)).hasToString("class path resource [public/]");
assertThat(hm.getUrlMap().get("/webjars/**")).isInstanceOf(ResourceWebHandler.class); assertThat(hm.getUrlMap().get("/webjars/**")).isInstanceOf(ResourceWebHandler.class);
ResourceWebHandler webjarsHandler = (ResourceWebHandler) hm.getUrlMap().get("/webjars/**"); ResourceWebHandler webjarsHandler = (ResourceWebHandler) hm.getUrlMap().get("/webjars/**");
assertThat(webjarsHandler.getLocations()).hasSize(1); assertThat(webjarsHandler).extracting("locationValues").asList()
assertThat(webjarsHandler.getLocations().get(0)) .containsExactly("classpath:/META-INF/resources/webjars/");
.isEqualTo(new ClassPathResource("/META-INF/resources/webjars/"));
}); });
} }
@ -166,7 +166,7 @@ class WebFluxAutoConfigurationTests {
SimpleUrlHandlerMapping hm = context.getBean("resourceHandlerMapping", SimpleUrlHandlerMapping.class); SimpleUrlHandlerMapping hm = context.getBean("resourceHandlerMapping", SimpleUrlHandlerMapping.class);
assertThat(hm.getUrlMap().get("/static/**")).isInstanceOf(ResourceWebHandler.class); assertThat(hm.getUrlMap().get("/static/**")).isInstanceOf(ResourceWebHandler.class);
ResourceWebHandler staticHandler = (ResourceWebHandler) hm.getUrlMap().get("/static/**"); ResourceWebHandler staticHandler = (ResourceWebHandler) hm.getUrlMap().get("/static/**");
assertThat(staticHandler.getLocations()).hasSize(4); assertThat(staticHandler).extracting("locationValues").asList().hasSize(4);
}); });
} }

View File

@ -22,6 +22,7 @@ import java.time.ZoneId;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle; import java.time.format.FormatStyle;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@ -177,8 +178,10 @@ class WebMvcAutoConfigurationTests {
void resourceHandlerMapping() { void resourceHandlerMapping() {
this.contextRunner.run((context) -> { this.contextRunner.run((context) -> {
Map<String, List<Resource>> locations = getResourceMappingLocations(context); Map<String, List<Resource>> locations = getResourceMappingLocations(context);
assertThat(locations.get("/**")).hasSize(2); assertThat(locations.get("/**")).hasSize(5);
assertThat(locations.get("/webjars/**")).hasSize(0); assertThat(locations.get("/webjars/**")).hasSize(1);
assertThat(locations.get("/webjars/**").get(0))
.isEqualTo(new ClassPathResource("/META-INF/resources/webjars/"));
assertThat(getResourceResolvers(context, "/webjars/**")).hasSize(1); assertThat(getResourceResolvers(context, "/webjars/**")).hasSize(1);
assertThat(getResourceTransformers(context, "/webjars/**")).hasSize(0); assertThat(getResourceTransformers(context, "/webjars/**")).hasSize(0);
assertThat(getResourceResolvers(context, "/**")).hasSize(1); assertThat(getResourceResolvers(context, "/**")).hasSize(1);
@ -190,17 +193,17 @@ class WebMvcAutoConfigurationTests {
void customResourceHandlerMapping() { void customResourceHandlerMapping() {
this.contextRunner.withPropertyValues("spring.mvc.static-path-pattern:/static/**").run((context) -> { this.contextRunner.withPropertyValues("spring.mvc.static-path-pattern:/static/**").run((context) -> {
Map<String, List<Resource>> locations = getResourceMappingLocations(context); Map<String, List<Resource>> locations = getResourceMappingLocations(context);
assertThat(locations.get("/static/**")).hasSize(2); assertThat(locations.get("/static/**")).hasSize(5);
assertThat(getResourceResolvers(context, "/static/**")).hasSize(1); assertThat(getResourceResolvers(context, "/static/**")).hasSize(1);
}); });
} }
@Test @Test
void resourceHandlerMappingOverrideWebjars() { void resourceHandlerMappingOverrideWebjars() {
this.contextRunner.withUserConfiguration(WebJarsResources.class).run((context) -> { this.contextRunner.withUserConfiguration(WebJars.class).run((context) -> {
Map<String, List<Resource>> locations = getResourceMappingLocations(context); Map<String, List<Resource>> locations = getResourceMappingLocations(context);
assertThat(locations.get("/webjars/**")).hasSize(1); assertThat(locations.get("/webjars/**")).hasSize(1);
assertThat(locations.get("/webjars/**").get(0).getFilename()).isEqualTo("test"); assertThat(locations.get("/webjars/**").get(0)).isEqualTo(new ClassPathResource("/foo/"));
}); });
} }
@ -209,7 +212,7 @@ class WebMvcAutoConfigurationTests {
this.contextRunner.withUserConfiguration(AllResources.class).run((context) -> { this.contextRunner.withUserConfiguration(AllResources.class).run((context) -> {
Map<String, List<Resource>> locations = getResourceMappingLocations(context); Map<String, List<Resource>> locations = getResourceMappingLocations(context);
assertThat(locations.get("/**")).hasSize(1); assertThat(locations.get("/**")).hasSize(1);
assertThat(locations.get("/**").get(0).getFilename()).isEqualTo("test"); assertThat(locations.get("/**").get(0)).isEqualTo(new ClassPathResource("/foo/"));
}); });
} }
@ -1040,7 +1043,7 @@ class WebMvcAutoConfigurationTests {
protected Map<String, List<Resource>> getResourceMappingLocations(ApplicationContext context) { protected Map<String, List<Resource>> getResourceMappingLocations(ApplicationContext context) {
Object bean = context.getBean("resourceHandlerMapping"); Object bean = context.getBean("resourceHandlerMapping");
if (bean instanceof HandlerMapping) { if (bean instanceof HandlerMapping) {
return getMappingLocations((HandlerMapping) bean); return getMappingLocations(context, (HandlerMapping) bean);
} }
assertThat(bean.toString()).isEqualTo("null"); assertThat(bean.toString()).isEqualTo("null");
return Collections.emptyMap(); return Collections.emptyMap();
@ -1059,11 +1062,18 @@ class WebMvcAutoConfigurationTests {
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
protected Map<String, List<Resource>> getMappingLocations(HandlerMapping mapping) { private Map<String, List<Resource>> getMappingLocations(ApplicationContext context, HandlerMapping mapping) {
Map<String, List<Resource>> mappingLocations = new LinkedHashMap<>(); Map<String, List<Resource>> mappingLocations = new LinkedHashMap<>();
getHandlerMap(mapping).forEach((key, value) -> { getHandlerMap(mapping).forEach((key, value) -> {
Object locations = ReflectionTestUtils.getField(value, "locationsToUse"); List<String> locationValues = (List<String>) ReflectionTestUtils.getField(value, "locationValues");
mappingLocations.put(key, (List<Resource>) locations); List<Resource> locationResources = (List<Resource>) ReflectionTestUtils.getField(value,
"locationResources");
List<Resource> resources = new ArrayList<>();
for (String locationValue : locationValues) {
resources.add(context.getResource(locationValue));
}
resources.addAll(locationResources);
mappingLocations.put(key, resources);
}); });
return mappingLocations; return mappingLocations;
} }
@ -1094,11 +1104,11 @@ class WebMvcAutoConfigurationTests {
} }
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
static class WebJarsResources implements WebMvcConfigurer { static class WebJars implements WebMvcConfigurer {
@Override @Override
public void addResourceHandlers(ResourceHandlerRegistry registry) { public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/webjars/**").addResourceLocations(new ClassPathResource("/test", getClass())); registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/foo/");
} }
} }
@ -1108,7 +1118,7 @@ class WebMvcAutoConfigurationTests {
@Override @Override
public void addResourceHandlers(ResourceHandlerRegistry registry) { public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations(new ClassPathResource("/test", getClass())); registry.addResourceHandler("/**").addResourceLocations("classpath:/foo/");
} }
} }