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})(); }); });