Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to test actions that expect an uploaded file in Play Framework (version 2.0, using Scala)?

The Writing functional tests portion of the documentation is pretty skimpy and lacks details on submitting mock form values completely. I somehow (can't remember how/where) determined you can submit basic form values (mocking a POST request) by passing a Map to FakeRequest like so:

val Some(result) = routeAndCall(FakeRequest(POST, "/path/to/test", FakeHeaders(),
                                Map("postedVariable" -> Seq("and a value"))))

However, that doesn't seem to allow for the case of an "uploaded" file.

like image 955
Chris W. Avatar asked Nov 12 '12 22:11

Chris W.


1 Answers

Our file upload tests look something like this:

val tempFile = TemporaryFile(new java.io.File("/tmp/the.file"))
val part = FilePart[TemporaryFile](key = "image", filename = "the.file", contentType = Some("image/jpeg"), ref = tempFile)
val formData = MultipartFormData(dataParts = Map(), files = Seq(part), badParts = Seq(), missingFileParts = Seq())
val result = routeAndCall(FakeRequest(POST, "/path/to/test", FakeHeaders(), formData))

where "image" is the name of the HTML form element you expect to find the file contents in.

If you are using BodyParsers.maxLength to limit the size of uploads, you can replace formData with Right(formData)

like image 51
Alex Varju Avatar answered Nov 19 '22 00:11

Alex Varju