From bf63309d05e60ed50e05adc1ac8d974f6fc91a3d Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Thu, 14 Jul 2022 12:50:32 +0100 Subject: [PATCH] Allow empty path in MockMvc Closes gh-28823 --- .../request/MockHttpServletRequestBuilder.java | 4 ++-- .../server/DefaultControllerSpecTests.java | 18 ++++++++++++++++-- .../MockHttpServletRequestBuilderTests.java | 13 ++++++++++++- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilder.java b/spring-test/src/main/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilder.java index ac573d4071c..cc4968472a8 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilder.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilder.java @@ -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"); * 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) { 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); return UriComponentsBuilder.fromUriString(url).buildAndExpand(vars).encode().toUri(); } diff --git a/spring-test/src/test/java/org/springframework/test/web/reactive/server/DefaultControllerSpecTests.java b/spring-test/src/test/java/org/springframework/test/web/reactive/server/DefaultControllerSpecTests.java index 3a7544011dc..33493792aa0 100644 --- a/spring-test/src/test/java/org/springframework/test/web/reactive/server/DefaultControllerSpecTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/reactive/server/DefaultControllerSpecTests.java @@ -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"); * you may not use this file except in compliance with the License. @@ -50,6 +50,15 @@ public class DefaultControllerSpecTests { .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 public void controllerAdvice() { new DefaultControllerSpec(new MyController()) @@ -116,10 +125,15 @@ public class DefaultControllerSpecTests { private static class MyController { @GetMapping("/") - public String handle() { + public String handleRootPath() { return "Success"; } + @GetMapping + public String handleEmptyPath() { + return "Success empty path"; + } + @GetMapping("/exception") public void handleWithError() { throw new IllegalStateException(); diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilderTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilderTests.java index 6cdf99d09fc..2f5a0f8ecea 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilderTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilderTests.java @@ -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"); * you may not use this file except in compliance with the License. @@ -165,6 +165,17 @@ class MockHttpServletRequestBuilderTests { 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 void pathInfoIsDecoded() { this.builder = new MockHttpServletRequestBuilder(HttpMethod.GET, "/travel/hotels 42");