Skip to content

Commit

Permalink
Improve MediaTypeAssert to-string-equality assertions
Browse files Browse the repository at this point in the history
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
  • Loading branch information
simonbasle committed May 15, 2024
1 parent 60c5f44 commit 531da01
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,21 @@ public MediaTypeAssert(@Nullable MediaType mediaType) {
/**
* Verify that the actual media type is equal to the given string
* representation.
* @param expected the expected media type
* @param mediaType the expected media type, as a String to be parsed
* into a MediaType
*/
public MediaTypeAssert isEqualTo(String mediaType) {
return isEqualTo(parseMediaType(mediaType));
}

/**
* Verify that the actual media type is not equal to the given string
* representation.
* @param mediaType the given media type, as a String to be parsed
* into a MediaType
*/
public MediaTypeAssert isEqualTo(String expected) {
return isEqualTo(parseMediaType(expected));
public MediaTypeAssert isNotEqualTo(String mediaType) {
return isNotEqualTo(parseMediaType(mediaType));
}

/**
Expand Down Expand Up @@ -84,7 +95,8 @@ public MediaTypeAssert isCompatibleWith(MediaType mediaType) {
* // Check that actual is compatible with "text/plain"
* assertThat(mediaType).isCompatibleWith("text/plain");
* </code></pre>
* @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));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,19 +43,35 @@ void actualStringCanBeNull() {
}

@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");
Expand All @@ -73,6 +89,49 @@ void isEqualWhenDifferentTypeShouldFail() {
.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");
Expand Down

0 comments on commit 531da01

Please sign in to comment.