Skip to content
This repository was archived by the owner on Oct 25, 2021. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
multipart request test
  • Loading branch information
jakubbrodzinski committed May 29, 2019
commit 8b089ce64c59697a893e6485e1ca2add80c2aded
2 changes: 2 additions & 0 deletions graphql-java-spring-webmvc/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ dependencies {
compile "com.fasterxml.jackson.core:jackson-databind:$jacksonVersion"
compile "com.graphql-java:graphql-java:$graphqlJavaVersion"
compile "javax.servlet:javax.servlet-api:4.0.1"
compile "commons-fileupload:commons-fileupload:1.4"



testCompile("org.assertj:assertj-core:$assertJVersion")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.springframework.web.context.request.ServletWebRequest;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;
import org.springframework.web.server.ResponseStatusException;

Expand Down Expand Up @@ -93,7 +94,7 @@ public Object graphqlPOST(
if(request.getQuery() != null) {
LinkedHashMap<String, ArrayList<String>> multipartFileKeyVariablePathMap = this.jsonSerializer.deserialize(webRequest.getParameter("map"), LinkedHashMap.class);

StandardMultipartHttpServletRequest multiPartRequest = (StandardMultipartHttpServletRequest) ((ServletWebRequest) webRequest).getNativeRequest();
MultipartHttpServletRequest multiPartRequest = (MultipartHttpServletRequest) ((ServletWebRequest) webRequest).getNativeRequest();
Map<String, MultipartFile> multipartFileMap = multiPartRequest.getFileMap();

for(Map.Entry<String,MultipartFile> e: multipartFileMap.entrySet()){
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,29 @@
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.multipart.MultipartFile;
import testconfig.TestAppConfig;

import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;

import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.asyncDispatch;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
Expand All @@ -41,6 +49,8 @@
@WebAppConfiguration
public class GraphQLControllerTest {



private MockMvc mockMvc;

@Autowired
Expand Down Expand Up @@ -307,4 +317,57 @@ public void testSimpleGetRequest() throws Exception {

}

@Test
public void testMultiPartRequest() throws Exception{
final String query ="mutation($fooInput : FooInput!, $file: Upload!, $files: [Upload]!){ doSomething(fooInput: $fooInput, f: $file, fList: $files) }";
final String variables="{ \"fooInput\":{ \"x\":\"foo\",\"y\":\"bar\"}, \"file\":null, \"files\":[null,null,null]}";
final String operationName = "null";

final String operationsParam = String.format("{\"query\":\"%s\", \"variables\":%s, \"operationName\":%s }",query,variables,operationName);
final String mapParam = "{\"0\":[\"variables.file\"],\"1\":[\"variables.files.0\"],\"2\":[\"variables.files.1\"],\"3\":[\"variables.files.2\"]}";

MockMultipartFile firstFile = new MockMultipartFile("0","f0.txt","text/plain","file 0 test test".getBytes());
MockMultipartFile secondFile = new MockMultipartFile("1","f1.txt","text/plain", "file 1 test".getBytes());
MockMultipartFile thirdFile = new MockMultipartFile("2","f2.txt","text/plain", "file 2 text".getBytes());
MockMultipartFile fourthFile = new MockMultipartFile("3","f3.txt","text/plain","file 3 test".getBytes());

ExecutionResultImpl executionResult = ExecutionResultImpl.newExecutionResult()
.data("bar")
.build();
CompletableFuture cf = CompletableFuture.completedFuture(executionResult);
ArgumentCaptor<ExecutionInput> captor = ArgumentCaptor.forClass(ExecutionInput.class);
Mockito.when(graphql.executeAsync(captor.capture())).thenReturn(cf);


MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.multipart("/graphql")
.file(firstFile)
.file(secondFile)
.file(thirdFile)
.file(fourthFile)
.param("operations",operationsParam)
.param("map",mapParam);

MvcResult mvcResult = this.mockMvc.perform(requestBuilder)
.andExpect(status().isOk())
.andExpect(request().asyncStarted())
.andReturn();

this.mockMvc.perform(asyncDispatch(mvcResult))
.andDo(print()).andExpect(status().isOk())
.andExpect(jsonPath("data", is("bar")))
.andReturn();

assertThat(captor.getAllValues().size(), is(1));

assertThat(captor.getValue().getQuery(), is(query));
assertTrue(captor.getValue().getVariables().containsKey("fooInput"));

assertTrue(captor.getValue().getVariables().containsKey("file"));
assertThat(captor.getValue().getVariables().get("file"),instanceOf(MultipartFile.class));
assertThat(((MultipartFile) captor.getValue().getVariables().get("file")).getOriginalFilename(),is("f0.txt"));

assertTrue(captor.getValue().getVariables().containsKey("files"));
assertThat(((Collection)captor.getValue().getVariables().get("files")).size(),is(3));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
Expand All @@ -26,4 +28,10 @@ public ObjectMapper objectMapper() {
return new ObjectMapper();
}

@Bean
public MultipartResolver multiPartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
return multipartResolver;
}

}