Working on MEDinar, we are doing unit test for test our app. One of the scenario is when users upload their slides. We need to check if everything works. But the problem is I could not find a working example in Java how to test file upload. So after digging and reading few examples how to do it in Scala
https://groups.google.com/forum/#!msg/play-framework/UVi2kFxNoiE/VzQz4o8Hao4J
http://stackoverflow.com/questions/15133794/writing-a-test-case-for-file-uploads-in-play-2-1-and-scala
I developed a working solution for Java. We have a controller action
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import play.mvc.Http; ... public Result importSlides(Long id) { Http.MultipartFormData body = request().body().asMultipartFormData(); Http.MultipartFormData.FilePart file = body.getFile("file"); // handle file if(file == null) { return badRequest("File is missing"); } return ok(); } |
and code to test it
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 |
import java.io.IOException; import java.io.InputStream; import java.net.URISyntaxException; import org.junit.*; import play.mvc.*; import play.test.*; import play.libs.F.*; import static org.fest.assertions.Assertions.*; import org.junit.runner.RunWith; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; import play.api.libs.Files.TemporaryFile; import play.api.mvc.AnyContentAsMultipartFormData; import play.api.mvc.MultipartFormData; import static play.test.Helpers.*; @RunWith(MockitoJUnitRunner.class) public class SlidesTest extends WithApplication { @Before public void setUp() { app = fakeApplication(); } @Test public void shouldSucceed_When_ImportSlidesInPPTXFormat() throws IOException, URISyntaxException { // valid_import.pptx is located in test/resources folder URL url = app.getWrappedApplication().resource("valid_import.pptx").get(); File file = new File(url.toURI()); TemporaryFile temporaryFile = new TemporaryFile(file); MultipartFormData.FilePart filePath = new MultipartFormData.FilePart("file", "valid_import.pptx", new scala.Some<>("application/vnd.openxmlformats-officedocument.presentationml.presentation"), temporaryFile); List fileParts = new ArrayList<>(); fileParts.add(filePath); scala.collection.immutable.Seq files = scala.collection.JavaConversions.asScalaBuffer(fileParts).toList(); MultipartFormData formData = new MultipartFormData(null, files, null, null); AnyContentAsMultipartFormData body = new AnyContentAsMultipartFormData(formData); // run FakeRequest fakeRequest = fakeRequest().withBody(body) Result result = callAction(controllers.Slides.routes.ref.Slides.importSlides(1L), fakeRequest); // results assertThat(status(result)).isEqualTo(OK); } } |