package org.jooby.issues;

import java.net.URISyntaxException;

import org.jooby.hbm.Hbm;
import org.jooby.hbm.UnitOfWork;
import org.jooby.hbm.data.Member;
import org.jooby.jdbc.Jdbc;
import org.jooby.test.ServerFeature;
import org.junit.Test;

import com.typesafe.config.ConfigFactory;
import com.typesafe.config.ConfigValueFactory;

public class Issue439 extends ServerFeature {

  {
    use(ConfigFactory.empty()
        .withValue("db", ConfigValueFactory.fromAnyRef("mem")));

    use(new Jdbc());
    use(new Hbm().classes(Member.class));

    use("*", Hbm.openSessionInView());

    get("/members", req -> {
      return req.require(UnitOfWork.class).apply(em -> {
        return em.createQuery("from Member").getResultList();
      });

    });

    post("/members", (req, rsp, chain) -> {
      req.require(UnitOfWork.class).accept(em -> {
        Member member = req.params().to(Member.class);
        em.persist(member);
        rsp.send(member);
        chain.next(req, rsp);
      });
    });
  }

  @Test
  public void hbm() throws URISyntaxException, Exception {
    request()
        .get("/members")
        .expect("[]");

    request()
        .post("/members")
        .form()
        .add("id", 1)
        .add("name", "pedro")
        .expect("pedro(1)");

    request()
        .get("/members")
        .expect("[pedro(1)]");

    request()
        .post("/members")
        .form()
        .add("id", 2)
        .add("name", "pablo")
        .expect("pablo(2)");

    request()
        .get("/members")
        .expect("[pedro(1), pablo(2)]");
  }
}
