133 lines
5.5 KiB
JavaScript
133 lines
5.5 KiB
JavaScript
|
import {generateSchema} from "../src/indexing/indexSchemaCreator";
|
||
|
import {setupApphierarchy, findCollectionDefaultIndex} from "./specHelpers";
|
||
|
import {find} from "lodash";
|
||
|
import {indexTypes} from "../src/templateApi/indexes";
|
||
|
|
||
|
describe("indexSchemGenerator", () => {
|
||
|
|
||
|
it("should return mapped columns of single type, when accepts all in collection of one type", async () => {
|
||
|
const {appHierarchy} = await setup(false);
|
||
|
const schema = generateSchema(appHierarchy.root, appHierarchy.petsIndex);
|
||
|
schemaHasFieldOfType(schema, "key", "string");
|
||
|
schemaHasFieldOfType(schema, "sortKey", "string");
|
||
|
schemaHasFieldOfType(schema, "id", "string");
|
||
|
schemaHasFieldOfType(schema, "type", "string");
|
||
|
schemaHasFieldOfType(schema, "isNew", "bool");
|
||
|
schemaHasFieldOfType(schema, "name", "string");
|
||
|
schemaHasFieldOfType(schema, "dob", "datetime");
|
||
|
schemaHasFieldOfType(schema, "isAlive", "bool");
|
||
|
expect(schema.length).toBe(8);
|
||
|
});
|
||
|
|
||
|
it("should return mapped columns of two types, when accepts all in collection or two typs", async () => {
|
||
|
const {appHierarchy} = await setup(true);
|
||
|
const schema = generateSchema(appHierarchy.root, appHierarchy.petsIndex);
|
||
|
schemaHasFieldOfType(schema, "key", "string");
|
||
|
schemaHasFieldOfType(schema, "sortKey", "string");
|
||
|
schemaHasFieldOfType(schema, "id", "string");
|
||
|
schemaHasFieldOfType(schema, "type", "string");
|
||
|
schemaHasFieldOfType(schema, "isNew", "bool");
|
||
|
schemaHasFieldOfType(schema, "name", "string");
|
||
|
schemaHasFieldOfType(schema, "dob", "datetime");
|
||
|
schemaHasFieldOfType(schema, "isAlive", "bool");
|
||
|
schemaHasFieldOfType(schema, "noOfGills", "number");
|
||
|
schemaHasFieldOfType(schema, "favouriteFish", "reference");
|
||
|
expect(schema.length).toBe(10);
|
||
|
});
|
||
|
|
||
|
it("should return mapped columns of one types, when accepts only onw of two types", async () => {
|
||
|
const {appHierarchy} = await setup(true);
|
||
|
const schema = generateSchema(appHierarchy.root, appHierarchy.fishOnlyIndex);
|
||
|
schemaHasFieldOfType(schema, "key", "string");
|
||
|
schemaHasFieldOfType(schema, "sortKey", "string");
|
||
|
schemaHasFieldOfType(schema, "id", "string");
|
||
|
schemaHasFieldOfType(schema, "type", "string");
|
||
|
schemaHasFieldOfType(schema, "isNew", "bool");
|
||
|
schemaHasFieldOfType(schema, "name", "string");
|
||
|
schemaHasFieldOfType(schema, "isAlive", "bool");
|
||
|
schemaHasFieldOfType(schema, "noOfGills", "number");
|
||
|
expect(schema.length).toBe(8);
|
||
|
});
|
||
|
|
||
|
it("should return mapped columns type, for reverse reference index", async () => {
|
||
|
const {appHierarchy} = await setup(true);
|
||
|
const schema = generateSchema(appHierarchy.root, appHierarchy.dogFriends);
|
||
|
schemaHasFieldOfType(schema, "key", "string");
|
||
|
schemaHasFieldOfType(schema, "sortKey", "string");
|
||
|
schemaHasFieldOfType(schema, "id", "string");
|
||
|
schemaHasFieldOfType(schema, "type", "string");
|
||
|
schemaHasFieldOfType(schema, "isNew", "bool");
|
||
|
schemaHasFieldOfType(schema, "name", "string");
|
||
|
schemaHasFieldOfType(schema, "isAlive", "bool");
|
||
|
schemaHasFieldOfType(schema, "dob", "datetime");
|
||
|
schemaHasFieldOfType(schema, "favouriteFish", "reference");
|
||
|
expect(schema.length).toBe(9);
|
||
|
});
|
||
|
|
||
|
});
|
||
|
|
||
|
const schemaHasFieldOfType = (schema, fieldname, type) => {
|
||
|
const field = find(schema, f => f.name === fieldname);
|
||
|
const fname = !field ? "field not found" : field.name;
|
||
|
expect(fname).toBe(fieldname);
|
||
|
expect(field.type).toBe(type);
|
||
|
}
|
||
|
|
||
|
const setup = includeFish =>
|
||
|
setupApphierarchy(createApp(includeFish));
|
||
|
|
||
|
const createApp = (includeFish) => (templateApi) => {
|
||
|
|
||
|
const root = templateApi.getNewRootLevel();
|
||
|
|
||
|
const dogRecord = templateApi.getNewRecordTemplate(root, "dog");
|
||
|
|
||
|
const addField = (recordNode) => (name, type, typeOptions) => {
|
||
|
const field = templateApi.getNewField(type);
|
||
|
field.name = name;
|
||
|
if(typeOptions) field.typeOptions = typeOptions;
|
||
|
templateApi.addField(recordNode, field);
|
||
|
return field;
|
||
|
};
|
||
|
|
||
|
const petsIndex = templateApi.getNewIndexTemplate(root);
|
||
|
petsIndex.name = "allPets";
|
||
|
petsIndex.allowedRecordNodeIds = [dogRecord.nodeId];
|
||
|
|
||
|
const addDogField = addField(dogRecord);
|
||
|
addDogField("name", "string");
|
||
|
addDogField("dob", "datetime");
|
||
|
addDogField("isAlive", "bool");
|
||
|
|
||
|
let fishStuff = {};
|
||
|
if(includeFish) {
|
||
|
const fishRecord = templateApi.getNewRecordTemplate(root, "fish");
|
||
|
const addFishField = addField(fishRecord);
|
||
|
addFishField("name", "string");
|
||
|
addFishField("isAlive", "bool");
|
||
|
addFishField("noOfGills", "number");
|
||
|
fishStuff.fishRecord = fishRecord;
|
||
|
const fishOnlyIndex = templateApi.getNewIndexTemplate(root);
|
||
|
fishOnlyIndex.name = "fishOnly";
|
||
|
fishOnlyIndex.allowedRecordNodeIds = [fishRecord.nodeId];
|
||
|
fishStuff.fishOnlyIndex = fishOnlyIndex;
|
||
|
|
||
|
const dogFriends = templateApi.getNewIndexTemplate(dogRecord, indexTypes.reference);
|
||
|
dogFriends.name = "dogFriends";
|
||
|
fishStuff.dogFriends = dogFriends;
|
||
|
|
||
|
petsIndex.allowedRecordNodeIds.push(fishRecord.nodeId);
|
||
|
|
||
|
const favFishField = addDogField("favouriteFish", "reference", {
|
||
|
indexNodeKey : fishOnlyIndex.nodeKey(),
|
||
|
reverseIndexNodeKeys : [dogFriends.nodeKey()],
|
||
|
displayValue : "name"
|
||
|
});
|
||
|
fishStuff.favFishField = favFishField;
|
||
|
}
|
||
|
|
||
|
return ({
|
||
|
dogRecord, petsIndex, root, ...fishStuff
|
||
|
})
|
||
|
};
|