Polish ContentDispositionTests

Closes gh-23485
This commit is contained in:
Rossen Stoyanchev 2019-09-03 11:17:32 +01:00
parent f084b63286
commit c97580035e
1 changed files with 94 additions and 80 deletions

View File

@ -28,129 +28,143 @@ import org.springframework.util.ReflectionUtils;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
/** /**
* Unit tests for {@link ContentDisposition} * Unit tests for {@link ContentDisposition}
*
* @author Sebastien Deleuze * @author Sebastien Deleuze
* @author Rossen Stoyanchev
*/ */
public class ContentDispositionTests { public class ContentDispositionTests {
@Test private static DateTimeFormatter formatter = DateTimeFormatter.RFC_1123_DATE_TIME;
public void parseTest() {
ContentDisposition disposition = ContentDisposition
.parse("form-data; name=\"foo\"; filename=\"foo.txt\"; size=123");
assertThat(disposition).isEqualTo(ContentDisposition.builder("form-data")
.name("foo").filename("foo.txt").size(123L).build());
}
@Test @Test
public void parse() { public void parse() {
ContentDisposition disposition = ContentDisposition assertThat(parse("form-data; name=\"foo\"; filename=\"foo.txt\"; size=123"))
.parse("form-data; name=\"foo\"; filename=\"foo.txt\"; size=123"); .isEqualTo(ContentDisposition.builder("form-data")
assertThat(disposition).isEqualTo(ContentDisposition.builder("form-data") .name("foo")
.name("foo").filename("foo.txt").size(123L).build()); .filename("foo.txt")
.size(123L)
.build());
} }
@Test @Test
public void parseType() { public void parseFilenameUnquoted() {
ContentDisposition disposition = ContentDisposition.parse("form-data"); assertThat(parse("form-data; filename=unquoted"))
assertThat(disposition).isEqualTo(ContentDisposition.builder("form-data").build()); .isEqualTo(ContentDisposition.builder("form-data")
} .filename("unquoted")
.build());
@Test
public void parseUnquotedFilename() {
ContentDisposition disposition = ContentDisposition
.parse("form-data; filename=unquoted");
assertThat(disposition).isEqualTo(ContentDisposition.builder("form-data").filename("unquoted").build());
} }
@Test // SPR-16091 @Test // SPR-16091
public void parseFilenameWithSemicolon() { public void parseFilenameWithSemicolon() {
ContentDisposition disposition = ContentDisposition assertThat(parse("attachment; filename=\"filename with ; semicolon.txt\""))
.parse("attachment; filename=\"filename with ; semicolon.txt\""); .isEqualTo(ContentDisposition.builder("attachment")
assertThat(disposition).isEqualTo(ContentDisposition.builder("attachment") .filename("filename with ; semicolon.txt")
.filename("filename with ; semicolon.txt").build()); .build());
}
@Test
public void parseAndIgnoreEmptyParts() {
ContentDisposition disposition = ContentDisposition
.parse("form-data; name=\"foo\";; ; filename=\"foo.txt\"; size=123");
assertThat(disposition).isEqualTo(ContentDisposition.builder("form-data")
.name("foo").filename("foo.txt").size(123L).build());
} }
@Test @Test
public void parseEncodedFilename() { public void parseEncodedFilename() {
ContentDisposition disposition = ContentDisposition assertThat(parse("form-data; name=\"name\"; filename*=UTF-8''%E4%B8%AD%E6%96%87.txt"))
.parse("form-data; name=\"name\"; filename*=UTF-8''%E4%B8%AD%E6%96%87.txt"); .isEqualTo(ContentDisposition.builder("form-data")
assertThat(disposition).isEqualTo(ContentDisposition.builder("form-data").name("name") .name("name")
.filename("中文.txt", StandardCharsets.UTF_8).build()); .filename("中文.txt", StandardCharsets.UTF_8)
.build());
} }
@Test // gh-23077 @Test // gh-23077
public void parseWithEscapedQuote() { public void parseWithEscapedQuote() {
ContentDisposition disposition = ContentDisposition.parse( assertThat(parse("form-data; name=\"file\"; filename=\"\\\"The Twilight Zone\\\".txt\"; size=123"))
"form-data; name=\"file\"; filename=\"\\\"The Twilight Zone\\\".txt\"; size=123"); .isEqualTo(ContentDisposition.builder("form-data")
assertThat(ContentDisposition.builder("form-data").name("file") .name("file")
.filename("\\\"The Twilight Zone\\\".txt").size(123L).build()).isEqualTo(disposition); .filename("\\\"The Twilight Zone\\\".txt")
.size(123L)
.build());
} }
@Test @Test
public void parseEmpty() { public void parseWithExtraSemicolons() {
assertThatIllegalArgumentException().isThrownBy(() -> assertThat(parse("form-data; name=\"foo\";; ; filename=\"foo.txt\"; size=123"))
ContentDisposition.parse("")); .isEqualTo(ContentDisposition.builder("form-data")
} .name("foo")
.filename("foo.txt")
@Test .size(123L)
public void parseNoType() { .build());
assertThatIllegalArgumentException().isThrownBy(() ->
ContentDisposition.parse(";"));
}
@Test
public void parseInvalidParameter() {
assertThatIllegalArgumentException().isThrownBy(() ->
ContentDisposition.parse("foo;bar"));
} }
@Test @Test
public void parseDates() { public void parseDates() {
ContentDisposition disposition = ContentDisposition ZonedDateTime creationTime = ZonedDateTime.parse("Mon, 12 Feb 2007 10:15:30 -0500", formatter);
.parse("attachment; creation-date=\"Mon, 12 Feb 2007 10:15:30 -0500\"; " + ZonedDateTime modificationTime = ZonedDateTime.parse("Tue, 13 Feb 2007 10:15:30 -0500", formatter);
"modification-date=\"Tue, 13 Feb 2007 10:15:30 -0500\"; " + ZonedDateTime readTime = ZonedDateTime.parse("Wed, 14 Feb 2007 10:15:30 -0500", formatter);
"read-date=\"Wed, 14 Feb 2007 10:15:30 -0500\"");
DateTimeFormatter formatter = DateTimeFormatter.RFC_1123_DATE_TIME; assertThat(
assertThat(disposition).isEqualTo(ContentDisposition.builder("attachment") parse("attachment; " +
.creationDate(ZonedDateTime.parse("Mon, 12 Feb 2007 10:15:30 -0500", formatter)) "creation-date=\"" + creationTime.format(formatter) + "\"; " +
.modificationDate(ZonedDateTime.parse("Tue, 13 Feb 2007 10:15:30 -0500", formatter)) "modification-date=\"" + modificationTime.format(formatter) + "\"; " +
.readDate(ZonedDateTime.parse("Wed, 14 Feb 2007 10:15:30 -0500", formatter)).build()); "read-date=\"" + readTime.format(formatter) + "\"")).isEqualTo(
ContentDisposition.builder("attachment")
.creationDate(creationTime)
.modificationDate(modificationTime)
.readDate(readTime)
.build());
} }
@Test @Test
public void parseInvalidDates() { public void parseIgnoresInvalidDates() {
ContentDisposition disposition = ContentDisposition ZonedDateTime readTime = ZonedDateTime.parse("Wed, 14 Feb 2007 10:15:30 -0500", formatter);
.parse("attachment; creation-date=\"-1\"; modification-date=\"-1\"; " +
"read-date=\"Wed, 14 Feb 2007 10:15:30 -0500\""); assertThat(
DateTimeFormatter formatter = DateTimeFormatter.RFC_1123_DATE_TIME; parse("attachment; " +
assertThat(disposition).isEqualTo(ContentDisposition.builder("attachment") "creation-date=\"-1\"; " +
.readDate(ZonedDateTime.parse("Wed, 14 Feb 2007 10:15:30 -0500", formatter)).build()); "modification-date=\"-1\"; " +
"read-date=\"" + readTime.format(formatter) + "\"")).isEqualTo(
ContentDisposition.builder("attachment")
.readDate(readTime)
.build());
} }
@Test
public void parseEmpty() {
assertThatIllegalArgumentException().isThrownBy(() -> parse(""));
}
@Test
public void parseNoType() {
assertThatIllegalArgumentException().isThrownBy(() -> parse(";"));
}
@Test
public void parseInvalidParameter() {
assertThatIllegalArgumentException().isThrownBy(() -> parse("foo;bar"));
}
private static ContentDisposition parse(String input) {
return ContentDisposition.parse(input);
}
@Test @Test
public void headerValue() { public void headerValue() {
ContentDisposition disposition = ContentDisposition.builder("form-data") assertThat(
.name("foo").filename("foo.txt").size(123L).build(); ContentDisposition.builder("form-data")
assertThat(disposition.toString()).isEqualTo("form-data; name=\"foo\"; filename=\"foo.txt\"; size=123"); .name("foo")
.filename("foo.txt")
.size(123L)
.build().toString())
.isEqualTo("form-data; name=\"foo\"; filename=\"foo.txt\"; size=123");
} }
@Test @Test
public void headerValueWithEncodedFilename() { public void headerValueWithEncodedFilename() {
ContentDisposition disposition = ContentDisposition.builder("form-data") assertThat(
.name("name").filename("中文.txt", StandardCharsets.UTF_8).build(); ContentDisposition.builder("form-data")
assertThat(disposition.toString()).isEqualTo("form-data; name=\"name\"; filename*=UTF-8''%E4%B8%AD%E6%96%87.txt"); .name("name")
.filename("中文.txt", StandardCharsets.UTF_8)
.build().toString())
.isEqualTo("form-data; name=\"name\"; filename*=UTF-8''%E4%B8%AD%E6%96%87.txt");
} }
@Test // SPR-14547 @Test // SPR-14547