2020-02-03 10:24:25 +01:00
|
|
|
import { generateSchema } from "../src/indexing/indexSchemaCreator"
|
|
|
|
import { setupApphierarchy } from "./specHelpers"
|
|
|
|
import { find } from "lodash"
|
|
|
|
import { indexTypes } from "../src/templateApi/indexes"
|
2019-07-15 08:12:52 +02:00
|
|
|
|
|
|
|
describe("indexSchemGenerator", () => {
|
2020-02-03 10:24:25 +01:00
|
|
|
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)
|
|
|
|
})
|
|
|
|
})
|
2019-07-15 08:12:52 +02:00
|
|
|
|
|
|
|
const schemaHasFieldOfType = (schema, fieldname, type) => {
|
2020-02-03 10:24:25 +01:00
|
|
|
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)
|
2019-07-15 08:12:52 +02:00
|
|
|
}
|
|
|
|
|
2020-02-03 10:24:25 +01:00
|
|
|
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",
|
2019-07-15 08:12:52 +02:00
|
|
|
})
|
2020-02-03 10:24:25 +01:00
|
|
|
fishStuff.favFishField = favFishField
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
dogRecord,
|
|
|
|
petsIndex,
|
|
|
|
root,
|
|
|
|
...fishStuff,
|
|
|
|
}
|
|
|
|
}
|