From cf451c940f960fc8f1310d8e9f257abe06ab5179 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 18 Jul 2024 07:49:08 +0100 Subject: [PATCH] Fix compatibility problems with Spring Framework 6.2 Fixes gh-934 --- spring-restdocs-core/build.gradle | 2 +- spring-restdocs-mockmvc/build.gradle | 2 +- .../RestDocumentationRequestBuilders.java | 49 ++++++++++++------- .../mockmvc/MockMvcRequestConverterTests.java | 7 ++- ...RestDocumentationRequestBuildersTests.java | 21 +++++++- spring-restdocs-webtestclient/build.gradle | 2 +- .../WebTestClientRequestConverterTests.java | 14 ++++-- 7 files changed, 68 insertions(+), 29 deletions(-) diff --git a/spring-restdocs-core/build.gradle b/spring-restdocs-core/build.gradle index f5f6d59e..62f79124 100644 --- a/spring-restdocs-core/build.gradle +++ b/spring-restdocs-core/build.gradle @@ -86,6 +86,6 @@ components.java.withVariantsFromConfiguration(configurations.testFixturesRuntime compatibilityTest { dependency("Spring Framework") { springFramework -> springFramework.groupId = "org.springframework" - springFramework.versions = ["6.1.+"] + springFramework.versions = ["6.1.+", "6.2.+"] } } diff --git a/spring-restdocs-mockmvc/build.gradle b/spring-restdocs-mockmvc/build.gradle index d365c5d8..e0797246 100644 --- a/spring-restdocs-mockmvc/build.gradle +++ b/spring-restdocs-mockmvc/build.gradle @@ -26,6 +26,6 @@ dependencies { compatibilityTest { dependency("Spring Framework") { springFramework -> springFramework.groupId = "org.springframework" - springFramework.versions = ["6.1.+"] + springFramework.versions = ["6.1.+", "6.2.+"] } } \ No newline at end of file diff --git a/spring-restdocs-mockmvc/src/main/java/org/springframework/restdocs/mockmvc/RestDocumentationRequestBuilders.java b/spring-restdocs-mockmvc/src/main/java/org/springframework/restdocs/mockmvc/RestDocumentationRequestBuilders.java index 30f30204..b6479bd9 100644 --- a/spring-restdocs-mockmvc/src/main/java/org/springframework/restdocs/mockmvc/RestDocumentationRequestBuilders.java +++ b/spring-restdocs-mockmvc/src/main/java/org/springframework/restdocs/mockmvc/RestDocumentationRequestBuilders.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2023 the original author or authors. + * Copyright 2014-2024 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. @@ -51,8 +51,8 @@ private RestDocumentationRequestBuilders() { * @return the builder for the GET request */ public static MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables) { - return MockMvcRequestBuilders.get(urlTemplate, urlVariables) - .requestAttr(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE, urlTemplate); + return (MockHttpServletRequestBuilder) configureUrlTemplateRequestAttribute( + MockMvcRequestBuilders.get(urlTemplate, urlVariables), urlTemplate); } /** @@ -72,8 +72,8 @@ public static MockHttpServletRequestBuilder get(URI uri) { * @return the builder for the POST request */ public static MockHttpServletRequestBuilder post(String urlTemplate, Object... urlVariables) { - return MockMvcRequestBuilders.post(urlTemplate, urlVariables) - .requestAttr(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE, urlTemplate); + return (MockHttpServletRequestBuilder) configureUrlTemplateRequestAttribute( + MockMvcRequestBuilders.post(urlTemplate, urlVariables), urlTemplate); } /** @@ -93,8 +93,8 @@ public static MockHttpServletRequestBuilder post(URI uri) { * @return the builder for the PUT request */ public static MockHttpServletRequestBuilder put(String urlTemplate, Object... urlVariables) { - return MockMvcRequestBuilders.put(urlTemplate, urlVariables) - .requestAttr(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE, urlTemplate); + return (MockHttpServletRequestBuilder) configureUrlTemplateRequestAttribute( + MockMvcRequestBuilders.put(urlTemplate, urlVariables), urlTemplate); } /** @@ -114,8 +114,8 @@ public static MockHttpServletRequestBuilder put(URI uri) { * @return the builder for the PATCH request */ public static MockHttpServletRequestBuilder patch(String urlTemplate, Object... urlVariables) { - return MockMvcRequestBuilders.patch(urlTemplate, urlVariables) - .requestAttr(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE, urlTemplate); + return (MockHttpServletRequestBuilder) configureUrlTemplateRequestAttribute( + MockMvcRequestBuilders.patch(urlTemplate, urlVariables), urlTemplate); } /** @@ -135,8 +135,8 @@ public static MockHttpServletRequestBuilder patch(URI uri) { * @return the builder for the DELETE request */ public static MockHttpServletRequestBuilder delete(String urlTemplate, Object... urlVariables) { - return MockMvcRequestBuilders.delete(urlTemplate, urlVariables) - .requestAttr(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE, urlTemplate); + return (MockHttpServletRequestBuilder) configureUrlTemplateRequestAttribute( + MockMvcRequestBuilders.delete(urlTemplate, urlVariables), urlTemplate); } /** @@ -156,8 +156,8 @@ public static MockHttpServletRequestBuilder delete(URI uri) { * @return the builder for the OPTIONS request */ public static MockHttpServletRequestBuilder options(String urlTemplate, Object... urlVariables) { - return MockMvcRequestBuilders.options(urlTemplate, urlVariables) - .requestAttr(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE, urlTemplate); + return (MockHttpServletRequestBuilder) configureUrlTemplateRequestAttribute( + MockMvcRequestBuilders.options(urlTemplate, urlVariables), urlTemplate); } /** @@ -177,8 +177,8 @@ public static MockHttpServletRequestBuilder options(URI uri) { * @return the builder for the HEAD request */ public static MockHttpServletRequestBuilder head(String urlTemplate, Object... urlVariables) { - return MockMvcRequestBuilders.head(urlTemplate, urlVariables) - .requestAttr(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE, urlTemplate); + return (MockHttpServletRequestBuilder) configureUrlTemplateRequestAttribute( + MockMvcRequestBuilders.head(urlTemplate, urlVariables), urlTemplate); } /** @@ -200,8 +200,8 @@ public static MockHttpServletRequestBuilder head(URI uri) { */ public static MockHttpServletRequestBuilder request(HttpMethod httpMethod, String urlTemplate, Object... urlVariables) { - return MockMvcRequestBuilders.request(httpMethod, urlTemplate, urlVariables) - .requestAttr(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE, urlTemplate); + return (MockHttpServletRequestBuilder) configureUrlTemplateRequestAttribute( + MockMvcRequestBuilders.request(httpMethod, urlTemplate, urlVariables), urlTemplate); } /** @@ -224,8 +224,8 @@ public static MockHttpServletRequestBuilder request(HttpMethod httpMethod, URI u * @since 2.0.6 */ public static MockMultipartHttpServletRequestBuilder multipart(String urlTemplate, Object... urlVariables) { - return (MockMultipartHttpServletRequestBuilder) MockMvcRequestBuilders.multipart(urlTemplate, urlVariables) - .requestAttr(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE, urlTemplate); + return (MockMultipartHttpServletRequestBuilder) configureUrlTemplateRequestAttribute( + MockMvcRequestBuilders.multipart(urlTemplate, urlVariables), urlTemplate); } /** @@ -238,4 +238,15 @@ public static MockMultipartHttpServletRequestBuilder multipart(URI uri) { return MockMvcRequestBuilders.multipart(uri); } + private static Object configureUrlTemplateRequestAttribute(Object builder, String urlTemplate) { + try { + return builder.getClass() + .getMethod("requestAttr", String.class, Object.class) + .invoke(builder, RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE, urlTemplate); + } + catch (Exception ex) { + throw new RuntimeException(ex); + } + } + } diff --git a/spring-restdocs-mockmvc/src/test/java/org/springframework/restdocs/mockmvc/MockMvcRequestConverterTests.java b/spring-restdocs-mockmvc/src/test/java/org/springframework/restdocs/mockmvc/MockMvcRequestConverterTests.java index 397b7ed7..580ee618 100644 --- a/spring-restdocs-mockmvc/src/test/java/org/springframework/restdocs/mockmvc/MockMvcRequestConverterTests.java +++ b/spring-restdocs-mockmvc/src/test/java/org/springframework/restdocs/mockmvc/MockMvcRequestConverterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2023 the original author or authors. + * Copyright 2014-2024 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. @@ -34,6 +34,7 @@ import org.springframework.restdocs.operation.OperationRequestPart; import org.springframework.restdocs.operation.RequestCookie; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; +import org.springframework.test.web.servlet.request.MockMultipartHttpServletRequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import static org.assertj.core.api.Assertions.assertThat; @@ -236,4 +237,8 @@ private OperationRequest createOperationRequest(MockHttpServletRequestBuilder bu return this.factory.convert(builder.buildRequest(new MockServletContext())); } + private OperationRequest createOperationRequest(MockMultipartHttpServletRequestBuilder builder) { + return this.factory.convert(builder.buildRequest(new MockServletContext())); + } + } diff --git a/spring-restdocs-mockmvc/src/test/java/org/springframework/restdocs/mockmvc/RestDocumentationRequestBuildersTests.java b/spring-restdocs-mockmvc/src/test/java/org/springframework/restdocs/mockmvc/RestDocumentationRequestBuildersTests.java index b6a25d46..12d07ea1 100644 --- a/spring-restdocs-mockmvc/src/test/java/org/springframework/restdocs/mockmvc/RestDocumentationRequestBuildersTests.java +++ b/spring-restdocs-mockmvc/src/test/java/org/springframework/restdocs/mockmvc/RestDocumentationRequestBuildersTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2023 the original author or authors. + * Copyright 2014-2024 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. @@ -26,6 +26,7 @@ import org.springframework.mock.web.MockServletContext; import org.springframework.restdocs.generate.RestDocumentationGenerator; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; +import org.springframework.test.web.servlet.request.MockMultipartHttpServletRequestBuilder; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.delete; @@ -140,6 +141,15 @@ public void multipartUri() { private void assertTemplate(MockHttpServletRequestBuilder builder, HttpMethod httpMethod) { MockHttpServletRequest request = builder.buildRequest(this.servletContext); + assertTemplate(httpMethod, request); + } + + private void assertTemplate(MockMultipartHttpServletRequestBuilder builder, HttpMethod httpMethod) { + MockHttpServletRequest request = builder.buildRequest(this.servletContext); + assertTemplate(httpMethod, request); + } + + private void assertTemplate(HttpMethod httpMethod, MockHttpServletRequest request) { assertThat((String) request.getAttribute(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE)) .isEqualTo("/{template}"); assertThat(request.getRequestURI()).isEqualTo("/t"); @@ -148,6 +158,15 @@ private void assertTemplate(MockHttpServletRequestBuilder builder, HttpMethod ht private void assertUri(MockHttpServletRequestBuilder builder, HttpMethod httpMethod) { MockHttpServletRequest request = builder.buildRequest(this.servletContext); + assertUri(httpMethod, request); + } + + private void assertUri(MockMultipartHttpServletRequestBuilder builder, HttpMethod httpMethod) { + MockHttpServletRequest request = builder.buildRequest(this.servletContext); + assertUri(httpMethod, request); + } + + private void assertUri(HttpMethod httpMethod, MockHttpServletRequest request) { assertThat(request.getRequestURI()).isEqualTo("/uri"); assertThat(request.getMethod()).isEqualTo(httpMethod.name()); } diff --git a/spring-restdocs-webtestclient/build.gradle b/spring-restdocs-webtestclient/build.gradle index a6009396..027d19ac 100644 --- a/spring-restdocs-webtestclient/build.gradle +++ b/spring-restdocs-webtestclient/build.gradle @@ -25,6 +25,6 @@ dependencies { compatibilityTest { dependency("Spring Framework") { springFramework -> springFramework.groupId = "org.springframework" - springFramework.versions = ["6.1.+"] + springFramework.versions = ["6.1.+", "6.2.+"] } } diff --git a/spring-restdocs-webtestclient/src/test/java/org/springframework/restdocs/webtestclient/WebTestClientRequestConverterTests.java b/spring-restdocs-webtestclient/src/test/java/org/springframework/restdocs/webtestclient/WebTestClientRequestConverterTests.java index 62e2e37f..edc578ba 100644 --- a/spring-restdocs-webtestclient/src/test/java/org/springframework/restdocs/webtestclient/WebTestClientRequestConverterTests.java +++ b/spring-restdocs-webtestclient/src/test/java/org/springframework/restdocs/webtestclient/WebTestClientRequestConverterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2023 the original author or authors. + * Copyright 2014-2024 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. @@ -173,8 +173,10 @@ public void postRequestWithFormDataParameters() { assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo")); assertThat(request.getMethod()).isEqualTo(HttpMethod.POST); assertThat(request.getContentAsString()).isEqualTo("a=alpha&a=apple&b=br%26vo"); - assertThat(request.getHeaders().getContentType()) - .isEqualTo(new MediaType(MediaType.APPLICATION_FORM_URLENCODED, StandardCharsets.UTF_8)); + assertThat(request.getHeaders().getContentType()).satisfiesAnyOf( + (mediaType) -> assertThat(mediaType) + .isEqualTo(new MediaType(MediaType.APPLICATION_FORM_URLENCODED, StandardCharsets.UTF_8)), + (mediaType) -> assertThat(mediaType).isEqualTo(new MediaType(MediaType.APPLICATION_FORM_URLENCODED))); } @Test @@ -217,8 +219,10 @@ public void postRequestWithQueryStringAndFormDataParameters() { assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo?a=alpha&b=br%26vo")); assertThat(request.getMethod()).isEqualTo(HttpMethod.POST); assertThat(request.getContentAsString()).isEqualTo("a=apple"); - assertThat(request.getHeaders().getContentType()) - .isEqualTo(new MediaType(MediaType.APPLICATION_FORM_URLENCODED, StandardCharsets.UTF_8)); + assertThat(request.getHeaders().getContentType()).satisfiesAnyOf( + (mediaType) -> assertThat(mediaType) + .isEqualTo(new MediaType(MediaType.APPLICATION_FORM_URLENCODED, StandardCharsets.UTF_8)), + (mediaType) -> assertThat(mediaType).isEqualTo(new MediaType(MediaType.APPLICATION_FORM_URLENCODED))); } @Test