package com.vtence.molecule.http;
import org.junit.Test;
import java.util.List;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;
public class CookieDecoderTest {
CookieDecoder decoder = new CookieDecoder();
@Test
public void parsesClientCookieNameAndValue() {
Cookie cookie = decodeSingle("name=value");
assertThat("cookie name", cookie.name(), equalTo("name"));
assertThat("cookie value", cookie.value(), equalTo("value"));
}
@Test
public void correctlyHandlesEmptyValues() {
Cookie cookie = decodeSingle("name=");
assertThat("cookie value", cookie.value(), equalTo(""));
}
@Test
public void differentiatesValueDelimitersFromDelimitersWithinValues() {
Cookie cookie = decodeSingle("name=a-value-with-an-=-sign");
assertThat("cookie value", cookie.value(), equalTo("a-value-with-an-=-sign"));
}
@Test
public void decodesQuotedCookieValues() {
Cookie cookie = decodeSingle("name=\"value\"");
assertThat("cookie value", cookie.value(), equalTo("value"));
}
@Test
public void unescapesQuotedCookieValues() {
Cookie cookie = decodeSingle("name=\";,\"");
assertThat("cookie value", cookie.value(), equalTo(";,"));
}
@Test
public void correctlyIgnoresValueDelimitersWithinQuotedValues() {
assertThat("unescaped quote", decodeSingle("name=\"\\\"\"").value(), equalTo("\""));
assertThat("unescaped backslash", decodeSingle("name=\"\\\\\"").value(), equalTo("\\"));
}
@Test
public void parsesCookieVersionWhenSpecified() {
Cookie cookie = decodeSingle("$Version=\"0\"; name=\"value\"");
assertThat("cookie version", cookie.version(), is(0));
}
@Test
public void parsesCookiePathWhenSpecified() {
Cookie cookie = decodeSingle("name=\"value\"; $Path=path");
assertThat("cookie path", cookie.path(), equalTo("path"));
}
@Test
public void parsesCookieDomainWhenSpecified() {
Cookie cookie = decodeSingle("name=\"value\"; $Domain=domain");
assertThat("cookie domain", cookie.domain(), equalTo("domain"));
}
@Test
public void decodesSingleClientSideCookie() {
Cookie cookie = decodeSingle("$Version=\"1\"; Customer=\"WILE_E_COYOTE\"; $Path=\"/acme\"");
assertThat("cookie version", cookie.version(), is(1));
assertThat("cookie name", cookie.name(), equalTo("Customer"));
assertThat("cookie value", cookie.value(), equalTo("WILE_E_COYOTE"));
assertThat("cookie path", cookie.path(), equalTo("/acme"));
}
@Test
public void decodesMultipleClientSideCookies() {
List<Cookie> cookies = decodeAll("$Version=\"1\"; Customer=\"WILE_E_COYOTE\"; $Path=\"/acme\"; " +
"Part_Number=\"Rocket_Launcher_0001\"; $Path=\"/acme/ammo\"; " +
"Shipping=\"FedEx\"; $Path=\"/acme\"");
assertThat("decoded cookies", cookies, hasSize(3));
Cookie customer = cookies.get(0);
assertThat("cookie version", customer.version(), is(1));
assertThat("cookie name", customer.name(), equalTo("Customer"));
assertThat("cookie value", customer.value(), equalTo("WILE_E_COYOTE"));
assertThat("cookie path", customer.path(), equalTo("/acme"));
Cookie partNumber = cookies.get(1);
assertThat("cookie version", partNumber.version(), is(1));
assertThat("cookie name", partNumber.name(), equalTo("Part_Number"));
assertThat("cookie value", partNumber.value(), equalTo("Rocket_Launcher_0001"));
assertThat("cookie path", partNumber.path(), equalTo("/acme/ammo"));
Cookie shipping = cookies.get(2);
assertThat("cookie version", shipping.version(), is(1));
assertThat("cookie name", shipping.name(), equalTo("Shipping"));
assertThat("cookie value", shipping.value(), equalTo("FedEx"));
assertThat("cookie path", shipping.path(), equalTo("/acme"));
}
@Test
public void decodesCommaSeparatedPairs() {
String cookieHeader =
"$Version=\"1\", " +
"Part_Number=\"Riding_Rocket_0023\"; $Path=\"/acme/ammo\", " +
"Part_Number=\"Rocket_Launcher_0001\"; $Path=\"/acme\"";
List<Cookie> cookies = decodeAll(cookieHeader);
Cookie rocket = cookies.get(0);
assertThat("cookie name", rocket.name(), equalTo("Part_Number"));
assertThat("cookie value", rocket.value(), equalTo("Riding_Rocket_0023"));
Cookie launcher = cookies.get(1);
assertThat("cookie version", launcher.version(), is(1));
assertThat("cookie name", launcher.name(), equalTo("Part_Number"));
assertThat("cookie value", launcher.value(), equalTo("Rocket_Launcher_0001"));
}
private Cookie decodeSingle(String cookieHeader) {
List<Cookie> cookies = decodeAll(cookieHeader);
assertThat("cookies found", cookies, hasSize(1));
return cookies.get(0);
}
private List<Cookie> decodeAll(String cookieHeader) {
return decoder.decode(cookieHeader);
}
}