content: package org.agoncal.book.javaee7.chapter15.ex03;
  
  import com.sun.net.httpserver.HttpHandler;
  import com.sun.net.httpserver.HttpServer;
  import org.glassfish.jersey.message.internal.MediaTypes;
  import org.junit.AfterClass;
  import org.junit.BeforeClass;
  import org.junit.Test;
  
  import javax.ws.rs.client.Client;
  import javax.ws.rs.client.ClientBuilder;
  import javax.ws.rs.client.Invocation;
  import javax.ws.rs.client.WebTarget;
  import javax.ws.rs.core.MediaType;
  import javax.ws.rs.core.Response;
  import javax.ws.rs.core.UriBuilder;
  import javax.ws.rs.ext.RuntimeDelegate;
  import java.io.IOException;
  import java.net.InetSocketAddress;
  import java.net.URI;
  import java.net.URISyntaxException;
  
  import static org.junit.Assert.assertEquals;
  import static org.junit.Assert.assertTrue;
  
  /**
   * @author Antonio Goncalves
   *         APress Book - Beginning Java EE 7 with Glassfish 4
   *         http://www.apress.com/
   *         http://www.antoniogoncalves.org
   *         --
   */
  public class BookRestService03IT {
  
    // ======================================
    // =             Attributes             =
    // ======================================
  
    private static HttpServer server;
    private static URI uri = UriBuilder.fromUri("http://localhost/").port(8282).build();
    private static Client client = ClientBuilder.newClient();
  
    // ======================================
    // =          Lifecycle Methods         =
    // ======================================
  
    @BeforeClass
    public static void init() throws IOException {
      // create a new server listening at port 8080
      server = HttpServer.create(new InetSocketAddress(uri.getPort()), 0);
  
      // create a handler wrapping the JAX-RS application
      HttpHandler handler = RuntimeDelegate.getInstance().createEndpoint(new ApplicationConfig03(), HttpHandler.class);
  
      // map JAX-RS handler to the server root
      server.createContext(uri.getPath(), handler);
  
      // start the server
      server.start();
    }
  
    @AfterClass
    public static void stop() {
      server.stop(0);
    }
  
    // ======================================
    // =              Unit tests            =
    // ======================================
  
    @Test
    public void shouldCheckForH2G2Verbose() throws URISyntaxException {
  
      Client client = ClientBuilder.newClient();
      WebTarget target = client.target("http://localhost:8282/03/book");
      assertEquals(Response.Status.OK.getStatusCode(), target.request(MediaType.TEXT_PLAIN).get().getStatus());
      URI uri = new URI("http://localhost:8282/03/book");
      target = client.target(uri);
      assertEquals(Response.Status.OK.getStatusCode(), target.request(MediaType.TEXT_PLAIN).get().getStatus());
    }
  
    @Test
    public void shouldCheckForH2G2WithWebTarget() {
  
      Client client = ClientBuilder.newClient();
      WebTarget target = client.target("http://localhost:8282/03/book");
      Invocation.Builder builder = target.request(MediaType.TEXT_PLAIN);
      Response response = builder.get();
      String entity = response.readEntity(String.class);
  
      assertEquals("H2G2", entity);
      assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
      assertEquals("H2G2 is 4 characters", 4, entity.length());
    }
  
    @Test
    public void shouldCheckForH2G2WithInvocation() {
  
      Client client = ClientBuilder.newClient();
      WebTarget target = client.target("http://localhost:8282/03/book");
      Invocation invocation = target.request(MediaType.TEXT_PLAIN).buildGet();
      Response response = invocation.invoke();
      String entity = response.readEntity(String.class);
  
      assertEquals("H2G2", entity);
      assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
      assertEquals("H2G2 is 4 characters", 4, entity.length());
    }
  
  // TODO  @Test
  //  public void shouldCheckForH2G2Configuration() {
  //
  //    Client client = ClientBuilder.newClient();
  //    client.getConfiguration().register(CustomCustomerReader16.class).setProperty("MyProperty", 1234);
  //    WebTarget target = client.target("http://localhost:8282/03/book");
  //    Invocation.Builder builder = target.request(MediaType.TEXT_PLAIN);
  //    Response response = builder.get();
  //    String entity = response.readEntity(String.class);
  //
  //    assertEquals("H2G2", entity);
  //    assertTrue(response.getStatusInfo() == Response.Status.OK);
  //    assertTrue("H2G2 is 4 characters", response.getLength() == 4);
  //    assertTrue(response.getDate() != null);
  //    assertTrue(response.getHeaderString("Content-type").equals("text/plain"));
  //  }
  
    @Test
    public void shouldCheckForH2G2String() {
      assertEquals("H2G2", ClientBuilder.newClient().target("http://localhost:8282/03/book").request().get(String.class));
    }
  
    @Test
    public void shouldCheckForH2G2Entity() {
      Response response = ClientBuilder.newClient().target("http://localhost:8282/03/book").request().get();
      assertEquals("H2G2", response.readEntity(String.class));
    }
  
    @Test
    public void shouldCheckForWrongMediaType() {
      Response response = ClientBuilder.newClient().target("http://localhost:8282/03/book").request(MediaType.APPLICATION_OCTET_STREAM).get();
      assertEquals(Response.Status.NOT_ACCEPTABLE.getStatusCode(), response.getStatus());
    }
  
    @Test
    public void shouldCheckForWrongURI() {
      Response response = ClientBuilder.newClient().target("http://localhost:8282/03/dummy").request(MediaType.TEXT_PLAIN).get();
      assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatus());
    }
  
    @Test
    public void shouldCheckForH2G2Short() {
      assertEquals("H2G2", client.target(uri).path("03/book").request(MediaType.TEXT_PLAIN).get(String.class));
    }
  
    @Test
    public void shouldCheckForH2G2WithSeveralPaths() {
      assertEquals("H2G2", client.target(uri).path("03").path("book").request(MediaType.TEXT_PLAIN).get(String.class));
    }
  
    @Test
    public void shouldCheckForH2G2WithResponse() {
      Response response = client.target(UriBuilder.fromUri(uri).path("03/book").build()).request("text/plain").get();
      assertEquals(200, response.getStatus());
      assertTrue(response.hasEntity());
      assertTrue("H2G2".equals(response.readEntity(String.class)));
    }
  
    @Test
    public void shouldCheckForApplicationWadl() {
      assertTrue(ClientBuilder.newClient().target(uri).path("application.wadl").request(MediaTypes.WADL_TYPE).get(String.class).length() > 0);
    }
  }
  