Allow empty path in MockMvc

Closes gh-28823
This commit is contained in:
rstoyanchev 2022-07-14 12:50:32 +01:00
parent 963fd75aff
commit bf63309d05
3 changed files with 30 additions and 5 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2021 the original author or authors. * Copyright 2002-2022 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.
@ -148,7 +148,7 @@ public class MockHttpServletRequestBuilder
private static URI initUri(String url, Object[] vars) { private static URI initUri(String url, Object[] vars) {
Assert.notNull(url, "'url' must not be null"); Assert.notNull(url, "'url' must not be null");
Assert.isTrue(url.startsWith("/") || url.startsWith("http://") || url.startsWith("https://"), "" + Assert.isTrue(url.isEmpty() || url.startsWith("/") || url.startsWith("http://") || url.startsWith("https://"),
"'url' should start with a path or be a complete HTTP URL: " + url); "'url' should start with a path or be a complete HTTP URL: " + url);
return UriComponentsBuilder.fromUriString(url).buildAndExpand(vars).encode().toUri(); return UriComponentsBuilder.fromUriString(url).buildAndExpand(vars).encode().toUri();
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2020 the original author or authors. * Copyright 2002-2022 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,6 +50,15 @@ public class DefaultControllerSpecTests {
.expectBody(String.class).isEqualTo("Success"); .expectBody(String.class).isEqualTo("Success");
} }
@Test
public void controllerEmptyPath() {
new DefaultControllerSpec(new MyController()).build()
.get().uri("")
.exchange()
.expectStatus().isOk()
.expectBody(String.class).isEqualTo("Success empty path");
}
@Test @Test
public void controllerAdvice() { public void controllerAdvice() {
new DefaultControllerSpec(new MyController()) new DefaultControllerSpec(new MyController())
@ -116,10 +125,15 @@ public class DefaultControllerSpecTests {
private static class MyController { private static class MyController {
@GetMapping("/") @GetMapping("/")
public String handle() { public String handleRootPath() {
return "Success"; return "Success";
} }
@GetMapping
public String handleEmptyPath() {
return "Success empty path";
}
@GetMapping("/exception") @GetMapping("/exception")
public void handleWithError() { public void handleWithError() {
throw new IllegalStateException(); throw new IllegalStateException();

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2021 the original author or authors. * Copyright 2002-2022 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.
@ -165,6 +165,17 @@ class MockHttpServletRequestBuilderTests {
assertThat(request.getPathInfo()).isNull(); assertThat(request.getPathInfo()).isNull();
} }
@Test // gh-28823
void emptyPath() {
this.builder = new MockHttpServletRequestBuilder(HttpMethod.GET, "");
MockHttpServletRequest request = this.builder.buildRequest(this.servletContext);
assertThat(request.getRequestURI()).isEqualTo("");
assertThat(request.getContextPath()).isEqualTo("");
assertThat(request.getServletPath()).isEqualTo("");
assertThat(request.getPathInfo()).isNull();
}
@Test // SPR-16453 @Test // SPR-16453
void pathInfoIsDecoded() { void pathInfoIsDecoded() {
this.builder = new MockHttpServletRequestBuilder(HttpMethod.GET, "/travel/hotels 42"); this.builder = new MockHttpServletRequestBuilder(HttpMethod.GET, "/travel/hotels 42");