thenavisapp
Version:
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
225 lines (186 loc) • 5.83 kB
text/typescript
import net from 'node:net';
import test from 'ava';
import toughCookie from 'tough-cookie';
import delay from 'delay';
import {got, RequestError} from '../source/index.js';
import withServer from './helpers/with-server.js';
test('reads a cookie', withServer, async (t, server, got) => {
server.get('/', (_request, response) => {
response.setHeader('set-cookie', 'hello=world');
response.end();
});
const cookieJar = new toughCookie.CookieJar();
await got({cookieJar});
const cookie = cookieJar.getCookiesSync(server.url)[0];
t.is(cookie?.key, 'hello');
t.is(cookie?.value, 'world');
});
test('reads multiple cookies', withServer, async (t, server, got) => {
server.get('/', (_request, response) => {
response.setHeader('set-cookie', ['hello=world', 'foo=bar']);
response.end();
});
const cookieJar = new toughCookie.CookieJar();
await got({cookieJar});
const [cookieA, cookieB] = cookieJar.getCookiesSync(server.url);
t.is(cookieA!.key, 'hello');
t.is(cookieA!.value, 'world');
t.is(cookieB!.key, 'foo');
t.is(cookieB!.value, 'bar');
});
test('cookies doesn\'t break on redirects', withServer, async (t, server, got) => {
server.get('/redirect', (_request, response) => {
response.setHeader('set-cookie', ['hello=world', 'foo=bar']);
response.setHeader('location', '/');
response.statusCode = 302;
response.end();
});
server.get('/', (request, response) => {
response.end(request.headers.cookie ?? '');
});
const cookieJar = new toughCookie.CookieJar();
const {body} = await got('redirect', {cookieJar});
t.is(body, 'hello=world; foo=bar');
});
test('throws on invalid cookies', withServer, async (t, server, got) => {
server.get('/', (_request, response) => {
response.setHeader('set-cookie', 'invalid cookie; domain=localhost');
response.end();
});
const cookieJar = new toughCookie.CookieJar();
await t.throwsAsync(got({cookieJar}), {
instanceOf: RequestError,
message: 'Cookie failed to parse',
});
});
test('does not throw on invalid cookies when options.ignoreInvalidCookies is set', withServer, async (t, server, got) => {
server.get('/', (_request, response) => {
response.setHeader('set-cookie', 'invalid cookie; domain=localhost');
response.end();
});
const cookieJar = new toughCookie.CookieJar();
await got({
cookieJar,
ignoreInvalidCookies: true,
});
const cookies = cookieJar.getCookiesSync(server.url);
t.is(cookies.length, 0);
});
test('catches store errors', async t => {
const error = 'Some error';
const cookieJar = new toughCookie.CookieJar({
findCookies(_, __, ___, callback) {
callback(new Error(error), []);
},
findCookie() {},
getAllCookies() {},
putCookie() {},
removeCookies() {},
removeCookie() {},
updateCookie() {},
synchronous: false,
});
await t.throwsAsync(got('https://example.com', {cookieJar}), {
instanceOf: RequestError,
message: error,
});
});
test('overrides options.headers.cookie', withServer, async (t, server, got) => {
server.get('/redirect', (_request, response) => {
response.setHeader('set-cookie', ['hello=world', 'foo=bar']);
response.setHeader('location', '/');
response.statusCode = 302;
response.end();
});
server.get('/', (request, response) => {
response.end(request.headers.cookie ?? '');
});
const cookieJar = new toughCookie.CookieJar();
const {body} = await got('redirect', {
cookieJar,
headers: {
cookie: 'a=b',
},
});
t.is(body, 'hello=world; foo=bar');
});
test('no unhandled errors', async t => {
const server = net.createServer(connection => {
connection.end('blah');
}).listen(0);
const message = 'snap!';
const options = {
cookieJar: {
async setCookie(_rawCookie: string, _url: string) {},
async getCookieString(_url: string) {
throw new Error(message);
},
},
};
await t.throwsAsync(got(`http://127.0.0.1:${(server.address() as net.AddressInfo).port}`, options), {
instanceOf: RequestError,
message,
});
await delay(500);
t.pass();
server.close();
});
test('accepts custom `cookieJar` object', withServer, async (t, server, got) => {
server.get('/', (request, response) => {
response.setHeader('set-cookie', ['hello=world']);
response.end(request.headers.cookie);
});
const cookies: Record<string, string> = {};
const cookieJar = {
async getCookieString(url: string) {
t.is(typeof url, 'string');
return cookies[url] ?? '';
},
async setCookie(rawCookie: string, url: string) {
cookies[url] = rawCookie;
},
};
const first = await got('', {cookieJar});
const second = await got('', {cookieJar});
t.is(first.body, '');
t.is(second.body, 'hello=world');
});
test('throws on invalid `options.cookieJar.setCookie`', async t => {
await t.throwsAsync(got('https://example.com', {
cookieJar: {
// @ts-expect-error Error tests
setCookie: 123,
},
}), {
instanceOf: RequestError,
message: 'Expected value which is `Function`, received value of type `number`.',
});
});
test('throws on invalid `options.cookieJar.getCookieString`', async t => {
await t.throwsAsync(got('https://example.com', {
cookieJar: {
async setCookie() {},
// @ts-expect-error Error tests
getCookieString: 123,
},
}), {
instanceOf: RequestError,
message: 'Expected value which is `Function`, received value of type `number`.',
});
});
test('cookies are cleared when redirecting to a different hostname (no cookieJar)', withServer, async (t, server, got) => {
server.get('/', (_request, response) => {
response.writeHead(302, {
location: 'https://httpbin.org/anything',
});
response.end();
});
const {headers} = await got('', {
headers: {
cookie: 'foo=bar',
'user-agent': 'custom',
},
}).json<{headers: Record<string, string | undefined>}>();
t.is(headers.Cookie, undefined);
t.is(headers['User-Agent'], 'custom');
});