= MicroProfile Rest Client
:index-group: MicroProfile
:jbake-type: page
:jbake-status: published

This is a basic example on how to configure and use MicroProfile Rest
Client in TomEE.

[source,java]
----
mvn clean test 
----

=== Requirements and configuration

To use MicroProfile Rest Client you need 3 changes in your project:

[arabic]
. Add the to the `pom.xml` the dependency:
+
[source,java]
----
 <dependency>
     <groupId>org.eclipse.microprofile.rest.client</groupId>
     <artifactId>microprofile-rest-client-api</artifactId>
     <version>${microprofile.rest-client.version}</version>
     <scope>provided</scope>
 </dependency>
----
. Provide configuration files: `microprofile-config.properties`
+
[source,java]
----
 org.superbiz.rest.BookResourceClient/mp-rest/url=http://localhost:4444
----
. Provide an interface that you can build from the JAX-RS resource you
want to consume: `BookResourceClient.java`
+
[source,java]
----
 package org.superbiz.rest;

 import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
 import javax.enterprise.context.Dependent;
 import javax.ws.rs.*;
 import javax.ws.rs.core.MediaType;
 import java.util.List;

 @Dependent
 @RegisterRestClient
 @Path("/test/api/library")
 @Produces(MediaType.APPLICATION_JSON)
 @Consumes(MediaType.APPLICATION_JSON)
 public interface BookResourceClient {

     @GET
     String status();

     @POST
     @Path("/books")
     void addBook(Book newBook);

     @DELETE
     @Path("/books/{id}")
     void deleteBook(@PathParam("id") int id);

     @PUT
     @Path("/books")
     void updateBook(Book updatedBook);

     @GET
     @Path("/books/{id}")
     Book getBook(@PathParam("id") int id);

     @GET
     @Path("/books")
     List<Book> getListOfBooks();

 }
----

=== Use of MicroProfile Rest Client in TomEE

The class `BookResourceTest.java` shows how easy is to use the type-safe
approach provided by MicroProfile Rest Client to consume an existing
JAX-RS resource.

[source,java]
----
package org.superbiz.rest;

import org.eclipse.microprofile.rest.client.inject.RestClient;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Test;
import org.junit.runner.RunWith;

import javax.inject.Inject;

import static org.junit.Assert.assertTrue;

@RunWith(Arquillian.class)
public class BookResourceTest {

    @Deployment()
    public static WebArchive createDeployment() {
        final WebArchive webArchive = ShrinkWrap.create(WebArchive.class, "test.war")
                .addClass(BookResource.class)
                .addClass(Book.class)
                .addClass(BookBean.class)
                .addClass(BookResourceClient.class)
                .addClass(ApplicationConfig.class)
                .addAsWebInfResource(new StringAsset("<beans/>"), "beans.xml")
                .addAsResource("META-INF/microprofile-config.properties");
        return webArchive;
    }


    @Inject
    @RestClient
    private BookResourceClient bookResourceClient;

    @Test()
    public void testServerStatus(){
        bookResourceClient.addBook(new Book(1,"TomEE Book"));
    }

    @Test
    public void testBookResource(){
        bookResourceClient.addBook(new Book(1, "TomEE and MicroProfile Adventures"));
        bookResourceClient.addBook(new Book(2, "Top 10 Tomee Configuraiton Tips"));


        assertTrue(bookResourceClient.getListOfBooks().size() == 2);
        assertTrue(bookResourceClient.getBook(1).getName().equalsIgnoreCase("TomEE and MicroProfile Adventures"));

        bookResourceClient.deleteBook(1);
        assertTrue(bookResourceClient.getListOfBooks().size() == 1);
        assertTrue(bookResourceClient.getBook(2).getName().equalsIgnoreCase("Top 10 Tomee Configuraiton Tips"));

        bookResourceClient.updateBook(new Book(2, "Top 3 Tomee Configuraiton Tips"));
        assertTrue(bookResourceClient.getListOfBooks().size() == 1);
        assertTrue(bookResourceClient.getBook(2).getName().equalsIgnoreCase("Top 3 Tomee Configuraiton Tips"));
    }

}
----

=== About the Test architecture

The test cases from this project are built using Arquillian and TomEE
Remote. The arquillian configuration can be found in
`src/test/resources/arquillian.xml`
