package controllers;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static play.test.Helpers.DELETE;
import static play.test.Helpers.GET;
import static play.test.Helpers.POST;
import static play.test.Helpers.PUT;
import static play.test.Helpers.contentAsString;
import static play.test.Helpers.fakeApplication;
import static play.test.Helpers.route;
import static play.test.Helpers.running;
import java.util.List;
import org.junit.Test;
import com.fasterxml.jackson.databind.JsonNode;
import models.Factory;
import play.libs.Json;
import play.mvc.Http.RequestBuilder;
import play.mvc.Result;
public class FactoriesTest {
int factoryId = 10;
int nonExistantId = 44444;
@Test
public void testList() {
running(fakeApplication(), new Runnable() {
@SuppressWarnings("unchecked")
public void run() {
Result result = route(new RequestBuilder().method(GET).uri("/api/factories"));
assertEquals(play.mvc.Http.Status.OK, result.status());
JsonNode node = Json.parse(contentAsString(result));
List<Factory> factories = Json.fromJson(node, List.class);
assertTrue(factories.size() == 2);
}
});
}
@Test
public void testRead() {
running(fakeApplication(), new Runnable() {
public void run() {
Result result = route(new RequestBuilder().method(GET).uri("/api/factories/" + factoryId));
assertEquals(play.mvc.Http.Status.OK, result.status());
JsonNode node = Json.parse(contentAsString(result));
Factory factory = Json.fromJson(node, Factory.class);
assertEquals(factoryId, factory.id.intValue());
// test bad read
result = route(new RequestBuilder().method(GET).uri("/api/factories/" + nonExistantId));
assertEquals(play.mvc.Http.Status.NOT_FOUND, result.status());
}
});
}
@Test
public void testCreate() {
running(fakeApplication(), new Runnable() {
@SuppressWarnings("unchecked")
public void run() {
// read initial number of objects
Result result = route(new RequestBuilder().method(GET).uri("/api/factories"));
JsonNode node = Json.parse(contentAsString(result));
int size = Json.fromJson(node, List.class).size();
// add a new object
Factory factory = new Factory();
factory.name = "new";
result = route(new RequestBuilder().method(POST).uri("/api/factories").bodyJson(Json.toJson(factory)));
assertEquals(play.mvc.Http.Status.CREATED, result.status());
// should be one additional object
result = route(new RequestBuilder().method(GET).uri("/api/factories"));
node = Json.parse(contentAsString(result));
List<Factory> factories = Json.fromJson(node, List.class);
assertEquals(size + 1, factories.size());
}
});
}
@Test
public void testUpdate() {
running(fakeApplication(), new Runnable() {
public void run() {
// create initial object
Result result = route(new RequestBuilder().method(GET).uri("/api/factories/" + factoryId));
JsonNode node = Json.parse(contentAsString(result));
Factory factory = Json.fromJson(node, Factory.class);
factory.name = "updated";
// now update object
result = route(new RequestBuilder().method(PUT).uri("/api/factories/" + factoryId)
.bodyJson(Json.toJson(factory)));
assertEquals(play.mvc.Http.Status.OK, result.status());
// now read the updated object
result = route(new RequestBuilder().method(GET).uri("/api/factories/" + factoryId));
node = Json.parse(contentAsString(result));
factory = Json.fromJson(node, Factory.class);
assertEquals("updated", factory.name);
}
});
}
@Test
public void testDelete() {
running(fakeApplication(), new Runnable() {
@SuppressWarnings("unchecked")
public void run() {
// read initial object
Result result = route(new RequestBuilder().method(GET).uri("/api/factories"));
JsonNode node = Json.parse(contentAsString(result));
int size = Json.fromJson(node, List.class).size();
// delete object
result = route(new RequestBuilder().method(DELETE).uri("/api/factories/" + factoryId));
assertEquals(play.mvc.Http.Status.OK, result.status());
// should now be one fewer object
result = route(new RequestBuilder().method(GET).uri("/api/factories"));
node = Json.parse(contentAsString(result));
List<Factory> factories = Json.fromJson(node, List.class);
assertEquals(size - 1, factories.size());
}
});
}
}