package org.mockserver.examples.web.controller; import io.netty.handler.codec.http.HttpHeaders; import org.junit.*; import org.mockserver.integration.ClientAndProxy; import org.mockserver.integration.ClientAndServer; import org.mockserver.examples.model.Book; import org.mockserver.model.Header; import org.mockserver.model.Parameter; import org.mockserver.socket.PortFactory; import org.mockserver.examples.web.controller.pageobjects.BookPage; import org.mockserver.examples.web.controller.pageobjects.BooksPage; import org.springframework.core.env.Environment; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.web.context.WebApplicationContext; import javax.annotation.Resource; import java.util.Arrays; import static io.netty.handler.codec.http.HttpHeaderNames.CONTENT_TYPE; import static org.mockserver.integration.ClientAndProxy.startClientAndProxy; import static org.mockserver.integration.ClientAndServer.startClientAndServer; import static org.mockserver.model.HttpRequest.request; import static org.mockserver.model.HttpResponse.response; import static org.mockserver.verify.VerificationTimes.exactly; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup; /** * @author jamesdbloom */ public abstract class BooksPageIntegrationTest { private static ClientAndProxy proxy; private ClientAndServer mockServer; @Resource private Environment environment; @Resource private WebApplicationContext webApplicationContext; private MockMvc mockMvc; @BeforeClass public static void startProxy() { proxy = startClientAndProxy(PortFactory.findFreePort()); } @AfterClass public static void stopProxy() { proxy.stop(); } @Before public void setupFixture() { mockMvc = webAppContextSetup(webApplicationContext).build(); } @Before public void startMockServer() { mockServer = startClientAndServer(environment.getProperty("bookService.port", Integer.class)); proxy.reset(); } @After public void stopMockServer() { mockServer.stop(); } @Test public void shouldLoadListOfBooks() throws Exception { // given mockServer .when( request() .withPath("/get_books") ) .respond( response() .withHeaders( new Header(CONTENT_TYPE.toString(), MediaType.APPLICATION_JSON_VALUE) ) .withBody("" + "[" + System.getProperty("line.separator") + " {" + System.getProperty("line.separator") + " \"id\": \"1\"," + System.getProperty("line.separator") + " \"title\": \"Xenophon's imperial fiction : on the education of Cyrus\"," + System.getProperty("line.separator") + " \"author\": \"James Tatum\"," + System.getProperty("line.separator") + " \"isbn\": \"0691067570\"," + System.getProperty("line.separator") + " \"publicationDate\": \"1989\"" + System.getProperty("line.separator") + " }," + System.getProperty("line.separator") + " {" + System.getProperty("line.separator") + " \"id\": \"2\"," + System.getProperty("line.separator") + " \"title\": \"You are here : personal geographies and other maps of the imagination\"," + System.getProperty("line.separator") + " \"author\": \"Katharine A. Harmon\"," + System.getProperty("line.separator") + " \"isbn\": \"1568984308\"," + System.getProperty("line.separator") + " \"publicationDate\": \"2004\"" + System.getProperty("line.separator") + " }," + System.getProperty("line.separator") + " {" + System.getProperty("line.separator") + " \"id\": \"3\"," + System.getProperty("line.separator") + " \"title\": \"You just don't understand : women and men in conversation\"," + System.getProperty("line.separator") + " \"author\": \"Deborah Tannen\"," + System.getProperty("line.separator") + " \"isbn\": \"0345372050\"," + System.getProperty("line.separator") + " \"publicationDate\": \"1990\"" + System.getProperty("line.separator") + " }" + "]") ); // when MvcResult response = mockMvc.perform(get("/books").accept(MediaType.TEXT_HTML)) .andExpect(status().isOk()) .andExpect(content().contentType("text/html; charset=utf-8")) .andReturn(); // then new BooksPage(response).containsListOfBooks(Arrays.asList( new Book(1, "Xenophon's imperial fiction : on the education of Cyrus", "James Tatum", "0691067570", "1989"), new Book(2, "You are here : personal geographies and other maps of the imagination", "Katharine A. Harmon", "1568984308", "2004"), new Book(3, "You just don't understand : women and men in conversation", "Deborah Tannen", "0345372050", "1990") )); proxy.verify( request() .withPath("/get_books"), exactly(1) ); } @Test public void shouldLoadSingleBook() throws Exception { // given mockServer .when( request() .withPath("/get_book") .withQueryStringParameter( new Parameter("id", "1") ) ) .respond( response() .withHeaders( new Header(CONTENT_TYPE.toString(), "application/json") ) .withBody("" + "{" + System.getProperty("line.separator") + " \"id\": \"1\"," + System.getProperty("line.separator") + " \"title\": \"Xenophon's imperial fiction : on the education of Cyrus\"," + System.getProperty("line.separator") + " \"author\": \"James Tatum\"," + System.getProperty("line.separator") + " \"isbn\": \"0691067570\"," + System.getProperty("line.separator") + " \"publicationDate\": \"1989\"" + System.getProperty("line.separator") + "}") ); // when MvcResult response = mockMvc.perform(get("/book/1").accept(MediaType.TEXT_HTML)) .andExpect(status().isOk()) .andExpect(content().contentType("text/html; charset=utf-8")) .andReturn(); // then new BookPage(response).containsBook(new Book(1, "Xenophon's imperial fiction : on the education of Cyrus", "James Tatum", "0691067570", "1989")); proxy.verify( request() .withPath("/get_book") .withQueryStringParameter( new Parameter("id", "1") ), exactly(1) ); } }