mirror of
https://github.com/directus/directus.git
synced 2026-04-25 03:00:53 -04:00
265 lines
6.5 KiB
TypeScript
265 lines
6.5 KiB
TypeScript
import knex, { Knex } from 'knex';
|
|
import { MockClient, Tracker, getTracker } from 'knex-mock-client';
|
|
import { PayloadService } from '../../src/services';
|
|
import { getHelpers, Helpers } from '../../src/database/helpers';
|
|
import { describe, beforeAll, afterEach, it, expect, vi, beforeEach, MockedFunction } from 'vitest';
|
|
|
|
vi.mock('../../src/database/index', () => ({
|
|
getDatabaseClient: vi.fn().mockReturnValue('postgres'),
|
|
}));
|
|
|
|
describe('Integration Tests', () => {
|
|
let db: MockedFunction<Knex>;
|
|
let tracker: Tracker;
|
|
|
|
beforeAll(async () => {
|
|
db = vi.mocked(knex({ client: MockClient }));
|
|
tracker = getTracker();
|
|
});
|
|
|
|
afterEach(() => {
|
|
tracker.reset();
|
|
});
|
|
|
|
describe('Services / PayloadService', () => {
|
|
describe('transformers', () => {
|
|
let service: PayloadService;
|
|
let helpers: Helpers;
|
|
|
|
beforeEach(() => {
|
|
service = new PayloadService('test', {
|
|
knex: db,
|
|
schema: { collections: {}, relations: [] },
|
|
});
|
|
helpers = getHelpers(db);
|
|
});
|
|
|
|
describe('csv', () => {
|
|
it('Returns undefined for illegal values', async () => {
|
|
const result = await service.transformers['cast-csv']({
|
|
value: 123,
|
|
action: 'read',
|
|
payload: {},
|
|
accountability: { role: null },
|
|
specials: [],
|
|
helpers,
|
|
});
|
|
|
|
expect(result).toBe(undefined);
|
|
});
|
|
|
|
it('Returns [] for empty strings', async () => {
|
|
const result = await service.transformers['cast-csv']({
|
|
value: '',
|
|
action: 'read',
|
|
payload: {},
|
|
accountability: { role: null },
|
|
specials: [],
|
|
helpers,
|
|
});
|
|
|
|
expect(result).toMatchObject([]);
|
|
});
|
|
|
|
it('Returns array values as is', async () => {
|
|
const result = await service.transformers['cast-csv']({
|
|
value: ['test', 'directus'],
|
|
action: 'read',
|
|
payload: {},
|
|
accountability: { role: null },
|
|
specials: [],
|
|
helpers,
|
|
});
|
|
|
|
expect(result).toEqual(['test', 'directus']);
|
|
});
|
|
|
|
it('Splits the CSV string', async () => {
|
|
const result = await service.transformers['cast-csv']({
|
|
value: 'test,directus',
|
|
action: 'read',
|
|
payload: {},
|
|
accountability: { role: null },
|
|
specials: [],
|
|
helpers,
|
|
});
|
|
|
|
expect(result).toMatchObject(['test', 'directus']);
|
|
});
|
|
|
|
it('Saves array values as joined string', async () => {
|
|
const result = await service.transformers['cast-csv']({
|
|
value: ['test', 'directus'],
|
|
action: 'create',
|
|
payload: {},
|
|
accountability: { role: null },
|
|
specials: [],
|
|
helpers,
|
|
});
|
|
|
|
expect(result).toBe('test,directus');
|
|
});
|
|
|
|
it('Saves string values as is', async () => {
|
|
const result = await service.transformers['cast-csv']({
|
|
value: 'test,directus',
|
|
action: 'create',
|
|
payload: {},
|
|
accountability: { role: null },
|
|
specials: [],
|
|
helpers,
|
|
});
|
|
|
|
expect(result).toBe('test,directus');
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('processDates', () => {
|
|
let service: PayloadService;
|
|
|
|
const dateFieldId = 'date_field';
|
|
const dateTimeFieldId = 'datetime_field';
|
|
const timestampFieldId = 'timestamp_field';
|
|
|
|
beforeEach(() => {
|
|
service = new PayloadService('test', {
|
|
knex: db,
|
|
schema: {
|
|
collections: {
|
|
test: {
|
|
collection: 'test',
|
|
primary: 'id',
|
|
singleton: false,
|
|
sortField: null,
|
|
note: null,
|
|
accountability: null,
|
|
fields: {
|
|
[dateFieldId]: {
|
|
field: dateFieldId,
|
|
defaultValue: null,
|
|
nullable: true,
|
|
generated: false,
|
|
type: 'date',
|
|
dbType: 'date',
|
|
precision: null,
|
|
scale: null,
|
|
special: [],
|
|
note: null,
|
|
validation: null,
|
|
alias: false,
|
|
},
|
|
[dateTimeFieldId]: {
|
|
field: dateTimeFieldId,
|
|
defaultValue: null,
|
|
nullable: true,
|
|
generated: false,
|
|
type: 'dateTime',
|
|
dbType: 'datetime',
|
|
precision: null,
|
|
scale: null,
|
|
special: [],
|
|
note: null,
|
|
validation: null,
|
|
alias: false,
|
|
},
|
|
[timestampFieldId]: {
|
|
field: timestampFieldId,
|
|
defaultValue: null,
|
|
nullable: true,
|
|
generated: false,
|
|
type: 'timestamp',
|
|
dbType: 'timestamp',
|
|
precision: null,
|
|
scale: null,
|
|
special: [],
|
|
note: null,
|
|
validation: null,
|
|
alias: false,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
relations: [],
|
|
},
|
|
});
|
|
});
|
|
|
|
describe('processes dates', () => {
|
|
it('with zero values', () => {
|
|
const result = service.processDates(
|
|
[
|
|
{
|
|
[dateFieldId]: '0000-00-00',
|
|
[dateTimeFieldId]: '0000-00-00 00:00:00',
|
|
[timestampFieldId]: '0000-00-00 00:00:00.000',
|
|
},
|
|
],
|
|
'read'
|
|
);
|
|
|
|
expect(result).toMatchObject([
|
|
{
|
|
[dateFieldId]: null,
|
|
[dateTimeFieldId]: null,
|
|
[timestampFieldId]: null,
|
|
},
|
|
]);
|
|
});
|
|
|
|
it('with typical values', () => {
|
|
const result = service.processDates(
|
|
[
|
|
{
|
|
[dateFieldId]: '2022-01-10',
|
|
[dateTimeFieldId]: '2021-09-31 12:34:56',
|
|
[timestampFieldId]: '1980-12-08 00:11:22.333',
|
|
},
|
|
],
|
|
'read'
|
|
);
|
|
expect(result).toMatchObject([
|
|
{
|
|
[dateFieldId]: '2022-01-10',
|
|
[dateTimeFieldId]: '2021-10-01T12:34:56',
|
|
[timestampFieldId]: new Date('1980-12-08 00:11:22.333').toISOString(),
|
|
},
|
|
]);
|
|
});
|
|
|
|
it('with date object values', () => {
|
|
const result = service.processDates(
|
|
[
|
|
{
|
|
[dateFieldId]: new Date(1666777777000),
|
|
[dateTimeFieldId]: new Date(1666666666000),
|
|
[timestampFieldId]: new Date(1666555444333),
|
|
},
|
|
],
|
|
'read'
|
|
);
|
|
|
|
expect(result).toMatchObject([
|
|
{
|
|
[dateFieldId]: toLocalISOString(new Date(1666777777000)).slice(0, 10),
|
|
[dateTimeFieldId]: toLocalISOString(new Date(1666666666000)),
|
|
[timestampFieldId]: new Date(1666555444333).toISOString(),
|
|
},
|
|
]);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
function toLocalISOString(date: Date) {
|
|
const year = String(date.getFullYear());
|
|
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
const day = String(date.getDate()).padStart(2, '0');
|
|
const hours = String(date.getHours()).padStart(2, '0');
|
|
const minutes = String(date.getMinutes()).padStart(2, '0');
|
|
const seconds = String(date.getSeconds()).padStart(2, '0');
|
|
|
|
return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`;
|
|
}
|