function assert(condition, message) {
if (!condition) {
throw new Error(message || 'Assertion failed');
}
}
function assertEquals(actual, expected, message) {
if (actual !== expected) {
throw new Error(message || `Expected ${expected} but got ${actual}`);
}
}
function assertArrayEquals(actual, expected, message) {
if (actual.length !== expected.length) {
throw new Error(message || `Arrays have different lengths. Expected ${expected.length} but got ${actual.length}`);
}
for (let i = 0; i < actual.length; i++) {
if (actual[i] !== expected[i]) {
throw new Error(message || `Arrays differ at index ${i}. Expected ${expected[i]} but got ${actual[i]}`);
}
}
}
{
const emptyHeaders = new Headers();
assert(emptyHeaders.get('content-type') === null, "Empty headers should return null");
const objHeaders = new Headers({
'Content-Type': 'text/plain',
'X-Custom': 'test'
});
assertEquals(objHeaders.get('content-type'), 'text/plain');
assertEquals(objHeaders.get('x-custom'), 'test');
const arrayHeaders = new Headers([
['Content-Type', 'text/plain'],
['X-Custom', 'test']
]);
assertEquals(arrayHeaders.get('content-type'), 'text/plain');
assertEquals(arrayHeaders.get('x-custom'), 'test');
}
{
const headers = new Headers();
headers.append('X-Test', 'value1');
assertEquals(headers.get('x-test'), 'value1');
headers.append('X-Test', 'value2');
assertEquals(headers.get('x-test'), 'value1, value2');
headers.set('X-Test', 'value3');
assertEquals(headers.get('x-test'), 'value3');
assert(headers.has('x-test'), "has() should return true for existing header");
assert(!headers.has('nonexistent'), "has() should return false for non-existing header");
headers.delete('X-Test');
assert(!headers.has('x-test'), "delete() should remove header");
headers.append('Set-Cookie', 'cookie1=value1');
headers.append('Set-Cookie', 'cookie2=value2');
assertArrayEquals(headers.getSetCookie(), ['cookie1=value1', 'cookie2=value2']);
}
{
const headers = new Headers({
'Content-Type': 'text/plain',
'X-Custom': 'test',
'Accept': 'application/json'
});
const entries = [...headers.entries()];
assertArrayEquals(entries.flat(), [
'accept', 'application/json',
'content-type', 'text/plain',
'x-custom', 'test'
]);
const keys = [...headers.keys()];
assertArrayEquals(keys, ['accept', 'content-type', 'x-custom']);
const values = [...headers.values()];
assertArrayEquals(values, ['application/json', 'text/plain', 'test']);
const forEachEntries = [];
headers.forEach((value, key) => {
forEachEntries.push(key, value);
});
assertArrayEquals(forEachEntries, [
'accept', 'application/json',
'content-type', 'text/plain',
'x-custom', 'test'
]);
}
{
const headers = new Headers();
try {
headers.set('Invalid:Name', 'value');
assert(false, "Should throw on invalid header name");
} catch (e) {
assert(e instanceof TypeError);
}
try {
headers.set('X-Test', 'value\n with\n newlines');
assert(false, "Should throw on invalid header value");
} catch (e) {
assert(e instanceof TypeError);
}
}