package org.jooby.session; import static org.junit.Assert.assertTrue; import java.time.Instant; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Locale; import org.jooby.Session; import org.jooby.test.ServerFeature; import org.junit.Test; import com.google.common.base.Splitter; import com.google.common.collect.Lists; import com.typesafe.config.ConfigFactory; import com.typesafe.config.ConfigValueFactory; public class SessionCookieFeature extends ServerFeature { { use(ConfigFactory.empty().withValue("application.secret", ConfigValueFactory.fromAnyRef("fixed"))); session(new Session.Mem()).cookie() .name("custom.sid") .path("/session") .comment("jooby cookie") .domain("localhost") .maxAge(60); get("/session", (req, rsp) -> { rsp.send(req.session().id()); }); } @Test public void cookieConfig() throws Exception { long maxAge = System.currentTimeMillis() + 60 * 1000; // remove seconds to make sure test always work DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E, dd-MMM-yyyy HH:mm") .withZone(ZoneId.of("GMT")) .withLocale(Locale.ENGLISH); Instant instant = Instant.ofEpochMilli(maxAge); request() .get("/session") .expect(200) .header("Set-Cookie", value -> { List<String> setCookie = Lists.newArrayList(Splitter.onPattern(";\\s*") .splitToList(value)); assertTrue(setCookie.remove(0).startsWith("custom.sid")); assertTrue(setCookie.remove("Path=/session") || setCookie.remove("Path=\"/session\"")); assertTrue(setCookie.remove("HttpOnly") || setCookie.remove("HTTPOnly")); assertTrue(setCookie.remove("Max-Age=60")); assertTrue(setCookie.remove("Domain=localhost")); assertTrue(setCookie.remove("Version=1")); assertTrue(setCookie.remove("Comment=\"jooby cookie\"")); assertTrue(setCookie.remove(0).startsWith( "Expires=" + formatter.format(instant).replace("GMT", ""))); }); } }