1
0
Fork 0
mirror of synced 2024-07-08 15:56:23 +12:00
budibase/packages/common/test/templateApi.types.spec.js
2020-04-15 15:24:24 +01:00

286 lines
9.2 KiB
JavaScript

import { getNewFieldValue, safeParseField } from "../src/types"
import { getNewField } from "../src/templateApi/fields"
import { isDefined } from "../src/common"
const getField = type => {
const field = getNewField(type)
return field
}
const nothingReference = { key: "" }
const nothingFile = { relativePath: "", size: 0 }
describe("types > getNew", () => {
const defaultAlwaysNull = type => () => {
const field = getField(type)
field.getInitialValue = "default"
const value = getNewFieldValue(field)
expect(value).toBe(null)
}
it(
"bool should return null when fields getInitialValue is 'default'",
defaultAlwaysNull("bool")
)
it(
"string should return null when fields getInitialValue is 'default'",
defaultAlwaysNull("string")
)
it(
"number should return null when fields getInitialValue is 'default'",
defaultAlwaysNull("number")
)
it(
"datetime should return null when fields getInitialValue is 'default'",
defaultAlwaysNull("datetime")
)
it("reference should return {key:''} when fields getInitialValue is 'default'", () => {
const field = getField("reference")
field.getInitialValue = "default"
const value = getNewFieldValue(field)
expect(value).toEqual(nothingReference)
})
it("file should return {relativePath:'', size:0} when fields getInitialValue is 'default'", () => {
const field = getField("file")
field.getInitialValue = "default"
const value = getNewFieldValue(field)
expect(value).toEqual(nothingFile)
})
it("array should return empty array when field getInitialValue is 'default'", () => {
const field = getField("array<string>")
field.getInitialValue = "default"
const value = getNewFieldValue(field)
expect(value).toEqual([])
})
it("datetime should return Now when getInitialValue is 'now'", () => {
const field = getField("datetime")
field.getInitialValue = "now"
const before = new Date()
const value = getNewFieldValue(field)
const after = new Date()
expect(value >= before && value <= after).toBeTruthy()
})
const test_getNewFieldValue = (type, val, expected) => () => {
const field = getField(type)
field.getInitialValue = val
const value = getNewFieldValue(field)
expect(value).toEqual(expected)
}
it("bool should parse value in getInitialValue if function not recognised", () => {
test_getNewFieldValue("bool", "true", true)()
test_getNewFieldValue("bool", "on", true)()
test_getNewFieldValue("bool", "1", true)()
test_getNewFieldValue("bool", "yes", true)()
test_getNewFieldValue("bool", "false", false)()
test_getNewFieldValue("bool", "off", false)()
test_getNewFieldValue("bool", "0", false)()
test_getNewFieldValue("bool", "no", false)()
})
it("bool should return null if function not recognised and value cannot be parsed", () => {
test_getNewFieldValue("bool", "blah", null)()
test_getNewFieldValue("bool", 111, null)()
})
it("number should parse value in getInitialValue if function not recognised", () => {
test_getNewFieldValue("number", "1", 1)()
test_getNewFieldValue("number", "45", 45)()
test_getNewFieldValue("number", "4.11", 4.11)()
})
it("number should return null if function not recognised and value cannot be parsed", () => {
test_getNewFieldValue("number", "blah", null)()
test_getNewFieldValue("number", true, null)()
})
it("string should parse value in getInitialValue if function not recognised", () => {
test_getNewFieldValue("string", "hello there", "hello there")()
test_getNewFieldValue("string", 45, "45")()
test_getNewFieldValue("string", true, "true")()
})
it("array should return empty array when function not recognised", () => {
test_getNewFieldValue("array<string>", "blah", [])()
test_getNewFieldValue("array<bool>", true, [])()
test_getNewFieldValue("array<number>", 1, [])()
test_getNewFieldValue("array<datetime>", "", [])()
test_getNewFieldValue("array<reference>", "", [])()
test_getNewFieldValue("array<file>", "", [])()
})
it("reference should {key:''} when function not recognised", () => {
test_getNewFieldValue("reference", "blah", nothingReference)()
})
it("file should return {relativePath:'',size:0} when function not recognised", () => {
test_getNewFieldValue("file", "blah", nothingFile)()
})
})
describe("types > getSafeFieldValue", () => {
const test_getSafeFieldValue = (type, member, value, expectedParse) => () => {
const field = getField(type)
field.getDefaultValue = "default"
field.name = member
const record = {}
if (isDefined(value)) record[member] = value
const parsedvalue = safeParseField(field, record)
expect(parsedvalue).toEqual(expectedParse)
}
it(
"should get default field value when member is undefined on record",
test_getSafeFieldValue("string", "forename", undefined, null)
)
it("should return null as null (except array and reference)", () => {
test_getSafeFieldValue("string", "forename", null, null)()
test_getSafeFieldValue("bool", "isalive", null, null)()
test_getSafeFieldValue("datetime", "created", null, null)()
test_getSafeFieldValue("number", "age", null, null)()
test_getSafeFieldValue("array<string>", "tags", null, [])()
test_getSafeFieldValue("reference", "moretags", null, nothingReference)()
test_getSafeFieldValue("file", "moretags", null, nothingFile)()
})
it("bool should parse a defined set of true/false aliases", () => {
test_getSafeFieldValue("bool", "isalive", true, true)()
test_getSafeFieldValue("bool", "isalive", "true", true)()
test_getSafeFieldValue("bool", "isalive", "on", true)()
test_getSafeFieldValue("bool", "isalive", "1", true)()
test_getSafeFieldValue("bool", "isalive", "yes", true)()
test_getSafeFieldValue("bool", "isalive", false, false)()
test_getSafeFieldValue("bool", "isalive", "false", false)()
test_getSafeFieldValue("bool", "isalive", "off", false)()
test_getSafeFieldValue("bool", "isalive", "0", false)()
test_getSafeFieldValue("bool", "isalive", "no", false)()
})
it(
"bool should parse invalid values as null",
test_getSafeFieldValue("bool", "isalive", "blah", null)
)
it("number should parse numbers and strings that are numbers", () => {
test_getSafeFieldValue("number", "age", 204, 204)()
test_getSafeFieldValue("number", "age", "1", 1)()
test_getSafeFieldValue("number", "age", "45", 45)()
test_getSafeFieldValue("number", "age", "4.11", 4.11)()
})
it(
"number should parse invalid values as null",
test_getSafeFieldValue("number", "age", "blah", null)
)
it(
"string should parse strings",
test_getSafeFieldValue("string", "forename", "bob", "bob")
)
it("string should parse any other basic type", () => {
test_getSafeFieldValue("string", "forename", true, "true")()
test_getSafeFieldValue("string", "forename", 1, "1")()
})
it("date should parse dates in various precisions", () => {
// dont forget that JS Date's month is zero based
test_getSafeFieldValue(
"datetime",
"createddate",
"2018-02-14",
new Date(2018, 1, 14)
)()
test_getSafeFieldValue(
"datetime",
"createddate",
"2018-2-14",
new Date(2018, 1, 14)
)()
test_getSafeFieldValue(
"datetime",
"createddate",
"2018-02-14 11:00:00.000",
new Date(2018, 1, 14, 11)
)()
test_getSafeFieldValue(
"datetime",
"createddate",
"2018-02-14 11:30",
new Date(2018, 1, 14, 11, 30)
)()
})
it("date should parse invalid dates as null", () => {
// dont forget that JS Date's month is zero based
test_getSafeFieldValue("datetime", "createddate", "2018-13-14", null)()
test_getSafeFieldValue("datetime", "createddate", "2018-2-33", null)()
test_getSafeFieldValue("datetime", "createddate", "bla", null)()
})
it("array should parse array", () => {
test_getSafeFieldValue(
"array<string>",
"tags",
["bob", "the", "dog"],
["bob", "the", "dog"]
)()
test_getSafeFieldValue(
"array<bool>",
"tags",
[true, false],
[true, false]
)()
test_getSafeFieldValue(
"array<number>",
"tags",
[1, 2, 3, 4],
[1, 2, 3, 4]
)()
test_getSafeFieldValue(
"array<reference>",
"tags",
[{ key: "/customer/1234", value: "bob" }],
[{ key: "/customer/1234", value: "bob" }]
)()
})
it("array should convert the generic's child type", () => {
test_getSafeFieldValue("array<string>", "tags", [1, true], ["1", "true"])()
test_getSafeFieldValue(
"array<bool>",
"tags",
["yes", "true", "no", "false", true, false],
[true, true, false, false, true, false]
)()
test_getSafeFieldValue("array<number>", "tags", ["1", 23], [1, 23])()
})
it("reference should parse reference", () => {
test_getSafeFieldValue(
"reference",
"customer",
{ key: "/customer/1234", value: "bob" },
{ key: "/customer/1234", value: "bob" }
)()
})
it("reference should parse reference", () => {
test_getSafeFieldValue(
"file",
"profilepic",
{ relativePath: "path/to/pic.jpg", size: 120 },
{ relativePath: "path/to/pic.jpg", size: 120 }
)()
})
})