@whook/whook
Version:
Build strong and efficient REST web services.
217 lines (201 loc) • 5.96 kB
text/typescript
import {
describe,
test,
beforeAll,
beforeEach,
jest,
expect,
} from '@jest/globals';
import { type LogService } from 'common-services';
import initSchemaValidators, {
WhookSchemaValidatorsService,
} from './schemaValidators.js';
import { NodeEnv } from 'application-services';
import { OpenAPI } from 'ya-open-api-types';
const API: OpenAPI = {
openapi: '3.1',
info: {
title: 'Test',
version: '0.0.0',
},
paths: {
'/test': {
description: 'Test',
get: {
operationId: 'test',
parameters: [
{
$ref: '#/components/parameters/TestParameterAlias',
},
],
},
},
},
components: {
parameters: {
TestParameter: {
name: 'test',
in: 'query',
schema: {
$ref: '#/components/schemas/TestSchema',
},
},
TestParameterAlias: {
$ref: '#/components/parameters/TestParameter',
},
},
schemas: {
TestSchema: {
type: 'string',
},
},
},
};
const referringSchema = {
type: 'array',
items: {
$ref: '#/components/schemas/TestSchema',
},
};
describe('Validators service', () => {
const log = jest.fn<LogService>();
let schemaValidators: WhookSchemaValidatorsService;
describe('with defaults', () => {
beforeAll(async () => {
schemaValidators = await initSchemaValidators({
ENV: {
NODE_ENV: NodeEnv.Test,
},
DEBUG_NODE_ENVS: ['test'],
API,
log,
});
});
beforeEach(async () => {
log.mockReset();
});
describe('should work', () => {
test('with booleans', () => {
expect(schemaValidators(true)).toBeDefined();
expect(schemaValidators(false)).toBeDefined();
expect(schemaValidators(false) === schemaValidators(false)).toBe(true);
expect(schemaValidators(true) === schemaValidators(true)).toBe(true);
});
test('with $ref', () => {
expect(
schemaValidators({
$ref: '#/components/schemas/TestSchema',
}),
).toBeDefined();
expect(
schemaValidators({
$ref: '#/components/schemas/TestSchema',
}) ===
schemaValidators({
$ref: '#/components/schemas/TestSchema',
}),
).toBe(true);
expect(
schemaValidators({
$ref: '#/components/schemas/TestSchema',
})('test'),
).toMatchInlineSnapshot(`true`);
expect(
schemaValidators({
$ref: '#/components/schemas/TestSchema',
})(12434),
).toMatchInlineSnapshot(`false`);
});
test('with raw schemas', () => {
expect(schemaValidators({ type: 'number' })).toBeDefined();
expect(
schemaValidators({ type: 'number' }) !==
schemaValidators({ type: 'number' }),
).toBe(true);
expect(schemaValidators({ type: 'number' })(1234)).toBe(true);
expect(schemaValidators({ type: 'number' })('1234')).toBe(false);
});
test('with raw schemas referring to openapi ones', () => {
expect(schemaValidators(referringSchema)).toBeDefined();
expect(
schemaValidators(referringSchema) ===
schemaValidators(referringSchema),
).toBe(true);
expect(schemaValidators(referringSchema)(['1234'])).toBe(true);
expect(schemaValidators(referringSchema)([1234])).toBe(false);
});
});
});
describe('with optimistic set to false and lazy set to true', () => {
beforeAll(async () => {
schemaValidators = await initSchemaValidators({
ENV: {
NODE_ENV: NodeEnv.Test,
},
DEBUG_NODE_ENVS: ['test'],
SCHEMA_VALIDATORS_OPTIONS: {
lazy: true,
dedupe: true,
hashLength: 16,
buildSchemas: false,
},
API,
log,
});
});
beforeEach(async () => {
log.mockReset();
});
describe('should work', () => {
test('with booleans', () => {
expect(schemaValidators(true)).toBeDefined();
expect(schemaValidators(false)).toBeDefined();
expect(schemaValidators(false) === schemaValidators(false)).toBe(true);
expect(schemaValidators(true) === schemaValidators(true)).toBe(true);
});
test('with $ref', () => {
expect(
schemaValidators({
$ref: '#/components/schemas/TestSchema',
}),
).toBeDefined();
expect(
schemaValidators({
$ref: '#/components/schemas/TestSchema',
}) ===
schemaValidators({
$ref: '#/components/schemas/TestSchema',
}),
).toBe(true);
expect(
schemaValidators({
$ref: '#/components/schemas/TestSchema',
})('test'),
).toMatchInlineSnapshot(`true`);
expect(
schemaValidators({
$ref: '#/components/schemas/TestSchema',
})(12434),
).toMatchInlineSnapshot(`false`);
});
test('with raw schemas', () => {
expect(schemaValidators({ type: 'number' })).toBeDefined();
expect(
schemaValidators({ type: 'number' }) ===
schemaValidators({ type: 'number' }),
).toBe(true);
expect(schemaValidators({ type: 'number' })(1234)).toBe(true);
expect(schemaValidators({ type: 'number' })('1234')).toBe(false);
});
test('with raw schemas referring to openapi ones', () => {
expect(schemaValidators(referringSchema)).toBeDefined();
expect(
schemaValidators(referringSchema) ===
schemaValidators(referringSchema),
).toBe(true);
expect(schemaValidators(referringSchema)(['1234'])).toBe(true);
expect(schemaValidators(referringSchema)([1234])).toBe(false);
});
});
});
});