package com.example.helloworld.resources;
import com.example.helloworld.core.Person;
import com.example.helloworld.db.PersonDAO;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.google.common.collect.ImmutableList;
import io.dropwizard.testing.junit.ResourceTestRule;
import org.junit.After;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.junit.MockitoJUnitRunner;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Unit tests for {@link PeopleResource}.
*/
@RunWith(MockitoJUnitRunner.class)
public class PeopleResourceTest {
private static final PersonDAO PERSON_DAO = mock(PersonDAO.class);
@ClassRule
public static final ResourceTestRule RESOURCES = ResourceTestRule.builder()
.addResource(new PeopleResource(PERSON_DAO))
.build();
@Captor
private ArgumentCaptor<Person> personCaptor;
private Person person;
@Before
public void setUp() {
person = new Person();
person.setFullName("Full Name");
person.setJobTitle("Job Title");
}
@After
public void tearDown() {
reset(PERSON_DAO);
}
@Test
public void createPerson() throws JsonProcessingException {
when(PERSON_DAO.create(any(Person.class))).thenReturn(person);
final Response response = RESOURCES.target("/people")
.request(MediaType.APPLICATION_JSON_TYPE)
.post(Entity.entity(person, MediaType.APPLICATION_JSON_TYPE));
assertThat(response.getStatusInfo()).isEqualTo(Response.Status.OK);
verify(PERSON_DAO).create(personCaptor.capture());
assertThat(personCaptor.getValue()).isEqualTo(person);
}
@Test
public void listPeople() throws Exception {
final ImmutableList<Person> people = ImmutableList.of(person);
when(PERSON_DAO.findAll()).thenReturn(people);
final List<Person> response = RESOURCES.target("/people")
.request().get(new GenericType<List<Person>>() {
});
verify(PERSON_DAO).findAll();
assertThat(response).containsAll(people);
}
}