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

functional-testing, playframework, playframework-2.0, scala

Solution

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)`

Problem

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.

Original source

Related problems