package com.baeldung.hoverfly; import static io.specto.hoverfly.junit.core.SimulationSource.dsl; import static io.specto.hoverfly.junit.dsl.HoverflyDsl.service; import static io.specto.hoverfly.junit.dsl.HttpBodyConverter.jsonWithSingleQuotes; import static io.specto.hoverfly.junit.dsl.ResponseCreators.success; import static io.specto.hoverfly.junit.dsl.matchers.HoverflyMatchers.any; import static io.specto.hoverfly.junit.dsl.matchers.HoverflyMatchers.equalsTo; import static io.specto.hoverfly.junit.dsl.matchers.HoverflyMatchers.equalsToJson; import static io.specto.hoverfly.junit.dsl.matchers.HoverflyMatchers.equalsToXml; import static io.specto.hoverfly.junit.dsl.matchers.HoverflyMatchers.matches; import static io.specto.hoverfly.junit.dsl.matchers.HoverflyMatchers.startsWith; import static io.specto.hoverfly.junit.dsl.matchers.HoverflyMatchers.matchesJsonPath; import static io.specto.hoverfly.junit.dsl.matchers.HoverflyMatchers.matchesXPath; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.net.URI; import java.net.URISyntaxException; import java.util.concurrent.TimeUnit; import org.apache.commons.lang3.time.StopWatch; import org.junit.ClassRule; import org.junit.Test; import org.springframework.http.HttpStatus; import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; import io.specto.hoverfly.junit.core.SimulationSource; import io.specto.hoverfly.junit.rule.HoverflyRule; public class HoverflyApiIntegrationTest { private static final SimulationSource source = dsl( service("http://www.baeldung.com") .get("/api/courses/1") .willReturn(success().body( jsonWithSingleQuotes("{'id':'1','name':'HCI'}"))) .post("/api/courses") .willReturn(success()) .andDelay(3, TimeUnit.SECONDS) .forMethod("POST"), service(matches("www.*dung.com")) .get(startsWith("/api/student")) .queryParam("page", any()) .willReturn(success()) .post(equalsTo("/api/student")) .body(equalsToJson(jsonWithSingleQuotes("{'id':'1','name':'Joe'}"))) .willReturn(success()) .put("/api/student/1") .body(matchesJsonPath("$.name")) .willReturn(success()) .post("/api/student") .body(equalsToXml("2John")) .willReturn(success()) .put("/api/student/2") .body(matchesXPath("/student/name")) .willReturn(success())); @ClassRule public static final HoverflyRule rule = HoverflyRule.inSimulationMode(source); private final RestTemplate restTemplate = new RestTemplate(); @Test public void givenGetCourseById_whenRequestSimulated_thenAPICalledSuccessfully() throws URISyntaxException { final ResponseEntity courseResponse = restTemplate.getForEntity( "http://www.baeldung.com/api/courses/1", String.class); assertEquals(HttpStatus.OK, courseResponse.getStatusCode()); assertEquals("{\"id\":\"1\",\"name\":\"HCI\"}", courseResponse.getBody()); } @Test public void givenPostCourse_whenDelayInRequest_thenResponseIsDelayed() throws URISyntaxException { StopWatch stopWatch = new StopWatch(); stopWatch.start(); final ResponseEntity postResponse = restTemplate.postForEntity( "http://www.baeldung.com/api/courses", null, Void.class); stopWatch.stop(); long postTime = stopWatch.getTime(); assertEquals(HttpStatus.OK, postResponse.getStatusCode()); assertTrue(3L <= TimeUnit.MILLISECONDS.toSeconds(postTime)); } @Test public void givenGetStudent_whenRequestMatcher_thenAPICalledSuccessfully() throws URISyntaxException { final ResponseEntity courseResponse = restTemplate.getForEntity( "http://www.baeldung.com/api/student?page=3", Void.class); assertEquals(HttpStatus.OK, courseResponse.getStatusCode()); } @Test public void givenPostStudent_whenBodyRequestMatcherJson_thenResponseContainsEqualJson() throws URISyntaxException { final ResponseEntity postResponse = restTemplate.postForEntity( "http://www.baeldung.com/api/student", "{\"id\":\"1\",\"name\":\"Joe\"}", Void.class); assertEquals(HttpStatus.OK, postResponse.getStatusCode()); } @Test public void givenPutStudent_whenJsonPathMatcher_thenRequestJsonContainsElementInPath() throws URISyntaxException { RequestEntity putRequest = RequestEntity .put(new URI("http://www.baeldung.com/api/student/1")) .body("{\"id\":\"1\",\"name\":\"Trevor\"}"); ResponseEntity putResponse = restTemplate.exchange(putRequest, String.class); assertEquals(HttpStatus.OK, putResponse.getStatusCode()); } @Test public void givenPostStudent_whenBodyRequestMatcherXml_thenResponseContainsEqualXml() throws URISyntaxException { final ResponseEntity postResponse = restTemplate.postForEntity( "http://www.baeldung.com/api/student", "2John", Void.class); assertEquals(HttpStatus.OK, postResponse.getStatusCode()); } @Test public void givenPutStudent_whenXPathMatcher_thenRequestXmlContainsElementInXPath() throws URISyntaxException { RequestEntity putRequest = RequestEntity .put(new URI("http://www.baeldung.com/api/student/2")) .body("" + "2Monica"); ResponseEntity putResponse = restTemplate.exchange(putRequest, String.class); assertEquals(HttpStatus.OK, putResponse.getStatusCode()); } }