Merge branch 'main' into versions/next-major

This commit is contained in:
Joachim Van Herwegen
2023-10-05 14:28:06 +02:00
58 changed files with 1061 additions and 215 deletions

View File

@@ -0,0 +1,40 @@
import { RangePreferenceParser } from '../../../../../src/http/input/preferences/RangePreferenceParser';
import { BadRequestHttpError } from '../../../../../src/util/errors/BadRequestHttpError';
describe('A RangePreferenceParser', (): void => {
const parser = new RangePreferenceParser();
it('parses range headers.', async(): Promise<void> => {
await expect(parser.handle({ request: { headers: { range: 'bytes=5-10' }}} as any))
.resolves.toEqual({ range: { unit: 'bytes', parts: [{ start: 5, end: 10 }]}});
await expect(parser.handle({ request: { headers: { range: 'bytes=5-' }}} as any))
.resolves.toEqual({ range: { unit: 'bytes', parts: [{ start: 5 }]}});
await expect(parser.handle({ request: { headers: { range: 'bytes=-5' }}} as any))
.resolves.toEqual({ range: { unit: 'bytes', parts: [{ start: -5 }]}});
await expect(parser.handle({ request: { headers: { range: 'bytes=5-10, 11-20, 21-99' }}} as any))
.resolves.toEqual({ range: { unit: 'bytes',
parts: [{ start: 5, end: 10 }, { start: 11, end: 20 }, { start: 21, end: 99 }]}});
});
it('returns an empty object if there is no header.', async(): Promise<void> => {
await expect(parser.handle({ request: { headers: {}}} as any)).resolves.toEqual({});
});
it('rejects invalid range headers.', async(): Promise<void> => {
await expect(parser.handle({ request: { headers: { range: '=5-10' }}} as any))
.rejects.toThrow(BadRequestHttpError);
await expect(parser.handle({ request: { headers: { range: 'bytes' }}} as any))
.rejects.toThrow(BadRequestHttpError);
await expect(parser.handle({ request: { headers: { range: 'bytes=' }}} as any))
.rejects.toThrow(BadRequestHttpError);
await expect(parser.handle({ request: { headers: { range: 'bytes=-' }}} as any))
.rejects.toThrow(BadRequestHttpError);
await expect(parser.handle({ request: { headers: { range: 'bytes=5' }}} as any))
.rejects.toThrow(BadRequestHttpError);
await expect(parser.handle({ request: { headers: { range: 'bytes=5-10, 99' }}} as any))
.rejects.toThrow(BadRequestHttpError);
});
});

View File

@@ -0,0 +1,54 @@
import { PreferenceParser } from '../../../../../src/http/input/preferences/PreferenceParser';
import { UnionPreferenceParser } from '../../../../../src/http/input/preferences/UnionPreferenceParser';
import { InternalServerError } from '../../../../../src/util/errors/InternalServerError';
describe('A UnionPreferenceParser', (): void => {
let parsers: jest.Mocked<PreferenceParser>[];
let parser: UnionPreferenceParser;
beforeEach(async(): Promise<void> => {
parsers = [
{
canHandle: jest.fn(),
handle: jest.fn().mockResolvedValue({}),
} satisfies Partial<PreferenceParser> as any,
{
canHandle: jest.fn(),
handle: jest.fn().mockResolvedValue({}),
} satisfies Partial<PreferenceParser> as any,
];
parser = new UnionPreferenceParser(parsers);
});
it('combines the outputs.', async(): Promise<void> => {
parsers[0].handle.mockResolvedValue({
type: { 'text/turtle': 1 },
range: { unit: 'bytes', parts: [{ start: 3, end: 5 }]},
});
parsers[1].handle.mockResolvedValue({
type: { 'text/plain': 0.9 },
language: { nl: 0.8 },
});
await expect(parser.handle({} as any)).resolves.toEqual({
type: { 'text/turtle': 1, 'text/plain': 0.9 },
language: { nl: 0.8 },
range: { unit: 'bytes', parts: [{ start: 3, end: 5 }]},
});
});
it('throws an error if multiple parsers return a range.', async(): Promise<void> => {
parsers[0].handle.mockResolvedValue({
type: { 'text/turtle': 1 },
range: { unit: 'bytes', parts: [{ start: 3, end: 5 }]},
});
parsers[1].handle.mockResolvedValue({
type: { 'text/plain': 0.9 },
language: { nl: 0.8 },
range: { unit: 'bytes', parts: [{ start: 3, end: 5 }]},
});
await expect(parser.handle({} as any)).rejects.toThrow(InternalServerError);
});
});