forked from playframework/playframework
-
Notifications
You must be signed in to change notification settings - Fork 0
/
WriteableSpec.scala
118 lines (100 loc) · 4.38 KB
/
WriteableSpec.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
* Copyright (C) from 2022 The Play Framework Contributors <https://github.com/playframework>, 2011-2021 Lightbend Inc. <https://www.lightbend.com>
*/
package play.api.http
import java.io.File
import akka.util.ByteString
import org.specs2.mutable.Specification
import play.api.libs.Files.TemporaryFile
import play.api.mvc.Codec
import play.api.mvc.MultipartFormData
import play.api.mvc.MultipartFormData.FilePart
import play.api.libs.Files.SingletonTemporaryFileCreator._
class WriteableSpec extends Specification {
"Writeable" in {
"of multipart" should {
"work for temporary files" in {
val multipartFormData = createMultipartFormData[TemporaryFile](
create(new File("src/test/resources/multipart-form-data-file.txt").toPath)
)
val codec = Codec.utf_8
val writeable = Writeable.writeableOf_MultipartFormData[TemporaryFile](None)(codec)
val transformed: ByteString = writeable.transform(multipartFormData)
transformed.utf8String must contain("""Content-Disposition: form-data; name="name"""")
transformed.utf8String must contain(
"""Content-Disposition: form-data; name="thefile"; filename="something.text""""
)
transformed.utf8String must contain("Content-Type: text/plain")
transformed.utf8String must contain("multipart-form-data-file")
}
"work composing with another writeable" in {
val multipartFormData =
createMultipartFormData[String]("file part value", data => Some(ByteString.fromString(data)))
val codec = Codec.utf_8
val writeable = Writeable.writeableOf_MultipartFormData[String](None)(codec)
val transformed: ByteString = writeable.transform(multipartFormData)
transformed.utf8String must contain("""Content-Disposition: form-data; name="name"""")
transformed.utf8String must contain(
"""Content-Disposition: form-data; name="thefile"; filename="something.text""""
)
transformed.utf8String must contain("Content-Type: text/plain")
transformed.utf8String must contain("file part value")
}
"escape 'name' and 'filename' params" in {
val multipartFormData =
createMultipartFormData[String](
"file part value",
data => Some(ByteString.fromString(data)),
dataPartKey = "ab\"cd\nef\rgh\"ij\rk\nl",
filePartKey = "mn\"op\nqr\rst\"uv\rw\nx",
filePartFilename = "fo\"o\no\rb\"a\ra\nar.p\"df"
)
val codec = Codec.utf_8
val writeable = Writeable.writeableOf_MultipartFormData[String](None)(codec)
val transformed: ByteString = writeable.transform(multipartFormData)
transformed.utf8String must contain("""Content-Disposition: form-data; name="ab%22cd%0Aef%0Dgh%22ij%0Dk%0Al"""")
transformed.utf8String must contain(
"""Content-Disposition: form-data; name="mn%22op%0Aqr%0Dst%22uv%0Dw%0Ax"; filename="fo%22o%0Ao%0Db%22a%0Da%0Aar.p%22df""""
)
transformed.utf8String must contain("Content-Type: text/plain")
transformed.utf8String must contain("file part value")
}
"use multipart/form-data content-type" in {
val codec = Codec.utf_8
val writeable = Writeable.writeableOf_MultipartFormData(None)(codec)
writeable.contentType must beSome(startWith("multipart/form-data; boundary="))
}
}
"of urlEncodedForm" should {
"encode keys and values" in {
val codec = Codec.utf_8
val writeable = Writeable.writeableOf_urlEncodedForm(codec)
val transformed: ByteString = writeable.transform(Map("foo$bar" -> Seq("ba$z")))
transformed.utf8String must contain("foo%24bar=ba%24z")
}
}
}
def createMultipartFormData[A](
ref: A,
refToBytes: A => Option[ByteString] = (a: A) => None,
dataPartKey: String = "name",
filePartKey: String = "thefile",
filePartFilename: String = "something.text"
): MultipartFormData[A] = {
MultipartFormData[A](
dataParts = Map(
dataPartKey -> Seq("value")
),
files = Seq(
FilePart[A](
key = filePartKey,
filename = filePartFilename,
contentType = Some("text/plain"),
ref = ref,
refToBytes = refToBytes
)
),
badParts = Seq.empty
)
}
}