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.Project; import models.WorkItem; import models.WorkItemStateType; import play.libs.Json; import play.mvc.Result; import play.mvc.Http.RequestBuilder; public class WorkItemsTest { int projectId = 10; int workItemId = 10; int stationId = 40; int station3Id = 10; int processedWorkItemId = 60; int userId = 10; int inProcessWorkItemId = 50; int station2Id = 20; 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/workItems")); assertEquals(play.mvc.Http.Status.OK, result.status()); JsonNode node = Json.parse(contentAsString(result)); List<WorkItem> workItems = Json.fromJson(node, List.class); assertTrue(workItems.size() == 9); result = route(new RequestBuilder().method(GET).uri("/api/workItems?projectId=" + projectId)); assertEquals(play.mvc.Http.Status.OK, result.status()); node = Json.parse(contentAsString(result)); workItems = Json.fromJson(node, List.class); assertTrue(workItems.size() == 2); result = route(new RequestBuilder().method(GET).uri("/api/workItems?assigneeId=" + userId)); assertEquals(play.mvc.Http.Status.OK, result.status()); node = Json.parse(contentAsString(result)); workItems = Json.fromJson(node, List.class); assertTrue(workItems.size() == 1); result = route(new RequestBuilder().method(GET).uri("/api/workItems?assigneeId=" + userId + "&stationId=" + station2Id)); assertEquals(play.mvc.Http.Status.OK, result.status()); node = Json.parse(contentAsString(result)); workItems = Json.fromJson(node, List.class); assertTrue(workItems.size() == 1); result = route(new RequestBuilder().method(GET).uri("/api/workItems?stationId=" + station2Id)); assertEquals(play.mvc.Http.Status.OK, result.status()); node = Json.parse(contentAsString(result)); workItems = Json.fromJson(node, List.class); assertTrue(workItems.size() == 3); result = route(new RequestBuilder().method(GET).uri("/api/workItems?state=COMPLETED")); assertEquals(play.mvc.Http.Status.OK, result.status()); node = Json.parse(contentAsString(result)); workItems = Json.fromJson(node, List.class); assertTrue(workItems.size() == 3); } }); } @Test public void testRead() { running(fakeApplication(), new Runnable() { public void run() { Result result = route(new RequestBuilder().method(GET).uri("/api/workItems/" + workItemId)); assertEquals(play.mvc.Http.Status.OK, result.status()); JsonNode node = Json.parse(contentAsString(result)); WorkItem workItem = Json.fromJson(node, WorkItem.class); assertEquals(workItemId, workItem.id.intValue()); // test bad read result = route(new RequestBuilder().method(GET).uri("/api/workItems/" + 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/workItems?projectId=" + projectId)); JsonNode node = Json.parse(contentAsString(result)); int size = Json.fromJson(node, List.class).size(); // add a new object WorkItem workItem = new WorkItem(); workItem.name = "new"; result = route(new RequestBuilder().method(GET).uri("/api/factories/" + projectId)); node = Json.parse(contentAsString(result)); Project project = Json.fromJson(node, Project.class); workItem.project = project; result = route(new RequestBuilder().method(POST).uri("/api/workItems").bodyJson(Json.toJson(workItem))); assertEquals(play.mvc.Http.Status.CREATED, result.status()); // should be one additional object result = route(new RequestBuilder().method(GET).uri("/api/workItems?projectId=" + projectId)); node = Json.parse(contentAsString(result)); List<WorkItem> workItems = Json.fromJson(node, List.class); assertEquals(size + 1, workItems.size()); } }); } @Test public void testUpdate() { running(fakeApplication(), new Runnable() { public void run() { // create initial object Result result = route(new RequestBuilder().method(GET).uri("/api/workItems/" + workItemId)); JsonNode node = Json.parse(contentAsString(result)); WorkItem workItem = Json.fromJson(node, WorkItem.class); workItem.name = "updated"; // now update object result = route(new RequestBuilder().method(PUT).uri("/api/workItems/" + workItemId) .bodyJson(Json.toJson(workItem))); assertEquals(play.mvc.Http.Status.OK, result.status()); // now read the updated object result = route(new RequestBuilder().method(GET).uri("/api/workItems/" + workItemId)); node = Json.parse(contentAsString(result)); workItem = Json.fromJson(node, WorkItem.class); assertEquals("updated", workItem.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/workItems")); JsonNode node = Json.parse(contentAsString(result)); int size = Json.fromJson(node, List.class).size(); // delete object result = route(new RequestBuilder().method(DELETE).uri("/api/workItems/" + workItemId)); assertEquals(play.mvc.Http.Status.OK, result.status()); // should now be one fewer object result = route(new RequestBuilder().method(GET).uri("/api/workItems")); node = Json.parse(contentAsString(result)); List<WorkItem> workItems = Json.fromJson(node, List.class); assertEquals(size - 1, workItems.size()); } }); } @Test public void testNext() { running(fakeApplication(), new Runnable() { @SuppressWarnings("unchecked") public void run() { // read workitems at station before workItem assigned Result result = route(new RequestBuilder().method(GET).uri("/api/workItems?stationId=" + stationId)); JsonNode node = Json.parse(contentAsString(result)); int size = Json.fromJson(node, List.class).size(); // move workItem to the next station result = route(new RequestBuilder().method(POST) .uri("/api/workItems/" + workItemId + "/next?nextStationId=" + stationId)); assertEquals(play.mvc.Http.Status.OK, result.status()); // read workitems at station after workItem assigned to it result = route(new RequestBuilder().method(GET).uri("/api/workItems?stationId=" + stationId)); node = Json.parse(contentAsString(result)); List<WorkItem> workItems = Json.fromJson(node, List.class); assertEquals(size + 1, workItems.size()); // move workItem out of any station result = route(new RequestBuilder().method(POST).uri("/api/workItems/" + workItemId + "/next")); assertEquals(play.mvc.Http.Status.OK, result.status()); // read workitems at station after workItem assigned to it result = route(new RequestBuilder().method(GET).uri("/api/workItems?stationId=" + stationId)); node = Json.parse(contentAsString(result)); workItems = Json.fromJson(node, List.class); assertEquals(size, workItems.size()); } }); } @Test public void testAssign() { running(fakeApplication(), new Runnable() { @SuppressWarnings("unchecked") public void run() { // read user's workItems before workItem assigned Result result = route(new RequestBuilder().method(GET).uri("/api/workItems?assigneeId=" + userId)); JsonNode node = Json.parse(contentAsString(result)); int size = Json.fromJson(node, List.class).size(); // assign workItem to the user result = route(new RequestBuilder().method(POST) .uri("/api/workItems/" + workItemId + "/assign?assigneeId=" + userId)); assertEquals(play.mvc.Http.Status.OK, result.status()); // read user's workitems after workItem assigned to user result = route(new RequestBuilder().method(GET).uri("/api/workItems?assigneeId=" + userId)); node = Json.parse(contentAsString(result)); List<WorkItem> workItems = Json.fromJson(node, List.class); assertEquals(size + 1, workItems.size()); // unassign the work item just assigned result = route(new RequestBuilder().method(POST).uri("/api/workItems/" + workItemId + "/assign")); assertEquals(play.mvc.Http.Status.OK, result.status()); // read user's workitems after workItem unassigned result = route(new RequestBuilder().method(GET).uri("/api/workItems?assigneeId=" + userId)); node = Json.parse(contentAsString(result)); workItems = Json.fromJson(node, List.class); assertEquals(size, workItems.size()); } }); } @Test public void testProcess() { running(fakeApplication(), new Runnable() { @SuppressWarnings("unchecked") public void run() { // read user's workItems before workItem assigned Result result = route( new RequestBuilder().method(GET).uri("/api/workItems?state=" + WorkItemStateType.PROCESSED)); JsonNode node = Json.parse(contentAsString(result)); int size = Json.fromJson(node, List.class).size(); // unassign one of the user's work items result = route( new RequestBuilder().method(POST).uri("/api/workItems/" + inProcessWorkItemId + "/process")); assertEquals(play.mvc.Http.Status.OK, result.status()); // read user's workitems after workItem assigned to user result = route( new RequestBuilder().method(GET).uri("/api/workItems?state=" + WorkItemStateType.PROCESSED)); node = Json.parse(contentAsString(result)); List<WorkItem> workItems = Json.fromJson(node, List.class); assertEquals(size + 1, workItems.size()); } }); } }