Files
directus/api/src/services/payload.test.ts
2022-11-15 17:20:45 -05:00

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}`;
}