From 531da015e108346695a69872335b6bd9ae3d55a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Basl=C3=A9?= Date: Wed, 15 May 2024 11:01:30 +0200 Subject: [PATCH] Improve MediaTypeAssert to-string-equality assertions This commit introduces a `isNotEqualTo(String)` assertion in order to avoid false negatives when using the default Object-based assertion. This is a risk since MediaTypeAssert has a `isEqualTo(String)` method that overrides the base object method and parses the provided String into a MediaType. Users may thus be tempted to use the reverse assertion and expect the same parsing behaviour. This commit also adds tests around the String parsing and the isNotEqual cases. Closes gh-32756 --- .../test/http/MediaTypeAssert.java | 20 ++++-- .../test/http/MediaTypeAssertTests.java | 65 ++++++++++++++++++- 2 files changed, 78 insertions(+), 7 deletions(-) diff --git a/spring-test/src/main/java/org/springframework/test/http/MediaTypeAssert.java b/spring-test/src/main/java/org/springframework/test/http/MediaTypeAssert.java index 6f002c8f6d..5c6077cce6 100644 --- a/spring-test/src/main/java/org/springframework/test/http/MediaTypeAssert.java +++ b/spring-test/src/main/java/org/springframework/test/http/MediaTypeAssert.java @@ -49,10 +49,21 @@ public class MediaTypeAssert extends AbstractObjectAssert - * @param mediaType the media type with which to compare + * @param mediaType the media type with which to compare, as a String + * to be parsed into a MediaType */ public MediaTypeAssert isCompatibleWith(String mediaType) { return isCompatibleWith(parseMediaType(mediaType)); diff --git a/spring-test/src/test/java/org/springframework/test/http/MediaTypeAssertTests.java b/spring-test/src/test/java/org/springframework/test/http/MediaTypeAssertTests.java index 232d25400f..c8b1d71ee7 100644 --- a/spring-test/src/test/java/org/springframework/test/http/MediaTypeAssertTests.java +++ b/spring-test/src/test/java/org/springframework/test/http/MediaTypeAssertTests.java @@ -43,19 +43,35 @@ class MediaTypeAssertTests { } @Test - void isEqualWhenSameShouldPass() { + void isEqualWhenActualIsNullStringShouldFail() { + assertThatExceptionOfType(AssertionError.class) + .isThrownBy(() -> assertThat(null).isEqualTo("text/html")) + .withMessageContaining("Media type"); + } + + @Test + void isEqualWhenSameStringShouldPass() { assertThat(mediaType("application/json")).isEqualTo("application/json"); } @Test - void isEqualWhenDifferentShouldFail() { + void isEqualWhenDifferentStringShouldFail() { assertThatExceptionOfType(AssertionError.class) .isThrownBy(() -> assertThat(mediaType("application/json")).isEqualTo("text/html")) .withMessageContaining("Media type"); } @Test - void isEqualWhenActualIsNullShouldFail() { + void isEqualInvalidStringShouldFail() { + assertThatExceptionOfType(AssertionError.class) + .isThrownBy(() -> assertThat(mediaType("application/json")).isEqualTo("example of a bad value")) + .withMessageContaining("[Media type]") + .withMessageEndingWith("To be a valid media type but got:\n" + + " \"Invalid mime type \"example of a bad value\": does not contain '/'\"\n"); + } + + @Test + void isEqualWhenActualIsNullTypeShouldFail() { assertThatExceptionOfType(AssertionError.class) .isThrownBy(() -> assertThat(null).isEqualTo(MediaType.APPLICATION_JSON)) .withMessageContaining("Media type"); @@ -73,6 +89,49 @@ class MediaTypeAssertTests { .withMessageContaining("Media type"); } + @Test + void isNotEqualWhenActualIsNullStringShouldPass() { + assertThat(null).isNotEqualTo("application/json"); + } + + @Test + void isNotEqualWhenDifferentStringShouldPass() { + assertThat(mediaType("application/json")).isNotEqualTo("text/html"); + } + + @Test + void isNotEqualWhenSameStringShouldFail() { + assertThatExceptionOfType(AssertionError.class) + .isThrownBy(() -> assertThat(mediaType("application/json")).isNotEqualTo("application/json")) + .withMessageContaining("Media type"); + } + + @Test + void isNotEqualInvalidStringShouldFail() { + assertThatExceptionOfType(AssertionError.class) + .isThrownBy(() -> assertThat(mediaType("application/json")).isNotEqualTo("example of a bad value")) + .withMessageContaining("[Media type]") + .withMessageEndingWith("To be a valid media type but got:\n" + + " \"Invalid mime type \"example of a bad value\": does not contain '/'\"\n"); + } + + @Test + void isNotEqualWhenActualIsNullTypeShouldPass() { + assertThat(null).isNotEqualTo(MediaType.APPLICATION_JSON); + } + + @Test + void isNotEqualWhenDifferentTypeShouldPass() { + assertThat(mediaType("application/json")).isNotEqualTo(MediaType.TEXT_HTML); + } + + @Test + void isNotEqualWhenSameTypeShouldFail() { + assertThatExceptionOfType(AssertionError.class) + .isThrownBy(() -> assertThat(mediaType("application/json")).isNotEqualTo(MediaType.APPLICATION_JSON)) + .withMessageContaining("Media type"); + } + @Test void isCompatibleWhenSameShouldPass() { assertThat(mediaType("application/json")).isCompatibleWith("application/json");