package org.jooby.gson;

import java.net.URISyntaxException;
import java.util.List;
import java.util.Map;

import org.jooby.json.Gzon;
import org.jooby.mvc.Body;
import org.jooby.mvc.POST;
import org.jooby.mvc.Path;
import org.jooby.test.ServerFeature;
import org.junit.Test;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.inject.TypeLiteral;

@SuppressWarnings("unchecked")
public class GsonFeature extends ServerFeature {

  @Path("/r")
  public static class Mvc {

    @Path("/members")
    @POST
    public Object post(final @Body List<Map<String, Object>> body) {
      return body;
    }
  }

  {
    use(new Gzon());

    get("/members", req ->
        Lists.newArrayList(ImmutableMap.<String, Object> of("id", 1, "name", "pablo")));

    post("/members", req -> {
      List<Map<String, Object>> members = req.body().to(
          new TypeLiteral<List<Map<String, Object>>>() {
          });
      return members;
    });

    use(Mvc.class);

  }

  @Test
  public void get() throws URISyntaxException, Exception {
    request()
        .get("/members")
        .expect("[{\"id\":1,\"name\":\"pablo\"}]")
        .header("Content-Type", "application/json;charset=UTF-8");
  }

  @Test
  public void post() throws URISyntaxException, Exception {
    request()
        .post("/members")
        .body("[{\"id\":1,\"name\":\"vilma\"}]", "application/json")
        .expect("[{\"id\":1.0,\"name\":\"vilma\"}]")
        .header("Content-Type", "application/json;charset=UTF-8");

    request()
        .post("/r/members")
        .body("[{\"id\":1,\"name\":\"vilma\"}]", "application/json")
        .expect("[{\"id\":1.0,\"name\":\"vilma\"}]")
        .header("Content-Type", "application/json;charset=UTF-8");

  }

}
