Files
freeCodeCamp/api/vitest.utils.test.ts
Shaun Hamilton 568840b8d8 feat(api): exam date use + split prisma files (#62344)
Co-authored-by: Oliver Eyton-Williams <ojeytonwilliams@gmail.com>
2025-10-02 14:28:36 +02:00

106 lines
3.3 KiB
TypeScript

import { describe, test, expect } from 'vitest';
import { getCsrfToken, getCookies, serializeDates } from './vitest.utils.js';
const fakeCookies = [
'_csrf=123; Path=/; HttpOnly; SameSite=Strict',
'csrf_token=abc-123; Path=/',
'sessionId=CV-abc.123; Path=/; Expires=Wed, 03 May 2023 16:29:53 GMT; HttpOnly'
];
describe('getCsrfToken', () => {
test('returns csrf token if there is one', () => {
expect(getCsrfToken(fakeCookies)).toEqual('abc-123');
});
test('returns undefined if there is no csrf token', () => {
expect(
getCsrfToken(['_csrf=123; Path=/; HttpOnly; SameSite=Strict'])
).toBeUndefined();
});
});
describe('setCookiesToCookies', () => {
test('returns a string of cookies', () => {
expect(getCookies(fakeCookies)).toEqual(
'_csrf=123; csrf_token=abc-123; sessionId=CV-abc.123'
);
});
test('handles bare cookies', () => {
expect(getCookies(['_csrf=123'])).toEqual('_csrf=123');
});
test('throws an error if the cookies are malformed', () => {
expect(() => getCookies(['_csrf'])).toThrow();
});
});
describe('serializeDates', () => {
function isAsymmetricMatcher(x: unknown): x is typeof expect.any {
return (
typeof x === 'object' &&
x !== null &&
typeof (x as { asymmetricMatch?: unknown }).asymmetricMatch === 'function'
);
}
test('returns primitives unchanged', () => {
expect(serializeDates(42)).toBe(42);
expect(serializeDates('hello')).toBe('hello');
expect(serializeDates(true)).toBe(true);
});
test('converts Date to ISO string', () => {
const d = new Date('2020-01-01T00:00:00.000Z');
expect(serializeDates(d)).toBe(d.toISOString());
});
test('recursively converts nested objects with Date', () => {
const input = {
a: new Date('2021-05-05T05:05:05.000Z'),
b: { c: new Date('2022-06-06T06:06:06.000Z') }
};
const output = serializeDates(input);
expect(output).toEqual({
a: input.a.toISOString(),
b: { c: input.b.c.toISOString() }
});
});
test('recursively converts arrays with Date and nested structures', () => {
const d1 = new Date('2020-02-02T02:02:02.000Z');
const d2 = new Date('2023-03-03T03:03:03.000Z');
const d3 = new Date('2024-04-04T04:04:04.000Z');
const arr: [Date, { x: Date; y: Date[] }] = [d1, { x: d2, y: [d3] }];
const out = serializeDates(arr);
expect(out).toEqual([
d1.toISOString(),
{ x: d2.toISOString(), y: [d3.toISOString()] }
]);
});
test('handles null and undefined', () => {
expect(serializeDates(null)).toBeNull();
expect(serializeDates(undefined)).toBeUndefined();
});
test('preserves asymmetric matchers', () => {
type MatchersShape = { id: unknown; meta: { when: unknown } };
const withMatchers: MatchersShape = {
id: expect.any(String) as unknown,
meta: { when: expect.stringMatching(/Z$/) as unknown }
};
const serialized = serializeDates(withMatchers);
expect(isAsymmetricMatcher(serialized.id)).toBe(true);
expect(isAsymmetricMatcher(serialized.meta.when)).toBe(true);
// Serializing `Date`s yield strings that match the same patterns
const body = {
id: 'abc',
meta: { when: new Date('2025-01-01T00:00:00.000Z') }
};
const wrapped = serializeDates(body);
expect(typeof wrapped.id).toBe('string');
expect(wrapped.meta.when).toMatch(/Z$/);
});
});