/******************************************************************************* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2013,2014 by Peter Pilgrim, Addiscombe, Surrey, XeNoNiQUe UK * * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU GPL v3.0 * which accompanies this distribution, and is available at: * http://www.gnu.org/licenses/gpl-3.0.txt * * Developers: * Peter Pilgrim -- design, development and implementation * -- Blog: http://www.xenonique.co.uk/blog/ * -- Twitter: @peter_pilgrim * * Contributors: * *******************************************************************************/ package je7hb.intro.xentracker.control; import je7hb.intro.xentracker.StringHelper; import je7hb.intro.xentracker.boundary.ProjectTaskService; import je7hb.intro.xentracker.entity.Project; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.ArchivePaths; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.EmptyAsset; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Test; import org.junit.runner.RunWith; import javax.ejb.EJB; import javax.json.Json; import javax.json.JsonBuilderFactory; import javax.json.JsonObject; import javax.json.JsonValue; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Response; import java.io.File; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import static je7hb.intro.xentracker.FixtureUtils.createProjectAndTasks; import static javax.ws.rs.core.MediaType.*; import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.*; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; /** * A unit test ProjectRESTServerEndpointTest to verify the operation of ProjectRESTServerEndpointTest * * @author Peter Pilgrim */ @RunWith(Arquillian.class) public class ProjectRESTServerEndpointTest { @Deployment(testable = true) public static WebArchive createDeployment() { WebArchive war = ShrinkWrap.create(WebArchive.class, "xentracker.war") .addPackage(Project.class.getPackage()) .addPackage(ProjectWebSocketRetrieveEndpointTest.class.getPackage()) .addPackage(ProjectTaskService.class.getPackage()) .addClasses(StringHelper.class) .addAsWebInfResource( "test-persistence.xml", "classes/META-INF/persistence.xml") .setWebXML(new File("src/main/webapp/WEB-INF/web.xml")) .addAsWebInfResource( EmptyAsset.INSTANCE, ArchivePaths.create("classes/beans.xml")); System.out.println(war.toString(true)); return war; } @EJB ProjectTaskService service; private static final JsonBuilderFactory bf = Json.createBuilderFactory(null); @Test public void shouldInvokePOSTcreateProjectWithTasks() throws Exception { JsonObject input = bf.createObjectBuilder() .add("name", "Java Performance Tuning") .add("headline", "Goldenrule") .add("description", "Measure before, measure after") .add("tasks", bf.createArrayBuilder() .add( bf.createObjectBuilder() .add("name", "Find the Common Denominator") .add("targetDate", "23-July-2018") .add("completed", JsonValue.FALSE) .build()) .add( bf.createObjectBuilder() .add("name", "Decide on the Metrics") .add("targetDate", "24-July-2018") .add("completed", JsonValue.FALSE) .build()) .build() ) .build(); WebTarget target = ClientBuilder.newClient() .target("http://localhost:8181/xentracker/rest/projects/item"); Response response = target.request().post( Entity.entity( input, APPLICATION_JSON_TYPE) ); assertThat(response.getStatus(), is(200)); String text = response.readEntity( String.class ); System.out.printf(">>------ text = %s\n", text); assertNotNull(text); } @Test public void shouldInvokeGETretrieveProjectWithProjectId() throws Exception { Project proj1 = createProjectAndTasks(3); service.saveProject(proj1); // Force a flush to the database?! List<Project> projects = service.findAllProjects(); Thread.sleep(1000); WebTarget target = ClientBuilder.newClient() .target("http://localhost:8181/xentracker/rest/projects/item/" + proj1.getId()); Response response = target.request().get(); assertThat(response.getStatus(), is(200)); String text = response.readEntity( String.class ); System.out.printf(">>====== text = %s\n", text); assertNotNull(text); } @Test public void shouldInvokeAsynchronousServerGET() throws Exception { Project proj1 = createProjectAndTasks(3); Project proj2 = createProjectAndTasks(2); Project proj3 = createProjectAndTasks(1); service.saveProject(proj1); service.saveProject(proj2); service.saveProject(proj3); // Force a flush to the database?! List<Project> projects = service.findAllProjects(); Thread.sleep(1000); WebTarget target = ClientBuilder.newClient() .target("http://localhost:8181/xentracker/rest/projects/list"); Future<Response> future = target.request().async().get(); assertNotNull(future); Response response = future.get(3, TimeUnit.SECONDS ); assertThat(response.getStatus(), is(200)); String text = response.readEntity( String.class ); System.out.printf(">>====== text = %s\n", text); assertNotNull(text); } @Test public void shouldInvokePOSTWithAddNewTaskToProject() throws Exception { Project proj1 = createProjectAndTasks(1); service.saveProject(proj1); // Force a flush to the database?! List<Project> projects = service.findAllProjects(); Thread.sleep(1000); JsonObject input = bf.createObjectBuilder() .add("name", "Digital Holographic-SLR Camera") .add("targetDate", "16-January-2018") .add("completed", JsonValue.FALSE) .build(); WebTarget target = ClientBuilder.newClient() .target("http://localhost:8181/xentracker/rest/projects/item/" + proj1.getId() + "/task"); Response response = target.request().post( Entity.entity( input, APPLICATION_JSON_TYPE) ); assertThat(response.getStatus(), is(200)); String text = response.readEntity( String.class ); System.out.printf(">>====== text = %s\n", text); assertNotNull(text); } @Test public void shouldInvokePUTWithAddUpdateTaskToProject() throws Exception { Project proj1 = createProjectAndTasks(0); service.saveProject(proj1); // Force a flush to the database?! List<Project> projects = service.findAllProjects(); Thread.sleep(1000); final Calendar cal = Calendar.getInstance(); cal.setTime( new Date() ); cal.add(Calendar.MONTH, 1); final Date date1 = cal.getTime(); cal.add(Calendar.MONTH, 2); final Date date2 = cal.getTime(); final SimpleDateFormat outgoingDateFormatter = new SimpleDateFormat("dd-MMM-yyyy"); final SimpleDateFormat incomingDateFormatter = new SimpleDateFormat("yyyy-MM-dd"); final JsonObject input1 = bf.createObjectBuilder() .add("name", "Fireside Chat") .add("targetDate", outgoingDateFormatter.format(date1)) .add("completed", JsonValue.FALSE) .build(); WebTarget target = ClientBuilder.newClient() .target("http://localhost:8181/xentracker/rest/projects/item/"+proj1.getId()+"/task"); Response response = target.request().post( Entity.entity( input1, APPLICATION_JSON_TYPE)); assertThat(response.getStatus(), is(200)); final JsonObject output1 = response.readEntity(JsonObject.class); System.out.printf(">>====== output1 = %s\n", output1); assertNotNull(output1); assertThat(output1.getJsonArray("tasks").size(), is(1)); final JsonObject json1 = output1.getJsonArray("tasks").getJsonObject(0); final int taskId1 = json1.getInt("id"); assertTrue(taskId1 > 0); assertThat("Fireside Chat", is(json1.getString("name"))); assertThat(incomingDateFormatter.format(date1), is(json1.getString("targetDate"))); assertFalse( json1.getBoolean("completed")) ; final JsonObject input2 = bf.createObjectBuilder() .add("id", taskId1 ) .add("name", "JavaOne USA") .add("targetDate", outgoingDateFormatter.format(date2)) .add("completed", JsonValue.TRUE) .build(); target = ClientBuilder.newClient() .target("http://localhost:8181/xentracker/rest/projects/item/" + proj1.getId() + "/task/" + taskId1); response = target.request().put( Entity.entity( input2, APPLICATION_JSON_TYPE)); assertThat(response.getStatus(), is(200)); JsonObject output2 = response.readEntity( JsonObject.class ); System.out.printf(">>====== output2 = %s\n", output2); assertNotNull(output2); assertThat(output2.getJsonArray("tasks").size(), is(1)); final JsonObject json2 = output2.getJsonArray("tasks").getJsonObject(0); final int taskId2 = json2.getInt("id"); assertTrue(taskId2 > 0); assertThat( "JavaOne USA", is(json2.getString("name"))); assertThat( incomingDateFormatter.format(date2), is(json2.getString("targetDate"))); assertTrue( json2.getBoolean("completed")); } @Test public void shouldInvokeDELETEWithAddRemoveTaskFromProject() throws Exception { final Project proj1 = createProjectAndTasks(0); service.saveProject(proj1); // Force a flush to the database?! final List<Project> projects = service.findAllProjects(); Thread.sleep(1000); final LocalDate futureDate = LocalDate.now().plusDays( (long)(Math.random()*64) + 3L ); final DateTimeFormatter outDTF = DateTimeFormatter.ofPattern("dd-MMM-yyyy"); final JsonObject input1 = bf.createObjectBuilder() .add("name", "Make money now") .add("targetDate", futureDate.format(outDTF)) .add("completed", JsonValue.FALSE) .build(); WebTarget target = ClientBuilder.newClient() .target("http://localhost:8181/xentracker/rest/projects/item/"+proj1.getId()+"/task"); Response response = target.request().post( Entity.entity( input1, APPLICATION_JSON_TYPE)); assertNotNull(response); JsonObject output1 = response.readEntity( JsonObject.class ); System.out.printf(">>====== output1 = %s\n", output1); assertNotNull(output1); JsonObject json = output1.getJsonArray("tasks").getJsonObject(0); int taskId = json.getInt("id"); assertTrue( taskId > 0 ); assertThat( "Make money now", is(json.getString("name"))); final DateTimeFormatter inDTF = DateTimeFormatter.ofPattern("yyyy-MM-dd"); assertThat( futureDate.format(inDTF), is(json.getString("targetDate"))); assertFalse( json.getBoolean("completed")) ; target = ClientBuilder.newClient() .target("http://localhost:8181/xentracker/rest/projects/item/" + proj1.getId() + "/task/" + taskId); response = target.request().delete(); assertThat( response.getStatus(), is(200)); JsonObject output2 = response.readEntity( JsonObject.class ); assertThat( output2.getJsonArray("tasks").size(), is(0)); } @Test public void shouldInvokePUTeditProjectDetails() throws Exception { Project proj1 = createProjectAndTasks(1); service.saveProject(proj1); // Force a flush to the database?! List<Project> projects = service.findAllProjects(); Thread.sleep(1000); JsonObject input1 = bf.createObjectBuilder() .add("id", proj1.getId()) .add("name", "Visit Client") .add("headline", "Essential face-to-face meeting") .add("description", "Apple and oranges") /* We don't need the Task JSON object here */ .build(); WebTarget target = ClientBuilder.newClient() .target("http://localhost:8181/xentracker/rest/projects/item/" + proj1.getId()); Response response = target.request().put( Entity.entity( input1, APPLICATION_JSON_TYPE)); assertThat(response.getStatus(), is(200)); JsonObject output1 = response.readEntity(JsonObject.class); assertThat( "Visit Client", is(output1.getString("name"))); assertThat( "Essential face-to-face meeting", is(output1.getString("headline"))); assertThat( "Apple and oranges", is(output1.getString("description"))); assertThat(output1.getJsonArray("tasks").size(), is(1)); } }