Files
directus/tests/config.ts
ian 443d3f6734 Add depth limit to filtering (#11845)
* Add depth limit to filtering

* Add depth limit to GraphQL

* Add docs

* Rename environment variable

* Add simple deep filter depth calculation

* Update error message

* Shift fields depth check to base function

* Remove unused var

* Implement GraphQL filter depth

* Add check for _and & _or filters in GraphQL

* Add check for _and & _or filters in REST

* Remove commented code

* Add check for REST filter query

* Add REST tests

* Setup m2m using directus fields

* Add GraphQL tests

* Fix linter error

* Cleanup calculateDepth + add docs/tests

* Remove validator in GraphQL

* Add depth checking for nested sort

* Enable source map to display correct error lines

* Set max relational depth to be at least 2

* Update tests

* Add unit test for deep _sort

* Add minimum value in docs

* Refactor depth validation to be in validateQuery

* Add boolean parameter for calculation of _sort in deep query

* Use array of keys to parse dot notation

Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>
2022-06-15 11:52:54 -04:00

250 lines
5.0 KiB
TypeScript

import { Knex } from 'knex';
import { promisify } from 'util';
import { allVendors } from './get-dbs-to-test';
type Vendor = typeof allVendors[number];
export type Config = {
knexConfig: Record<Vendor, Knex.Config & { waitTestSQL: string }>;
names: Record<Vendor, string>;
envs: Record<Vendor, Record<string, string>>;
};
const migrationsDir = './tests/setup/migrations';
const seedsDir = './tests/setup/seeds';
const knexConfig = {
waitTestSQL: 'SELECT 1',
migrations: {
directory: migrationsDir,
},
seeds: {
directory: seedsDir,
},
};
const directusConfig = {
...process.env,
ADMIN_EMAIL: 'admin@example.com',
ADMIN_PASSWORD: 'password',
KEY: 'directus-test',
SECRET: 'directus-test',
TELEMETRY: 'false',
CACHE_SCHEMA: 'false',
CACHE_ENABLED: 'false',
RATE_LIMITER_ENABLED: 'false',
LOG_LEVEL: 'error',
SERVE_APP: 'false',
DB_EXCLUDE_TABLES: 'knex_migrations,knex_migrations_lock,spatial_ref_sys,sysdiagrams',
MAX_RELATIONAL_DEPTH: '5',
};
const config: Config = {
knexConfig: {
postgres: {
client: 'pg',
connection: {
database: 'directus',
user: 'postgres',
password: 'secret',
host: 'localhost',
port: 6100,
},
...knexConfig,
},
postgres10: {
client: 'pg',
connection: {
database: 'directus',
user: 'postgres',
password: 'secret',
host: 'localhost',
port: 6101,
},
...knexConfig,
},
mysql: {
client: 'mysql',
connection: {
database: 'directus',
user: 'root',
password: 'secret',
host: 'localhost',
port: 6102,
},
...knexConfig,
},
maria: {
client: 'mysql',
connection: {
database: 'directus',
user: 'root',
password: 'secret',
host: 'localhost',
port: 6103,
},
...knexConfig,
},
mssql: {
client: 'mssql',
connection: {
database: 'model',
user: 'sa',
password: 'Test@123',
host: 'localhost',
port: 6104,
requestTimeout: 60000,
},
...knexConfig,
},
oracle: {
client: 'oracledb',
connection: {
user: 'secretsysuser',
password: 'secretpassword',
connectString: 'localhost:6105/XE',
},
...knexConfig,
waitTestSQL: 'SELECT 1 FROM DUAL',
},
cockroachdb: {
client: 'cockroachdb',
connection: {
database: 'defaultdb',
user: 'root',
password: '',
host: 'localhost',
port: 6106,
},
pool: {
afterCreate: async (conn: any, callback: any) => {
const run = promisify(conn.query.bind(conn));
await run('SET serial_normalization = "sql_sequence"');
await run('SET default_int_size = 4');
callback(null, conn);
},
},
...knexConfig,
},
sqlite3: {
client: 'sqlite3',
connection: {
filename: './test.db',
},
useNullAsDefault: true,
pool: {
afterCreate: async (conn: any, callback: any) => {
const run = promisify(conn.run.bind(conn));
await run('PRAGMA foreign_keys = ON');
callback(null, conn);
},
},
...knexConfig,
},
},
names: {
postgres: 'Postgres',
postgres10: 'Postgres (10)',
mysql: 'MySQL',
maria: 'MariaDB',
mssql: 'MS SQL Server',
oracle: 'OracleDB',
sqlite3: 'SQLite 3',
cockroachdb: 'CockroachDB',
},
envs: {
postgres: {
...directusConfig,
DB_CLIENT: 'pg',
DB_HOST: `localhost`,
DB_USER: 'postgres',
DB_PASSWORD: 'secret',
DB_PORT: '6100',
DB_DATABASE: 'directus',
PORT: '59152',
},
postgres10: {
...directusConfig,
DB_CLIENT: 'pg',
DB_HOST: `localhost`,
DB_USER: 'postgres',
DB_PASSWORD: 'secret',
DB_PORT: '6101',
DB_DATABASE: 'directus',
PORT: '59153',
},
mysql: {
...directusConfig,
DB_CLIENT: 'mysql',
DB_HOST: `localhost`,
DB_PORT: '6102',
DB_USER: 'root',
DB_PASSWORD: 'secret',
DB_DATABASE: 'directus',
PORT: '59154',
},
maria: {
...directusConfig,
DB_CLIENT: 'mysql',
DB_HOST: `localhost`,
DB_PORT: '6103',
DB_USER: 'root',
DB_PASSWORD: 'secret',
DB_DATABASE: 'directus',
PORT: '59155',
},
mssql: {
...directusConfig,
DB_CLIENT: 'mssql',
DB_HOST: `localhost`,
DB_PORT: '6104',
DB_USER: 'sa',
DB_PASSWORD: 'Test@123',
DB_DATABASE: 'model',
PORT: '59156',
},
oracle: {
...directusConfig,
DB_CLIENT: 'oracledb',
DB_USER: 'secretsysuser',
DB_PASSWORD: 'secretpassword',
DB_CONNECT_STRING: `localhost:6105/XE`,
PORT: '59157',
},
sqlite3: {
...directusConfig,
DB_CLIENT: 'sqlite3',
DB_FILENAME: './test.db',
PORT: '59158',
},
cockroachdb: {
...directusConfig,
DB_CLIENT: 'cockroachdb',
DB_HOST: `localhost`,
DB_USER: 'root',
DB_PASSWORD: '',
DB_PORT: '6106',
DB_DATABASE: 'defaultdb',
PORT: '59159',
},
},
};
const isWindows = ['win32', 'win64'].includes(process.platform);
for (const vendor of allVendors) {
config.envs[vendor]!.TZ = isWindows ? '0' : 'UTC';
}
export function getUrl(vendor: typeof allVendors[number]) {
let port = config.envs[vendor]!.PORT;
if (process.env.TEST_LOCAL) {
port = '8055';
}
return `http://localhost:${port}`;
}
export default config;