From eb84c843736aaa555d9078a544280bd70b714fbb Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Sat, 5 Feb 2022 20:11:47 +0100 Subject: [PATCH] Polish contribution See gh-27993 --- .../reactive/server/DefaultWebTestClient.java | 2 +- .../web/reactive/server/WebTestClient.java | 31 ++++--- .../server/samples/JsonContentTests.java | 85 ++++++++++--------- 3 files changed, 66 insertions(+), 52 deletions(-) diff --git a/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java b/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java index 3c0a33cb67..a3cc4c2890 100644 --- a/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java +++ b/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.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. diff --git a/spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java b/spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java index b8115a2e54..481a8d999e 100644 --- a/spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java +++ b/spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.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. @@ -973,11 +973,14 @@ public interface WebTestClient { /** * Parse the expected and actual response content as JSON and perform a - * "lenient" comparison verifying the same attribute-value pairs. - *

Use of this option requires the + * comparison verifying that they contain the same attribute-value pairs + * regardless of formatting with lenient checking (extensible + * and non-strict array ordering). + *

Use of this method requires the * JSONassert library - * on to be on the classpath. - * @param expectedJson the expected JSON content. + * to be on the classpath. + * @param expectedJson the expected JSON content + * @see #json(String, boolean) */ default BodyContentSpec json(String expectedJson) { return json(expectedJson, false); @@ -985,16 +988,20 @@ public interface WebTestClient { /** * Parse the expected and actual response content as JSON and perform a - * comparison in two modes, depending on {@code strict} parameter value, verifying the same attribute-value pairs. + * comparison verifying that they contain the same attribute-value pairs + * regardless of formatting. + *

Can compare in two modes, depending on the {@code strict} parameter value: *

- *

Use of this option requires the + *

Use of this method requires the * JSONassert library - * on to be on the classpath. - * @param expectedJson the expected JSON content. - * @param strict enables strict checking + * to be on the classpath. + * @param expectedJson the expected JSON content + * @param strict enables strict checking if {@code true} + * @since 5.3.16 + * @see #json(String) */ BodyContentSpec json(String expectedJson, boolean strict); diff --git a/spring-test/src/test/java/org/springframework/test/web/reactive/server/samples/JsonContentTests.java b/spring-test/src/test/java/org/springframework/test/web/reactive/server/samples/JsonContentTests.java index 2df1ad44ad..f038fb513d 100644 --- a/spring-test/src/test/java/org/springframework/test/web/reactive/server/samples/JsonContentTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/reactive/server/samples/JsonContentTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 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. @@ -34,7 +34,6 @@ import org.springframework.web.bind.annotation.RestController; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.hamcrest.Matchers.containsString; - /** * Samples of tests using {@link WebTestClient} with serialized JSON content. * @@ -48,31 +47,41 @@ public class JsonContentTests { @Test - public void jsonContent() { - this.client.get().uri("/persons/extended") + public void jsonContentWithDefaultLenientMode() { + this.client.get().uri("/persons") .accept(MediaType.APPLICATION_JSON) .exchange() .expectStatus().isOk() - .expectBody().json("[{\"name\":\"Jane\"},{\"name\":\"Jason\"},{\"name\":\"John\"}]"); + .expectBody().json( + "[{\"firstName\":\"Jane\"}," + + "{\"firstName\":\"Jason\"}," + + "{\"firstName\":\"John\"}]"); } @Test - public void jsonContentStrictFail() { - assertThatExceptionOfType(AssertionError.class).isThrownBy(() -> this.client.get().uri("/persons/extended") + public void jsonContentWithStrictMode() { + this.client.get().uri("/persons") .accept(MediaType.APPLICATION_JSON) .exchange() .expectStatus().isOk() - .expectBody().json("[{\"name\":\"Jane\"},{\"name\":\"Jason\"},{\"name\":\"John\"}]", true) - ); + .expectBody().json( + "[{\"firstName\":\"Jane\",\"lastName\":\"Williams\"}," + + "{\"firstName\":\"Jason\",\"lastName\":\"Johnson\"}," + + "{\"firstName\":\"John\",\"lastName\":\"Smith\"}]", + true); } @Test - public void jsonContentStrict() { - this.client.get().uri("/persons/extended") + public void jsonContentWithStrictModeAndMissingAttributes() { + assertThatExceptionOfType(AssertionError.class).isThrownBy(() -> this.client.get().uri("/persons") .accept(MediaType.APPLICATION_JSON) .exchange() - .expectStatus().isOk() - .expectBody().json("[{\"name\":\"Jane\",\"surname\":\"Williams\"},{\"name\":\"Jason\",\"surname\":\"Johnson\"},{\"name\":\"John\",\"surname\":\"Smith\"}]", true); + .expectBody().json( + "[{\"firstName\":\"Jane\"}," + + "{\"firstName\":\"Jason\"}," + + "{\"firstName\":\"John\"}]", + true) + ); } @Test @@ -82,26 +91,26 @@ public class JsonContentTests { .exchange() .expectStatus().isOk() .expectBody() - .jsonPath("$[0].name").isEqualTo("Jane") - .jsonPath("$[1].name").isEqualTo("Jason") - .jsonPath("$[2].name").isEqualTo("John"); + .jsonPath("$[0].firstName").isEqualTo("Jane") + .jsonPath("$[1].firstName").isEqualTo("Jason") + .jsonPath("$[2].firstName").isEqualTo("John"); } @Test public void jsonPathMatches() { - this.client.get().uri("/persons/John") + this.client.get().uri("/persons/John/Smith") .accept(MediaType.APPLICATION_JSON) .exchange() .expectStatus().isOk() .expectBody() - .jsonPath("$.name").value(containsString("oh")); + .jsonPath("$.firstName").value(containsString("oh")); } @Test public void postJsonContent() { this.client.post().uri("/persons") .contentType(MediaType.APPLICATION_JSON) - .bodyValue("{\"name\":\"John\"}") + .bodyValue("{\"firstName\":\"John\",\"lastName\":\"Smith\"}") .exchange() .expectStatus().isCreated() .expectBody().isEmpty(); @@ -114,40 +123,38 @@ public class JsonContentTests { @GetMapping Flux getPersons() { - return Flux.just(new Person("Jane"), new Person("Jason"), new Person("John")); - } - - @GetMapping("/extended") - Flux getExtendedPersons() { - return Flux.just(new ExtendedPerson("Jane", "Williams"), new ExtendedPerson("Jason", "Johnson"), new ExtendedPerson("John", "Smith")); + return Flux.just(new Person("Jane", "Williams"), new Person("Jason", "Johnson"), new Person("John", "Smith")); } - @GetMapping("/{name}") - Person getPerson(@PathVariable String name) { - return new Person(name); + @GetMapping("/{firstName}/{lastName}") + Person getPerson(@PathVariable String firstName, @PathVariable String lastName) { + return new Person(firstName, lastName); } @PostMapping ResponseEntity savePerson(@RequestBody Person person) { - return ResponseEntity.created(URI.create("/persons/" + person.getName())).build(); + return ResponseEntity.created(URI.create(String.format("/persons/%s/%s", person.getFirstName(), person.getLastName()))).build(); } } - static class ExtendedPerson { - private String name; - private String surname; + static class Person { + private String firstName; + private String lastName; + + public Person() { + } - public ExtendedPerson(String name, String surname) { - this.name = name; - this.surname = surname; + public Person(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; } - public String getName() { - return name; + public String getFirstName() { + return this.firstName; } - public String getSurname() { - return surname; + public String getLastName() { + return this.lastName; } }