package com.ewolff.microservice.catalog;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.util.Arrays;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.web.client.RestTemplate;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = CatalogApp.class, webEnvironment = WebEnvironment.RANDOM_PORT)
@ActiveProfiles("test")
public class CatalogWebIntegrationTest {
@Autowired
private ItemRepository itemRepository;
@Value("${local.server.port}")
private int serverPort;
private Item iPodNano;
private RestTemplate restTemplate;
@Before
public void setup() {
iPodNano = itemRepository.findByName("iPod nano").get(0);
restTemplate = new RestTemplate();
}
@Test
public void IsItemReturnedAsHTML() {
String url = catalogURL() + "/" + iPodNano.getId() + ".html";
String body = getForMediaType(String.class, MediaType.TEXT_HTML, url);
assertThat(body, containsString("iPod nano"));
assertThat(body, containsString("<div"));
}
private String catalogURL() {
return "http://localhost:" + serverPort;
}
@Test
public void IsItemReturnedAsJON() {
String url = catalogURL() + "/catalog/" + iPodNano.getId();
Item body = getForMediaType(Item.class, MediaType.APPLICATION_JSON, url);
assertThat(body, equalTo(iPodNano));
}
@Test
public void FormReturned() {
String url = catalogURL() + "/searchForm.html";
String body = getForMediaType(String.class, MediaType.TEXT_HTML, url);
assertThat(body, containsString("<form"));
assertThat(body, containsString("<div>"));
}
@Test
public void SearchWorks() {
String url = catalogURL() + "/searchByName.html?query=iPod";
String body = restTemplate.getForObject(url, String.class);
assertThat(body, containsString("iPod nano"));
assertThat(body, containsString("<div"));
}
private <T> T getForMediaType(Class<T> value, MediaType mediaType, String url) {
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(mediaType));
HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);
ResponseEntity<T> resultEntity = restTemplate.exchange(url, HttpMethod.GET, entity, value);
return resultEntity.getBody();
}
}