package com.vtence.molecule.middlewares;
import com.vtence.molecule.Request;
import com.vtence.molecule.Response;
import com.vtence.molecule.lib.CookieJar;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import java.util.concurrent.ExecutionException;
import static com.vtence.molecule.testing.RequestAssert.assertThat;
import static com.vtence.molecule.testing.ResponseAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.notNullValue;
public class CookiesTest {
Request request = new Request();
Response response = new Response();
Cookies cookies = new Cookies();
@Rule
public ExpectedException error = ExpectedException.none();
@Test
public void fillsCookieJarWithClientCookies() throws Exception {
cookies.connectTo((request, response) -> {
CookieJar jar = CookieJar.get(request);
response.body("foo: " + jar.get("foo").value() + ", baz: " + jar.get("baz").value());
});
request.addHeader("Cookie", "foo=bar; baz=qux");
cookies.handle(request, response);
response.done();
assertNoExecutionError();
assertThat(response).hasBodyText("foo: bar, baz: qux");
}
@Test
public void poursNewCookiesFromJar() throws Exception {
cookies.connectTo((request, response) -> {
CookieJar jar = CookieJar.get(request);
jar.add("oogle", "foogle");
jar.add("gorp", "mumble");
});
request.addHeader("Cookie", "foo=bar; baz=qux");
cookies.handle(request, response);
response.done();
assertNoExecutionError();
assertThat(response).hasHeaders("Set-Cookie",
contains("oogle=foogle; version=1; path=/", "gorp=mumble; version=1; path=/"));
}
@Test
public void expiresDiscardedCookies() throws Exception {
cookies.connectTo((request, response) -> {
CookieJar jar = CookieJar.get(request);
jar.discard("foo");
});
request.addHeader("Cookie", "foo=bar; baz=qux");
cookies.handle(request, response);
response.done();
assertNoExecutionError();
assertThat(response).hasHeaders("Set-Cookie", contains("foo=; version=1; path=/; max-age=0"));
}
@Test
public void
unbindsCookieJarOnceDone() throws Exception {
cookies.handle(request, response);
assertThat(request).hasAttribute(CookieJar.class, notNullValue());
response.done();
assertNoExecutionError();
assertThat(request).hasNoAttribute(CookieJar.class);
}
@Test
public void
unbindsCookieJarWhenAnErrorOccurs() throws Exception {
cookies.connectTo((request, response) -> {
throw new Exception("Error!");
});
error.expectMessage("Error!");
try {
cookies.handle(request, response);
} finally {
assertThat(request).hasNoAttribute(CookieJar.class);
}
}
@Test
public void
unbindsCookieJarWhenAnErrorOccursLater() throws Throwable {
cookies.handle(request, response);
response.done(new Exception("Error!"));
assertThat(request).hasNoAttribute(CookieJar.class);
}
private void assertNoExecutionError() throws ExecutionException, InterruptedException {
response.await();
}
}