package org.jooby.session;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.concurrent.atomic.AtomicReference;
import org.jooby.Session;
import org.jooby.test.ServerFeature;
import org.junit.Test;
public class SessionWithMaxAgeShouldAlwaysSendHeaderFeature extends ServerFeature {
private static AtomicReference<String> ID = new AtomicReference<String>();
{
session(new Session.Mem() {
@Override
public String generateID() {
String id = super.generateID();
ID.set(id);
return id;
}
}).cookie().maxAge(2);
get("/session", req -> {
Session session = req.session();
return session.id();
});
}
@Test
public void shouldRestoreSessionFromCookieID() throws Exception {
ID.set(null);
long maxAge = System.currentTimeMillis() + 2 * 1000;
// remove seconds to make sure test always work
Instant instant = Instant.ofEpochMilli(maxAge);
request()
.get("/session")
.expect(200)
.header("Set-Cookie", setCookie -> {
assertTrue(setCookie.startsWith(sessionId(ID.get(), instant)));
});
String existingID = ID.get();
request()
.get("/session")
.expect(200)
.header("Set-Cookie", setCookie -> {
assertTrue(setCookie.startsWith(sessionId(ID.get(), instant)));
});
request()
.get("/session")
.expect(200)
.header("Set-Cookie", setCookie -> {
assertTrue(setCookie.startsWith(sessionId(ID.get(), instant)));
});
// reset cookies
request()
.resetCookies()
.get("/session")
.expect(200)
.header("Set-Cookie", setCookie -> {
assertNotEquals(ID.get(), existingID);
assertTrue(setCookie.startsWith(sessionId(ID.get(), instant)));
});
}
private String sessionId(final String id, final Instant instant) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E, dd-MMM-yyyy HH:mm")
.withZone(ZoneId.of("GMT"))
.withLocale(Locale.ENGLISH);
return "jooby.sid=" + id + ";Version=1;Path=/;HttpOnly;Max-Age=2;Expires="
+ formatter.format(instant);
}
}