mirror of
https://github.com/directus/directus.git
synced 2026-02-12 13:24:58 -05:00
* Update `@directus/api` deps (minor)
@aws-sdk/client-ses 3.292.0 → 3.316.0
@godaddy/terminus 4.11.2 → 4.12.0
@rollup/plugin-alias 4.0.3 → 4.0.4
@rollup/plugin-node-resolve 15.0.1 → 15.0.2
@types/node 18.15.3 → 18.15.11
@vitest/coverage-c8 0.29.3 → 0.30.1
axios 1.3.4 → 1.3.6
fs-extra 11.1.0 → 11.1.1
helmet 6.0.1 → 6.1.5
ioredis 5.3.1 → 5.3.2
joi 17.8.4 → 17.9.1
liquidjs 10.6.1 → 10.7.0
marked 4.2.12 → 4.3.0
nanoid 3.3.4 → 3.3.6
rollup 3.19.1 → 3.20.6
sharp 0.31.3 → 0.32.0
vitest 0.29.3 → 0.30.1
vm2 3.9.16 → 3.9.17
* Update `@directus/api` deps (major)
@rollup/plugin-alias 4.0.4 → 5.0.0
@types/inquirer 8.2.6 → 9.0.3
@types/node 18.15.11 → 18.15.12
camelcase 6.3.0 → 7.0.1
chalk 4.1.2 → 5.2.0
commander 9.5.0 → 10.0.1
execa 5.1.1 → 7.1.1
icc 2.0.0 → 3.0.0
inquirer 8.2.5 → 9.1.5
~ldapjs 2.3.3 → 3.0.2~
nanoid 3.3.6 → 4.0.2
~openapi3-ts 3.2.0 → 4.1.1~
ora 5.4.1 → 6.3.0
strip-bom-stream 4.0.0 → 5.0.0
tedious 15.1.3 → 16.0.0
typescript 4.9.5 → 5.0.4
* Update `@directus/app` deps
@babel/core 7.21.3 → 7.21.4
@babel/preset-env 7.20.2 → 7.21.4
@fortawesome/fontawesome-svg-core 6.3.0 → 6.4.0
@fortawesome/free-brands-svg-icons 6.3.0 → 6.4.0
@fullcalendar/core 6.1.4 → 6.1.5
@fullcalendar/daygrid 6.1.4 → 6.1.5
@fullcalendar/interaction 6.1.4 → 6.1.5
@fullcalendar/list 6.1.4 → 6.1.5
@fullcalendar/timegrid 6.1.4 → 6.1.5
@pinia/testing 0.0.15 → 0.0.16
@popperjs/core 2.11.6 → 2.11.7
@storybook/addon-actions 7.0.0-rc.4 → 7.0.6
@storybook/addon-backgrounds 7.0.0-rc.4 → 7.0.6
@storybook/addon-docs 7.0.0-rc.4 → 7.0.6
@storybook/addon-essentials 7.0.0-rc.4 → 7.0.6
@storybook/addon-links 7.0.0-rc.4 → 7.0.6
@storybook/addon-mdx-gfm 7.0.0-rc.4 → 7.0.6
@storybook/addon-measure 7.0.0-rc.4 → 7.0.6
@storybook/addon-outline 7.0.0-rc.4 → 7.0.6
@storybook/client-api 7.0.0-rc.4 → 7.0.6
@storybook/client-logger 7.0.0-rc.4 → 7.0.6
@storybook/vue3 7.0.0-rc.4 → 7.0.6
@storybook/vue3-vite 7.0.0-rc.4 → 7.0.6
@types/diff 5.0.2 → 5.0.3
@types/dompurify 3.0.0 → 3.0.2
@types/lodash 4.14.191 → 4.14.194
@vitejs/plugin-vue 4.0.0 → 4.1.0
@vue/test-utils 2.3.1 → 2.3.2
apexcharts 3.37.1 → 3.39.0
axios 1.3.4 → 1.3.6
dompurify 3.0.1 → 3.0.2
happy-dom 8.9.0 → 9.8.4
marked 4.2.12 → 4.3.0
nanoid 4.0.1 → 4.0.2
pinia 2.0.33 → 2.0.34
sass 1.59.3 → 1.62.0
storybook 7.0.0-rc.4 → 7.0.6
typescript 4.9.5 → 5.0.4
vite 4.1.4 → 4.2.2
vitest 0.29.3 → 0.30.1
webpack 5.76.2 → 5.80.0
* Update root deps
* Update `@directus/composables` deps
* Update `@directus/constant` deps
* Update `create-directus-extension` deps
* Update `@directus/exceptions` deps
* tsconfig workaround: ignoreDeprecations
* Update `@directus/extensions-sdk` deps
* Update `@directus/schema` deps
* Update `@directus/storage` deps
* Update `@directus/storage-driver-azure` deps
* Update `@directus/storage-driver-cloudinary` deps
* Update `@directus/storage-driver-gcs` deps
* Update `@directus/storage-driver-local` deps
* Update `@directus/storage-driver-s3` deps
* Update `@directus/types` deps
* Update `@directus/update-check` deps
* Update `@directus/utils` deps
* tsconfig workaround in schema: ignoreDeprecations
* tsconfig workaround in remaining packages: ignoreDeprecations
* Update `tests-blackbox` deps
* Revert "tsconfig workaround: ignoreDeprecations"
This reverts commit 5d97da55e3.
* Revert tsconfig override
* Update tsconfig
* Fix imports in @directus/utils
* Fix imports in composables
* Fix imports in extensions-sdk
* Fix imports in @directus/api
* Move RateLimiterAbstract to types import as well
* Bump pnpm to 8.3.1
* Update `docs` deps
> [...] the @vueuse/head package will be deprecated. If you're setting up this package on a new project, you should use the @unhead/vue package directly [...]
* Remove obselete dep `concurrently` from extensions-sdk
Co-authored-by: Azri Kahar <42867097+azrikahar@users.noreply.github.com>
* New day, new updates
Also forgot to include minor updates of deps in `tests-blackbox` in previous
commit
* Fix `api` tests
---------
Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>
Co-authored-by: Azri Kahar <42867097+azrikahar@users.noreply.github.com>
810 lines
22 KiB
TypeScript
810 lines
22 KiB
TypeScript
import type { FieldFilter } from '@directus/types';
|
|
import { escapeRegExp } from 'lodash-es';
|
|
import { describe, expect, it } from 'vitest';
|
|
import type { JoiOptions, StringSchema } from './generate-joi.js';
|
|
import { Joi, generateJoi } from './generate-joi.js';
|
|
|
|
describe(`generateJoi`, () => {
|
|
const date = new Date(1632431505992);
|
|
const compareDate = new Date(1632431605992);
|
|
|
|
it(`returns an error when no key is passed`, () => {
|
|
const mockFieldFilter = {} as FieldFilter;
|
|
const mockError = `[generateJoi] Filter doesn't contain field key. Passed filter: {}`;
|
|
|
|
expect(() => {
|
|
generateJoi(mockFieldFilter);
|
|
}).toThrowError(mockError);
|
|
});
|
|
|
|
it(`returns an error when no filter rule is passed`, () => {
|
|
const mockFieldFilter = { field: { eq: undefined } } as unknown as FieldFilter;
|
|
const mockError = `[generateJoi] Filter doesn't contain filter rule. Passed filter: {}`;
|
|
|
|
expect(() => {
|
|
generateJoi(mockFieldFilter);
|
|
}).toThrowError(mockError);
|
|
});
|
|
|
|
it(`returns an recursively goes through nested filters`, () => {
|
|
const mockFieldFilter = { field: { eq: { _eq: 'field' } } } as unknown as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.object({ eq: Joi.any().equal('field') }).unknown(),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema with an option of "requireAll" true`, () => {
|
|
const mockFieldFilter = { field: { _eq: 'field' } } as FieldFilter;
|
|
const mockOptions = { requireAll: true } as JoiOptions;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().equal('field').required(),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter, mockOptions).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _eq match`, () => {
|
|
const mockFieldFilter = { field: { _eq: 'field' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().equal('field'),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for a _neq match`, () => {
|
|
const mockFieldFilter = { field: { _neq: 'field' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().not('field'),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an integer _eq match`, () => {
|
|
const mockFieldFilter = { field: { _eq: '123' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().equal('123', 123),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an integer _neq match`, () => {
|
|
const mockFieldFilter = { field: { _neq: '123' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().not('123', 123),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for a float _eq match`, () => {
|
|
const mockFieldFilter = { field: { _eq: '123.456' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().equal('123.456', 123.456),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for a float _neq match`, () => {
|
|
const mockFieldFilter = { field: { _neq: '123.456' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().not('123.456', 123.456),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for a null _eq match`, () => {
|
|
const mockFieldFilter = { field: { _eq: null } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().equal(null),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for a null _neq match`, () => {
|
|
const mockFieldFilter = { field: { _neq: null } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().not(null),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an empty string _eq match`, () => {
|
|
const mockFieldFilter = { field: { _eq: '' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().equal(''),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an empty string _neq match`, () => {
|
|
const mockFieldFilter = { field: { _neq: '' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().not(''),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for a true _eq match`, () => {
|
|
const mockFieldFilter = { field: { _eq: true } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().equal(true),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for a true _neq match`, () => {
|
|
const mockFieldFilter = { field: { _neq: true } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().not(true),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for a false _eq match`, () => {
|
|
const mockFieldFilter = { field: { _eq: false } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().equal(false),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for a false _neq match`, () => {
|
|
const mockFieldFilter = { field: { _neq: false } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().not(false),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _ncontains contain match`, () => {
|
|
const mockFieldFilter = { field: { _ncontains: 'field' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: (Joi.string() as StringSchema).ncontains('field'),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _ncontains with null value`, () => {
|
|
const mockFieldFilter = { field: { _ncontains: null } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().equal(true),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _contains contain match`, () => {
|
|
const mockFieldFilter = { field: { _contains: 'field' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: (Joi.string() as StringSchema).contains('field'),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _contains with null value`, () => {
|
|
const mockFieldFilter = { field: { _contains: null } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().equal(true),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _icontains contain match`, () => {
|
|
const mockFieldFilter = { field: { _icontains: 'field' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: (Joi.string() as StringSchema).contains('field'),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _icontains with null value`, () => {
|
|
const mockFieldFilter = { field: { _icontains: null } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().equal(true),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns a value if the substring is included in the value`, () => {
|
|
expect(() => {
|
|
Joi.assert('testfield', (Joi.string() as StringSchema).contains('field'));
|
|
}).toEqual(expect.any(Function));
|
|
});
|
|
|
|
it(`returns a value if the substring is not contained in the value`, () => {
|
|
expect(() => {
|
|
Joi.assert('testfield', (Joi.string() as StringSchema).contains('field'));
|
|
}).toEqual(expect.any(Function));
|
|
});
|
|
|
|
it(`returns an error if the substring is included in the value`, () => {
|
|
expect(() => {
|
|
Joi.assert('field', (Joi.string() as StringSchema).ncontains('field'));
|
|
// eslint-disable-next-line no-useless-escape
|
|
}).toThrowError(`\"value\" can't contain [field]`);
|
|
});
|
|
|
|
it(`returns an error if the substring is not contained in the value`, () => {
|
|
expect(() => {
|
|
Joi.assert('test', (Joi.string() as StringSchema).contains('field'));
|
|
// eslint-disable-next-line no-useless-escape
|
|
}).toThrowError(`\"value\" must contain [field`);
|
|
});
|
|
|
|
it(`returns the correct schema for a _starts_with match`, () => {
|
|
const mockFieldFilter = { field: { _starts_with: 'field' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.string().pattern(new RegExp(`^${escapeRegExp('field')}.*`), {
|
|
name: 'starts_with',
|
|
}),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for a _starts_with with null value`, () => {
|
|
const mockFieldFilter = { field: { _starts_with: null } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().equal(true),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for a _nstarts_with with match`, () => {
|
|
const mockFieldFilter = { field: { _nstarts_with: 'field' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.string().pattern(new RegExp(`^${escapeRegExp('field')}.*`), {
|
|
name: 'starts_with',
|
|
invert: true,
|
|
}),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for a _nstarts_with with null value`, () => {
|
|
const mockFieldFilter = { field: { _nstarts_with: null } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().equal(true),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an ends_with match`, () => {
|
|
const mockFieldFilter = { field: { _ends_with: 'field' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.string().pattern(new RegExp(`.*field$`), {
|
|
name: 'ends_with',
|
|
}),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an ends_with with null value`, () => {
|
|
const mockFieldFilter = { field: { _ends_with: null } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().equal(true),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for a doesnt _nends_with match`, () => {
|
|
const mockFieldFilter = { field: { _nends_with: 'field' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.string().pattern(new RegExp(`.*field$`), {
|
|
name: 'ends_with',
|
|
invert: true,
|
|
}),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for a doesnt _nends_with with null value`, () => {
|
|
const mockFieldFilter = { field: { _nends_with: null } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().equal(true),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _in match`, () => {
|
|
const mockFieldFilter = { field: { _in: 'field' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().equal(...'field'),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _in number array match`, () => {
|
|
const mockFieldFilter = { field: { _in: [1] } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().equal(...[1]),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _in a string array match`, () => {
|
|
const mockFieldFilter = { field: { _in: ['field', 'secondField'] } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().equal(...['field', 'secondField']),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for a _nin match`, () => {
|
|
const mockFieldFilter = { field: { _nin: 'field' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().not(...'field'),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _nin number array match`, () => {
|
|
const mockFieldFilter = { field: { _nin: [1] } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().not(...[1]),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _nin a string array match`, () => {
|
|
const mockFieldFilter = { field: { _nin: ['field', 'secondField'] } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().not(...['field', 'secondField']),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _gt number match`, () => {
|
|
const mockFieldFilter = { field: { _gt: 1 } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.number().greater(1),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _gt date match`, () => {
|
|
const mockFieldFilter = { field: { _gt: date } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.date().greater(date),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _gt string match`, () => {
|
|
const mockFieldFilter = { field: { _gt: date.toISOString() } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.date().greater(date),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _gte number match`, () => {
|
|
const mockFieldFilter = { field: { _gte: 1 } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.number().min(1),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _gte date match`, () => {
|
|
const mockFieldFilter = { field: { _gte: date } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.date().min(date),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _gte string match`, () => {
|
|
const mockFieldFilter = { field: { _gte: date.toISOString() } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.date().min(date),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _lt number match`, () => {
|
|
const mockFieldFilter = { field: { _lt: 1 } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.number().less(1),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _lt date match`, () => {
|
|
const mockFieldFilter = { field: { _lt: date } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.date().less(date),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _lt string match`, () => {
|
|
const mockFieldFilter = { field: { _lt: date.toISOString() } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.date().less(date),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _lte number match`, () => {
|
|
const mockFieldFilter = { field: { _lte: 1 } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.number().max(1),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _lte date match`, () => {
|
|
const mockFieldFilter = { field: { _lte: date } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.date().max(date),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _lte string match`, () => {
|
|
const mockFieldFilter = { field: { _lte: date.toISOString() } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.date().max(date),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _null match`, () => {
|
|
const mockFieldFilter = { field: { _null: null } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().valid(null),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _nnull match`, () => {
|
|
const mockFieldFilter = { field: { _nnull: null } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().invalid(null),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _empty match`, () => {
|
|
const mockFieldFilter = { field: { _empty: '' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().valid(''),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _nempty match`, () => {
|
|
const mockFieldFilter = { field: { _nempty: '' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().invalid(''),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _between number match`, () => {
|
|
const mockFieldFilter = { field: { _between: [1, 3] } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.number().min(1).max(3),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _between float match`, () => {
|
|
const mockFieldFilter = { field: { _between: [1.111, 3.333] } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.number().min(1.111).max(3.333),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _between date match`, () => {
|
|
const mockFieldFilter = { field: { _between: [date, compareDate] } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.date().min(date).max(compareDate),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _nbetween number match`, () => {
|
|
const mockFieldFilter = { field: { _nbetween: [1, 3] } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.number().less(1).greater(3),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _nbetween float match`, () => {
|
|
const mockFieldFilter = { field: { _nbetween: [1.111, 3.333] } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.number().less(1.111).greater(3.333),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _nbetween date match`, () => {
|
|
const mockFieldFilter = { field: { _nbetween: [date, compareDate] } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.date().less(date).greater(compareDate),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _submitted match`, () => {
|
|
const mockFieldFilter = { field: { _submitted: '' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().required(),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _regex match when wrapped`, () => {
|
|
const mockFieldFilter = { field: { _regex: '/.*field$/' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.string().regex(new RegExp(`.*field$`)),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _regex match when unwrapped`, () => {
|
|
const mockFieldFilter = { field: { _regex: '.*field$' } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.string().regex(new RegExp(`.*field$`)),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
|
|
it(`returns the correct schema for an _regex match with null value`, () => {
|
|
const mockFieldFilter = { field: { _regex: null } } as FieldFilter;
|
|
|
|
const mockSchema = Joi.object({
|
|
field: Joi.any().equal(true),
|
|
})
|
|
.unknown()
|
|
.describe();
|
|
|
|
expect(generateJoi(mockFieldFilter).describe()).toStrictEqual(mockSchema);
|
|
});
|
|
});
|