package org.jboss.resteasy.test.nextgen;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Produces;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;

import org.jboss.resteasy.client.jaxrs.ResteasyClient;
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.jboss.resteasy.core.Dispatcher;
import org.jboss.resteasy.spi.ResteasyDeployment;
import org.jboss.resteasy.test.EmbeddedContainer;
import org.jboss.resteasy.test.TestPortProvider;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

/**
 * Unit tests for RESTEASY-699.
 * 
 * @author <a href="mailto:ron.sigal@jboss.com">Ron Sigal</a>
 * @date August 20, 2013
 */
public class MultivaluedMapTest
{
   protected static ResteasyDeployment deployment;
   protected static Dispatcher dispatcher;

   @Path("")
   static public class TestResource
   {
      @POST
      @Path("test/{param}")
      @Consumes("application/x-www-form-urlencoded")
      @Produces("text/xml; charset=UTF-8")
      public String test(MultivaluedMap<String, String> form, @PathParam("param") String param)
      {
         System.out.println("value: " + form.getFirst("key"));
         System.out.println("param: " + param);
         return form.getFirst("key") + "|" + param;
      }
   }

   @Before
   public void before() throws Exception
   {
      deployment = EmbeddedContainer.start();
      dispatcher = deployment.getDispatcher();
      deployment.getRegistry().addPerRequestResource(TestResource.class);
   }

   @After
   public void after() throws Exception
   {
      EmbeddedContainer.stop();
      dispatcher = null;
      deployment = null;
   }

   @Test
   public void testInvalidMediaTypes() throws Exception
   {
      ResteasyClient client = new ResteasyClientBuilder().build();
      Invocation.Builder request = client.target(TestPortProvider.generateURL("/test/param1")).request();
      Response response = request.post(Entity.form(new Form("key", "param2")));
      String answer = response.readEntity(String.class);
      System.out.println("\rstatus: " + response.getStatus());
      System.out.println("response: " + answer);
      Assert.assertEquals(200, response.getStatus());
      Assert.assertEquals("param2|param1", answer);
   }
}
