Files
directus/tests/api/collections.test.ts
ian 68066eccb7 Remove UTC conversion from date, time and datetime fields (#10956)
* Remove UTC conversion from date, time and datetime fields

* Fix mysql / maria timestamps when not in UTC timezone

* Add sequential tests with node timezone change

* Increase connection attempt check

* Add error catching in tests flow setup

* Check for server connectivity

* Fix promises

* Fix timestamp inconsistencies

* Revert to previously used parseISO

* Ensure database and directus connection

* Add another timezone to test positive and negative GMT

* Set local server hostname to localhost

* Add tests for SQLite

* Use notNullable primary key

* Revert connection testing sleep duration

* Fix nested transactions on SQLite

* Increase MSSQL request timeout

* Add type override flag for SQLite

* Remove commented code

* Add type override flags for Oracle

* Updated test file path

* Increase test servers launch timeout

* Increase test servers launch timeout

* Update format of tests

* Fix typo

* Increase test timeout for CockroachDB

* Add type overrides when creating fields through collections service

* Remove time field type conversion for Oracle

* Update collections list in test

* Remove check for time field in Oracle

* Add missing continue...

* Remove database override

* Add note for SQLite

* Rename flags and extract shared util

* Abstract remaining DB specific checks

* Revert flags renaming except renaming of test files

* Use date helper to add field flag

* Move field date typecasting upstream

* Use timestamp helper for date-created and date-updated

* Fix tests

* Remove unused vars

* Add tests for date-created

* Increase connection attempt count

* Fix test for mariadb

* Increase allowable difference to account for delays

* Add tests for date-updated

* Fix tests again for mariadb

* Add date helpers post merge

Co-authored-by: rijkvanzanten <rijkvanzanten@me.com>
2022-04-06 16:15:22 -04:00

156 lines
4.6 KiB
TypeScript

import request from 'supertest';
import vendors from '../get-dbs-to-test';
import config, { getUrl } from '../config';
import knex, { Knex } from 'knex';
import { Collection } from '@directus/shared/types';
const TABLES_AFTER_SEED = [
'artists',
'artists_events',
'events',
'guests',
'guests_events',
'organizers',
'tours',
'tours_components',
'schema_date_types',
'tests_flow_data',
'tests_flow_completed',
'directus_activity',
'directus_collections',
'directus_dashboards',
'directus_fields',
'directus_files',
'directus_folders',
'directus_migrations',
'directus_notifications',
'directus_panels',
'directus_permissions',
'directus_presets',
'directus_relations',
'directus_revisions',
'directus_roles',
'directus_sessions',
'directus_settings',
'directus_shares',
'directus_users',
'directus_webhooks',
];
describe('/collections', () => {
const databases = new Map<string, Knex>();
beforeAll(() => {
for (const vendor of vendors) {
databases.set(vendor, knex(config.knexConfig[vendor]!));
}
});
afterAll(() => {
for (const [_vendor, connection] of databases) {
connection.destroy();
}
});
describe.each(vendors)('%s', (vendor) => {
describe('GET /', () => {
test('Returns all tables for admin users', async () => {
const response = await request(getUrl(vendor))
.get('/collections')
.set('Authorization', 'Bearer AdminToken')
.expect(200);
const responseData = JSON.parse(response.text);
const tableNames = responseData.data.map((collection: Collection) => collection.collection).sort();
expect(responseData.data.length).toBe(TABLES_AFTER_SEED.length);
expect(tableNames).toEqual(TABLES_AFTER_SEED.sort());
});
});
describe('POST /', () => {
const TEST_COLLECTION_NAME = 'test_creation';
afterEach(async () => {
const db = databases.get(vendor)!;
await db.schema.dropTableIfExists(TEST_COLLECTION_NAME);
await db('directus_collections').del().where({ collection: TEST_COLLECTION_NAME });
});
test('Creates a new regular collection', async () => {
const db = databases.get(vendor)!;
const response = await request(getUrl(vendor))
.post('/collections')
.send({ collection: TEST_COLLECTION_NAME, meta: {}, schema: {} })
.set('Authorization', 'Bearer AdminToken')
.expect(200);
expect(response.body.data.collection).toBe(TEST_COLLECTION_NAME);
expect(response.body.data.meta.collection).toBe(TEST_COLLECTION_NAME);
expect(response.body.data.schema.name).toBe(TEST_COLLECTION_NAME);
expect(await db.schema.hasTable(TEST_COLLECTION_NAME)).toBe(true);
});
test('Creates a new folder', async () => {
const db = databases.get(vendor)!;
const response = await request(getUrl(vendor))
.post('/collections')
.send({ collection: TEST_COLLECTION_NAME, meta: {}, schema: null })
.set('Authorization', 'Bearer AdminToken')
.expect(200);
expect(response.body.data.collection).toBe(TEST_COLLECTION_NAME);
expect(response.body.data.schema).toBeNull();
expect(response.body.data.meta.collection).toBe(TEST_COLLECTION_NAME);
expect(await db.schema.hasTable(TEST_COLLECTION_NAME)).toBe(false);
});
});
describe('DELETE /', () => {
const TEST_COLLECTION_NAME = 'test_creation';
test('Deletes a regular collection', async () => {
const db = databases.get(vendor)!;
await request(getUrl(vendor))
.post('/collections')
.send({ collection: TEST_COLLECTION_NAME, meta: {}, schema: {} })
.set('Authorization', 'Bearer AdminToken')
.expect(200);
expect(await db.schema.hasTable(TEST_COLLECTION_NAME)).toBe(true);
const response = await request(getUrl(vendor))
.delete('/collections/' + TEST_COLLECTION_NAME)
.set('Authorization', 'Bearer AdminToken')
.expect(204);
expect(response.body).toEqual({});
expect(await db.schema.hasTable(TEST_COLLECTION_NAME)).toBe(false);
});
test('Deletes a folder', async () => {
const db = databases.get(vendor)!;
await request(getUrl(vendor))
.post('/collections')
.send({ collection: TEST_COLLECTION_NAME, meta: {}, schema: null })
.set('Authorization', 'Bearer AdminToken')
.expect(200);
expect(await db('directus_collections').select().where({ collection: TEST_COLLECTION_NAME })).toHaveLength(1);
const response = await request(getUrl(vendor))
.delete('/collections/' + TEST_COLLECTION_NAME)
.set('Authorization', 'Bearer AdminToken')
.expect(204);
expect(response.body).toEqual({});
expect(await db('directus_collections').select().where({ collection: TEST_COLLECTION_NAME })).toHaveLength(0);
});
});
});
});