flumm-fetch-cookies/test/cookie.mjs

331 lines
14 KiB
JavaScript

import Cookie from "../src/cookie.mjs";
import {CookieParseError} from "../src/errors.mjs";
export default Test => [
new Test("new Cookie() / cookie parser", () => {
const inputs = [
[ // type error
123,
""
],
[ // type error
"id=a3fWa",
123
],
[ // type error invalid url
"id=a3fWa",
""
],
[ // type error invalid url
"id=a3fWa",
"github.com"
],
// TODO: fix this test case, parser shouldn't allow it. it is currently ignored
[ // type error invalid url
"id=a3fWa",
"https:abc/abs"
],
[ // cookie parse error invalid cookie name
"",
"https://github.com"
],
[ // cookie parse error invalid value for expires
"id=a3fWa; Expires=Wed, 21 Oct 2015 07:28: GMT; Secure; HttpOnly",
"https://github.com"
],
[ // cookie parse error invalid value for expires
"id=a3fWa; Expires=Wed, 21 Onv 2015 07:28:00 GMT; Secure; HttpOnly",
"https://github.com"
],
[ // cookie parse error invalid value for expires
"id=a3fWa; Expires=Wed, 21 Oct 20151 07:28:00 GMT; Secure; HttpOnly",
"https://github.com"
],
[ // cookie parse error invalid value for expires
"id=a3fWa; Expires=Wed, 32 Oct 2015 07:28:00 GMT; Secure; HttpOnly",
"https://github.com"
],
[ // cookie parse error invalid value for expires
"id=a3fWa; Expires=Wed, 21 Oct 2015 25:28:00 GMT; Secure; HttpOnly",
"https://github.com"
],
[ // cookie parse error invalid value for expires
"id=a3fWa; Expires=Wed, 21 Oct 2015 07:61:00 GMT; Secure; HttpOnly",
"https://github.com"
],
[ // cookie parse error invalid value for expires
"id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 UTC; Secure; HttpOnly",
"https://github.com"
],
[ // cookie parse error invalid value for expires
"id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT+2; Secure; HttpOnly",
"https://github.com"
],
[ // cookie parse error invalid value for expires
"id=a3fWa; Expires=San, 21 Onv 2015 07:28:00 GMT; Secure; HttpOnly",
"https://github.com"
],
[ // cookie parse error invalid value for expires
"id=a3fWa; Expires=Wed, 31 Dec 1969 07:28:00 GMT; Secure; HttpOnly",
"https://github.com"
],
[ // cookie parse error invalid value for expires
"id=a3fWa; Max-Age=121252a; Secure; HttpOnly",
"https://github.com"
],
[ // cookie parse error invalid key secur
"id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secur; HttpOnly",
"https://github.com"
],
[ // cookie parse error invalid key HttpOly with value 2
"id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOly=2",
"https://github.com"
],
[ // cookie parse error not set via https
"__Secure-id=a3fWa; Expires=Wed, 21 Nov 2015 07:28:00 GMT; Secure; HttpOnly",
"http://github.com"
],
[ // cookie parse error secure not set
"__Secure-id=a3fWa; Expires=Wed, 21 Nov 2015 07:28:00 GMT; HttpOnly",
"https://github.com"
],
[ // cookie parse error secure not set
"__Host-id=a3fWa; Expires=Wed, 21 Nov 2015 07:28:00 GMT; HttpOnly; Path=/",
"https://github.com"
],
[ // cookie parse error not set via https
"__Host-id=a3fWa; Expires=Wed, 21 Nov 2015 07:28:00 GMT; Secure; HttpOnly; Path=/",
"http://github.com"
],
[ // cookie parse error domain is set
"__Host-id=a3fWa; Expires=Wed, 21 Nov 2015 07:28:00 GMT; Secure; HttpOnly; Domain=github.com; Path=/",
"https://github.com"
],
[ // cookie parse error path is not set
"__Host-id=a3fWa; Expires=Wed, 21 Nov 2015 07:28:00 GMT; Secure; HttpOnly",
"https://github.com"
],
[ // cookie parse error path is not equal to /
"__Host-id=a3fWa; Expires=Wed, 21 Nov 2015 07:28:00 GMT; Secure; HttpOnly; Path=/lel/",
"https://github.com"
],
[ // cookie parse error domain is not a subdomain
"id=a3fWa; Expires=Wed, 21 Nov 2015 07:28:00 GMT; Domain=github.com",
"https://gist.github.com"
],
[ // cookie parse error domain is not a subdomain
"id=a3fWa; Expires=Wed, 21 Nov 2015 07:28:00 GMT; Domain=npmjs.com",
"https://gist.github.com"
],
[ // success
"__Secure-id=a3fWa; Expires=Wed, 21 Nov 2015 07:28:00 GMT; Secure; HttpOnly",
"https://github.com"
],
[ // success
"__Host-id=a3fWa; Expires=Wed, 21 Nov 2015 07:28:00 GMT; Secure; HttpOnly; Path=/",
"https://github.com"
],
[ // success
"__Host-id=a3fWa; Expires=Wed, 21 Nov 2099 20:28:33 GMT; Secure; HttpOnly; Path=/",
"https://github.com"
],
[ // success
"id=a3fWa; Expires=Wed, 21 Nov 2015 07:28:00 GMT; Secure; HttpOnly; Path=/lul/; Domain=.usercontent.github.com",
"https://github.com"
],
[ // success
"id=a3fWa; Expires=Wed, 21 Nov 2015 07:28:00 GMT; Secure; HttpOnly; SameSite=Strict; Path=/lul/; Domain=usercontent.github.com",
"https://github.com"
],
[ // success max-age takes precendence over expires
"id=a3fWa; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Max-Age=1000",
"https://github.com"
],
[ // success max-age takes precendence over expires
"id=\"a3fWa\"; Max-Age=1000; Expires=Thu, 01 Jan 1970 00:00:00 GMT",
"https://github.com"
],
];
const catchErrorTest = (input, catchFnc) => {
try {
new Cookie(...input);
return false;
}
catch(error) {
return catchFnc(error);
}
};
const catchErrorTypeMessageTest = (input, type, message) => catchErrorTest(input, e => e instanceof type && e.message === message);
const compareCookieProps = (input, expiryFnc, properties) => {
const cookie = new Cookie(...input);
return Object.entries(properties).every(([prop, value]) => cookie[prop] === value)
&& expiryFnc(cookie.expiry);
};
return inputs.slice(0, 3).every(input => catchErrorTest(input, e => e instanceof TypeError))
// cookies[4] is the test case that is ignored for now
&& catchErrorTypeMessageTest(inputs[5], CookieParseError, "Invalid cookie name \"\"!")
&& catchErrorTypeMessageTest(inputs[6], CookieParseError, "Invalid value for Expires \"Wed, 21 Oct 2015 07:28: GMT\"!")
&& catchErrorTypeMessageTest(inputs[7], CookieParseError, "Invalid value for Expires \"Wed, 21 Onv 2015 07:28:00 GMT\"!")
&& catchErrorTypeMessageTest(inputs[8], CookieParseError, "Invalid value for Expires \"Wed, 21 Oct 20151 07:28:00 GMT\"!")
&& catchErrorTypeMessageTest(inputs[9], CookieParseError, "Invalid value for Expires \"Wed, 32 Oct 2015 07:28:00 GMT\"!")
&& catchErrorTypeMessageTest(inputs[10], CookieParseError, "Invalid value for Expires \"Wed, 21 Oct 2015 25:28:00 GMT\"!")
&& catchErrorTypeMessageTest(inputs[11], CookieParseError, "Invalid value for Expires \"Wed, 21 Oct 2015 07:61:00 GMT\"!")
&& catchErrorTypeMessageTest(inputs[12], CookieParseError, "Invalid value for Expires \"Wed, 21 Oct 2015 07:28:00 UTC\"!")
&& catchErrorTypeMessageTest(inputs[13], CookieParseError, "Invalid value for Expires \"Wed, 21 Oct 2015 07:28:00 GMT+2\"!")
&& catchErrorTypeMessageTest(inputs[14], CookieParseError, "Invalid value for Expires \"San, 21 Onv 2015 07:28:00 GMT\"!")
&& catchErrorTypeMessageTest(inputs[15], CookieParseError, "Invalid value for Expires \"Wed, 31 Dec 1969 07:28:00 GMT\"!")
&& catchErrorTypeMessageTest(inputs[16], CookieParseError, "Invalid value for Max-Age \"121252a\"!")
&& catchErrorTypeMessageTest(inputs[17], CookieParseError, "Invalid key \"secur\" specified!")
&& catchErrorTypeMessageTest(inputs[18], CookieParseError, "Invalid key \"httpoly\" with value \"2\" specified!")
&& inputs.slice(19, 21).every(input => catchErrorTypeMessageTest(input, CookieParseError, "Cookie has \"__Secure-\" prefix but \"Secure\" isn't set or the cookie is not set via https!"))
&& inputs.slice(21, 26).every(input => catchErrorTypeMessageTest(input, CookieParseError, "Cookie has \"__Host-\" prefix but \"Secure\" isn't set, the cookie is not set via https, \"Domain\" is set or \"Path\" is not equal to \"/\"!"))
&& catchErrorTypeMessageTest(inputs[26], CookieParseError, "Invalid value for Domain \"github.com\": cookie was received from \"gist.github.com\"!")
&& catchErrorTypeMessageTest(inputs[27], CookieParseError, "Invalid value for Domain \"npmjs.com\": cookie was received from \"gist.github.com\"!")
&& compareCookieProps(
inputs[28],
exp => exp.getTime() === new Date("Wed, 21 Nov 2015 07:28:00 GMT").getTime(),
{
name: "__Secure-id",
value: "a3fWa",
secure: true,
domain: "github.com",
subdomains: false,
path: "/"
}
)
&& compareCookieProps(
inputs[29],
exp => exp.getTime() === new Date("Wed, 21 Nov 2015 07:28:00 GMT").getTime(),
{
name: "__Host-id",
value: "a3fWa",
secure: true,
domain: "github.com",
subdomains: false,
path: "/"
}
)
&& compareCookieProps(
inputs[30],
exp => exp.getTime() === new Date("Wed, 21 Nov 2099 20:28:33 GMT").getTime(),
{
name: "__Host-id",
value: "a3fWa",
secure: true,
domain: "github.com",
subdomains: false,
path: "/"
}
)
&& compareCookieProps(
inputs[31],
exp => exp.getTime() === new Date("Wed, 21 Nov 2015 07:28:00 GMT").getTime(),
{
name: "id",
value: "a3fWa",
secure: true,
domain: "usercontent.github.com",
subdomains: true,
path: "/lul/"
}
)
&& compareCookieProps(
inputs[32],
exp => exp.getTime() === new Date("Wed, 21 Nov 2015 07:28:00 GMT").getTime(),
{
name: "id",
value: "a3fWa",
secure: true,
domain: "usercontent.github.com",
subdomains: true,
path: "/lul/"
}
)
&& compareCookieProps(
inputs[33],
exp => exp.getTime() > new Date("Thu, 01 Jan 1970 00:00:00 GMT").getTime(),
{
name: "id",
value: "a3fWa",
secure: false,
domain: "github.com",
subdomains: false,
path: "/"
}
)
&& compareCookieProps(
inputs[34],
exp => exp.getTime() > new Date("Thu, 01 Jan 1970 00:00:00 GMT").getTime(),
{
name: "id",
value: "a3fWa",
secure: false,
domain: "github.com",
subdomains: false,
path: "/"
}
);
}),
new Test("static Cookie.fromObject()", () => {
const date = new Date();
const inputs = [
{
name: "testname",
value: "somevalue",
secure: false,
domain: "github.com",
subdomains: false,
path: "/",
expiry: "2019-12-25T03:58:52.000Z"
},
{
name: "testname",
domain: "somedomain.tld",
path: "/lel/",
expiry: date,
secure: true,
subdomains: true,
value: "lul"
}
];
const cookies = inputs.map(i => Cookie.fromObject(i));
return cookies[0].name === "testname"
&& cookies[0].value === "somevalue"
&& cookies[0].domain === "github.com"
&& cookies[0].path === "/"
&& cookies[0].expiry.getTime() === new Date(inputs[0].expiry).getTime()
&& cookies[0].secure === false
&& cookies[0].subdomains === false
&& cookies[1].name === "testname"
&& cookies[1].value === "lul"
&& cookies[1].domain === "somedomain.tld"
&& cookies[1].path === "/lel/"
&& cookies[1].expiry.getTime() === date.getTime()
&& cookies[1].secure === true
&& cookies[1].subdomains === true;
}),
new Test("Cookie.serialize()", () => {
return new Cookie("abc=def; Expires=Wed, 20 Oct 2018 08:08:08 GMT; Path=/", "https://somedomain.tld").serialize() === "abc=def"
&& new Cookie("jkhsd231=ajkshdgi", "https://somedomain.tld").serialize() === "jkhsd231=ajkshdgi";
})
];