Files
directus/tests-blackbox/routes/fields/change-fields.seed.ts
ian adff255d91 Skip checking of virtual alias fields (#16320)
* Default virtual fields as alias type

* Make the condition more verbose instead of defaulting

* Remove unnecessary optional chaining

* Add tests

* Revert to alias defaulting in #d06d62

* Shift condition up
2022-11-08 15:49:49 -08:00

207 lines
5.2 KiB
TypeScript

import vendors from '@common/get-dbs-to-test';
import {
CreateCollection,
CreateField,
CreateFieldO2M,
CreateItem,
DeleteCollection,
SeedFunctions,
PrimaryKeyType,
PRIMARY_KEY_TYPES,
} from '@common/index';
import { CachedTestsSchema, TestsSchema, TestsSchemaVendorValues } from '@query/filter';
import { set } from 'lodash';
export const collectionCountries = 'test_fields_change_field_countries';
export const collectionStates = 'test_fields_change_field_states';
export type Country = {
id?: number | string;
name: string;
};
export type State = {
id?: number | string;
name: string;
country_id?: number | string | null;
};
export type City = {
id?: number | string;
name: string;
state_id?: number | string | null;
};
export function getTestsSchema(pkType: PrimaryKeyType, seed?: string): TestsSchema {
const schema: TestsSchema = {
[`${collectionCountries}_${pkType}`]: {
id: {
field: 'id',
type: pkType,
isPrimaryKey: true,
filters: true,
possibleValues: SeedFunctions.generatePrimaryKeys(pkType, {
quantity: 2,
seed: `${collectionCountries}${seed}`,
incremental: true,
}),
},
name: {
field: 'name',
type: 'string',
filters: true,
possibleValues: ['United States', 'Malaysia'],
},
},
};
schema[`${collectionStates}_${pkType}`] = {
id: {
field: 'id',
type: pkType,
isPrimaryKey: true,
filters: false,
possibleValues: SeedFunctions.generatePrimaryKeys(pkType, {
quantity: 4,
seed: `${collectionStates}${seed}`,
incremental: true,
}),
},
name: {
field: 'name',
type: 'string',
filters: false,
possibleValues: ['Washington', 'California', 'Johor', 'Sarawak'],
},
};
schema[`${collectionCountries}_${pkType}`]['states'] = {
field: 'states',
type: 'alias',
filters: false,
possibleValues: schema[`${collectionStates}_${pkType}`].id.possibleValues,
children: schema[`${collectionStates}_${pkType}`],
relatedCollection: `${collectionStates}_${pkType}`,
};
return schema;
}
export const seedDBStructure = () => {
it.each(vendors)(
'%s',
async (vendor) => {
for (const pkType of PRIMARY_KEY_TYPES) {
try {
const localCollectionCountries = `${collectionCountries}_${pkType}`;
const localCollectionStates = `${collectionStates}_${pkType}`;
// Delete existing collections
await DeleteCollection(vendor, { collection: localCollectionStates });
await DeleteCollection(vendor, { collection: localCollectionCountries });
// Create countries collection
await CreateCollection(vendor, {
collection: localCollectionCountries,
primaryKeyType: pkType,
});
await CreateField(vendor, {
collection: localCollectionCountries,
field: 'name',
type: 'string',
});
// Create states collection
await CreateCollection(vendor, {
collection: localCollectionStates,
primaryKeyType: pkType,
});
await CreateField(vendor, {
collection: localCollectionStates,
field: 'name',
type: 'string',
});
// Create O2M relationships
await CreateFieldO2M(vendor, {
collection: localCollectionCountries,
field: 'states',
otherCollection: localCollectionStates,
otherField: 'country_id',
primaryKeyType: pkType,
});
expect(true).toBeTruthy();
} catch (error) {
expect(error).toBeFalsy();
}
}
},
300000
);
};
export const seedDBValues = async (cachedSchema: CachedTestsSchema, vendorSchemaValues: TestsSchemaVendorValues) => {
await Promise.all(
vendors.map(async (vendor) => {
for (const pkType of PRIMARY_KEY_TYPES) {
const schema = cachedSchema[pkType];
const localCollectionCountries = `${collectionCountries}_${pkType}`;
const localCollectionStates = `${collectionStates}_${pkType}`;
// Create countries
const itemCountries = [];
for (let i = 0; i < schema[localCollectionCountries].id.possibleValues.length; i++) {
const country: Country = {
name: schema[localCollectionCountries].name.possibleValues[i],
};
if (pkType === 'string') {
country.id = schema[localCollectionCountries].id.possibleValues[i];
}
itemCountries.push(country);
}
const countries = await CreateItem(vendor, {
collection: localCollectionCountries,
item: itemCountries,
});
const countriesIDs = countries.map((country: Country) => country.id);
set(vendorSchemaValues, `${vendor}.${localCollectionCountries}.id`, countriesIDs);
// Create states
const itemStates = [];
for (let i = 0; i < schema[localCollectionStates].id.possibleValues.length; i++) {
const state: State = {
name: schema[localCollectionStates].name.possibleValues[i],
country_id: countriesIDs[i % countriesIDs.length],
};
if (pkType === 'string') {
state.id = schema[localCollectionStates].id.possibleValues[i];
}
itemStates.push(state);
}
const states = await CreateItem(vendor, {
collection: localCollectionStates,
item: itemStates,
});
const statesIDs = states.map((state: State) => state.id);
set(vendorSchemaValues, `${vendor}.${localCollectionStates}.id`, statesIDs);
}
})
);
};