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") 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", "blah", [])() test_getNewFieldValue("array", true, [])() test_getNewFieldValue("array", 1, [])() test_getNewFieldValue("array", "", [])() test_getNewFieldValue("array", "", [])() test_getNewFieldValue("array", "", [])() }) 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", "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", "tags", ["bob", "the", "dog"], ["bob", "the", "dog"] )() test_getSafeFieldValue( "array", "tags", [true, false], [true, false] )() test_getSafeFieldValue( "array", "tags", [1, 2, 3, 4], [1, 2, 3, 4] )() test_getSafeFieldValue( "array", "tags", [{ key: "/customer/1234", value: "bob" }], [{ key: "/customer/1234", value: "bob" }] )() }) it("array should convert the generic's child type", () => { test_getSafeFieldValue("array", "tags", [1, true], ["1", "true"])() test_getSafeFieldValue( "array", "tags", ["yes", "true", "no", "false", true, false], [true, true, false, false, true, false] )() test_getSafeFieldValue("array", "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 } )() }) })