package bo.gotthardt.todo;
import bo.gotthardt.jersey.parameters.ListFilteringFactory;
import bo.gotthardt.model.Widget;
import bo.gotthardt.rest.CrudService;
import bo.gotthardt.test.ApiIntegrationTest;
import bo.gotthardt.todolist.rest.WidgetResource;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.datatype.jsr310.JSR310Module;
import com.google.common.collect.ImmutableList;
import io.dropwizard.jackson.Jackson;
import io.dropwizard.testing.junit.ResourceTestRule;
import org.junit.ClassRule;
import org.junit.Test;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.List;
import java.util.UUID;
import static bo.gotthardt.test.assertj.DropwizardAssertions.assertThat;
/**
* Tests for {@link bo.gotthardt.todolist.rest.WidgetResource}.
*
* @author Bo Gotthardt
*/
public class WidgetResourceTest extends ApiIntegrationTest {
private static final CrudService<Widget> service = new CrudService<>(Widget.class, db);
@ClassRule
public static final ResourceTestRule resources = ResourceTestRule.builder()
.addResource(new WidgetResource(service))
.addResource(ListFilteringFactory.getBinder())
.setMapper(Jackson.newObjectMapper().registerModule(new JSR310Module()))
.build();
@Test
public void shouldGetOneItem() {
Widget p = new Widget("Test");
db.save(p);
assertThat(GET("/widgets/" + p.getId()))
.hasStatus(Response.Status.OK)
.hasJsonContent(p);
}
@Test
public void should404WhenOneItemNotFound() {
assertThat(GET("/widgets/" + UUID.randomUUID()))
.hasStatus(Response.Status.NOT_FOUND)
.hasContentType(MediaType.APPLICATION_JSON_TYPE);
}
@Test
public void shouldGetAllItems() {
Widget p1 = new Widget("Test1");
p1.setId(new UUID(0, 0));
db.save(p1);
Widget p2 = new Widget("Test2");
p2.setId(new UUID(0, 1));
db.save(p2);
assertThat(GET("/widgets"))
.hasStatus(Response.Status.OK)
.hasJsonContent(ImmutableList.of(p1, p2));
}
@Test
public void shouldGetItemsMatchingQuery() {
Widget p1 = new Widget("Test1");
db.save(p1);
Widget p2 = new Widget("Test2");
db.save(p2);
assertThat(GET("/widgets?q=2"))
.hasStatus(Response.Status.OK)
.hasJsonContent(ImmutableList.of(p2));
}
@Test
public void shouldGetItemsAccordingToLimitAndOffset() {
Widget p1 = new Widget("Test1");
p1.setId(new UUID(0, 0));
db.save(p1);
Widget p2 = new Widget("Test2");
p2.setId(new UUID(0, 1));
db.save(p2);
Widget p3 = new Widget("Test3");
p3.setId(new UUID(0, 2));
db.save(p3);
assertThat(GET("/widgets?limit=1&offset=1"))
.hasStatus(Response.Status.OK)
.hasJsonContent(ImmutableList.of(p2));
}
@Test
public void shouldGetAllItemsWhenLimitIs0() {
Widget p1 = new Widget("Test1");
p1.setId(new UUID(0, 0));
db.save(p1);
Widget p2 = new Widget("Test2");
p2.setId(new UUID(0, 1));
db.save(p2);
Widget p3 = new Widget("Test3");
p3.setId(new UUID(0, 2));
db.save(p3);
assertThat(GET("/widgets?limit=0&offset=1"))
.hasStatus(Response.Status.OK)
.hasJsonContent(ImmutableList.of(p1, p2, p3));
}
@Test
public void shouldPersistPostedItem() {
ObjectNode input = resources.getObjectMapper().createObjectNode();
input.put("name", "Test1");
assertThat(POST("/widgets", input))
.hasStatus(Response.Status.OK);
List<Widget> savedItems = db.find(Widget.class).findList();
assertThat(savedItems).hasSize(1);
assertThat(savedItems.get(0).getName()).isEqualTo("Test1");
}
@Test
public void shouldUpdatePuttedItem() {
Widget p = new Widget("Test1");
db.save(p);
ObjectNode input = resources.getObjectMapper().createObjectNode();
input.put("name", "Test2");
Response response = PUT("/widgets/" + p.getId(), input);
db.refresh(p);
assertThat(response)
.hasStatus(Response.Status.OK)
.hasJsonContent(p);
assertThat(p.getName()).isEqualTo("Test2");
}
@Test
public void shouldNotOverwriteIdFromPuttedItem() {
Widget p = new Widget("Test1");
db.save(p);
UUID oldId = p.getId();
ObjectNode input = resources.getObjectMapper().createObjectNode();
input.put("name", "Test2");
input.put("id", UUID.randomUUID().toString());
Response response = PUT("/widgets/" + oldId, input);
db.refresh(p);
assertThat(response)
.hasStatus(Response.Status.OK)
.hasJsonContent(p);
assertThat(p.getId()).isEqualTo(oldId);
}
@Override
public ResourceTestRule getResources() {
return resources;
}
}