Files
directus/api/tests/utils/validate-keys.test.ts
ian 8f52fdf1f9 Validate type of items' primary keys (#13276)
* Validate type of items' primary keys

* Update tests

* Update validations

* Remove DB specific check for statusCode in existing e2e test

* Extract as util function

* Add unit test

* Refactor to generic validateKeys
2022-05-24 11:11:28 -04:00

108 lines
3.6 KiB
TypeScript

import { validateKeys } from '../../src/utils/validate-keys';
import { SchemaOverview } from '@directus/shared/types';
import { v4 as uuid } from 'uuid';
const schema: SchemaOverview = {
collections: {
pk_integer: {
collection: 'pk_integer',
primary: 'id',
singleton: false,
note: 'Sample schema with integer primary key',
sortField: null,
accountability: null,
fields: {
id: {
field: 'id',
defaultValue: null,
nullable: false,
generated: false,
type: 'integer',
dbType: 'integer',
precision: null,
scale: null,
special: [],
note: null,
alias: false,
validation: null,
},
},
},
pk_uuid: {
collection: 'pk_uuid',
primary: 'id',
singleton: false,
note: 'Sample schema with uuid primary key',
sortField: null,
accountability: null,
fields: {
id: {
field: 'id',
defaultValue: null,
nullable: false,
generated: false,
type: 'uuid',
dbType: 'uuid',
precision: null,
scale: null,
special: [],
note: null,
alias: false,
validation: null,
},
},
},
},
relations: [],
};
describe('validate keys', () => {
describe('of integer type', () => {
it('Throws an error when provided with an invalid integer key', () => {
expect(() => validateKeys(schema, 'pk_integer', 'id', 'invalid')).toThrowError();
expect(() => validateKeys(schema, 'pk_integer', 'id', NaN)).toThrowError();
});
it('Throws an error when provided with an array containing an invalid integer key', () => {
expect(() => validateKeys(schema, 'pk_integer', 'id', [111, 'invalid', 222])).toThrowError();
expect(() => validateKeys(schema, 'pk_integer', 'id', [555, NaN, 666])).toThrowError();
});
it('Does not throw an error when provided with a valid integer key', () => {
expect(() => validateKeys(schema, 'pk_integer', 'id', 111)).not.toThrowError();
expect(() => validateKeys(schema, 'pk_integer', 'id', '222')).not.toThrowError();
});
it('Does not throw an error when provided with an array of valid integer keys', () => {
expect(() => validateKeys(schema, 'pk_integer', 'id', [111, 222, 333])).not.toThrowError();
expect(() => validateKeys(schema, 'pk_integer', 'id', ['444', '555', '666'])).not.toThrowError();
});
});
describe('of uuid type', () => {
it('Throws an error when provided with an invalid uuid key', () => {
expect(() => validateKeys(schema, 'pk_uuid', 'id', 'fakeuuid-62d9-434d-a7c7-878c8376782e')).toThrowError();
expect(() => validateKeys(schema, 'pk_uuid', 'id', 'invalid')).toThrowError();
expect(() => validateKeys(schema, 'pk_uuid', 'id', NaN)).toThrowError();
expect(() => validateKeys(schema, 'pk_uuid', 'id', 111)).toThrowError();
});
it('Throws an error when provided with an array containing an invalid uuid key', () => {
expect(() =>
validateKeys(schema, 'pk_uuid', 'id', [uuid(), 'fakeuuid-62d9-434d-a7c7-878c8376782e', uuid()])
).toThrowError();
expect(() => validateKeys(schema, 'pk_uuid', 'id', [uuid(), 'invalid', uuid()])).toThrowError();
expect(() => validateKeys(schema, 'pk_uuid', 'id', [uuid(), NaN, uuid()])).toThrowError();
expect(() => validateKeys(schema, 'pk_uuid', 'id', [uuid(), 111, uuid()])).toThrowError();
});
it('Does not throw an error when provided with a valid uuid key', () => {
expect(() => validateKeys(schema, 'pk_uuid', 'id', uuid())).not.toThrowError();
});
it('Does not throw an error when provided with an array of valid uuid keys', () => {
expect(() => validateKeys(schema, 'pk_uuid', 'id', [uuid(), uuid(), uuid()])).not.toThrowError();
});
});
});