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

Este es un ejemplo básico sobre cómo configurar y utilizar Cliente Rest de MicroProfile en TomEE.

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

=== Requisitos y configuración

Para utilizar el Cliente Rest de MicroProfile se requieren 3 cambios en su proyecto:

[arabic]
. Agregar la siguiente dependencia al `pom.xml`:
+
[source,java]
----
 <dependency>
     <groupId>org.eclipse.microprofile.rest.client</groupId>
     <artifactId>microprofile-rest-client-api</artifactId>
     <version>${version.microprofile.rest-client}</version>
     <scope>provided</scope>
 </dependency>
----
. Proveer el archivo de configuración: `microprofile-config.properties`
+
[source,java]
----
 org.superbiz.rest.BookResourceClient/mp-rest/url=http://localhost:4444
----
. Proporcionar una interfaz que pueda crear a partir del recurso JAX-RS 
que desea consumir: `BookResourceClient.java`
+
[source,java]
----
 package org.superbiz.rest;

 import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
 import jakarta.enterprise.context.Dependent;
 import jakarta.ws.rs.*;
 import jakarta.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();

 }
----

=== Uso del Client Rest de MicroProfile en TomEE

La clase `BookResourceTest.java` muestra lo fácil que es utilizar el enfoque 
con seguridad de tipos (type-safe) proporcionado por el Client Rest de MicroProfile
para consumir un recurso JAX-RS existente.

[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 jakarta.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"));
    }

}
----

=== Acerca de la arquitectura de prueba

Los casos de prueba de este proyecto se construyen utilizando Arquillian 
y TomEE Remote. La configuración del arquillianse se puede encontrar en 
`src/test/resources/arquillian.xml`
