budibase/packages/core/test/templateApi.fields.spec.js

118 lines
4.3 KiB
JavaScript

import {isDefined, join, fieldDefinitions, $} from "../src/common";
import {getMemoryTemplateApi} from "./specHelpers";
import {fieldErrors} from "../src/templateApi/fields";
const getRecordTemplate = templateApi =>
$(templateApi.getNewRootLevel(), [
templateApi.getNewRecordTemplate
]);
const getValidField = templateApi => {
const field = templateApi.getNewField("string");
field.name = "forename";
field.label = "forename";
return field;
};
const testMemberIsNotSet = membername => async () => {
const {templateApi} = await getMemoryTemplateApi();
const field = getValidField(templateApi);
field[membername] = "";
const errorsNotSet = templateApi.validateField([field])(field);
expect(errorsNotSet.length).toBe(1);
expect(errorsNotSet[0].error.includes("is not set")).toBeTruthy();
};
const testMemberIsNotDefined = membername => async () => {
const {templateApi} = await getMemoryTemplateApi();
const field = getValidField(templateApi);
delete field[membername];
const errorsNotSet = templateApi.validateField([field])(field);
expect(errorsNotSet.length).toBe(1);
expect(errorsNotSet[0].error.includes("is not set")).toBeTruthy();
};
describe("validateField", () => {
it("should return error when name is not set",
testMemberIsNotSet("name"));
it("should return error when name is not defined",
testMemberIsNotDefined("name"));
it("should return error when type is not set",
testMemberIsNotSet("type"));
it("should return error when type is not defined",
testMemberIsNotDefined("type"));
it("should return error when label is not defined",
testMemberIsNotDefined("label"));
it("should return error when getInitialValue is not defined",
testMemberIsNotDefined("getInitialValue"));
it("should return error when getInitialValue is not set",
testMemberIsNotSet("getInitialValue"));
it("should return error when getUndefinedValue is not defined",
testMemberIsNotDefined("getUndefinedValue"));
it("should return error when getUndefinedValue is not set",
testMemberIsNotSet("getUndefinedValue"));
it("should return no errors when valid field is supplied", async () => {
const {templateApi} = await getMemoryTemplateApi();
const field = getValidField(templateApi);
const errors = templateApi.validateField([field])(field);
expect(errors.length).toBe(0);
});
it("should return error when field with same name exists already", async () => {
const {templateApi} = await getMemoryTemplateApi();
const field1 = getValidField(templateApi);
field1.name = "surname";
const field2 = getValidField(templateApi);
field2.name = "surname";
const errors = templateApi.validateField([field1, field2])(field2);
expect(errors.length).toBe(1);
expect(errors[0].error).toBe("field name is duplicated");
expect(errors[0].field).toBe("name");
});
it("should return error when field is not one of allowed types", async () => {
const {templateApi} = await getMemoryTemplateApi();
const field = getValidField(templateApi);
field.type = "sometype";
const errors = templateApi.validateField([field])(field);
expect(errors.length).toBe(1);
expect(errors[0].error).toBe("type is unknown");
expect(errors[0].field).toBe("type");
});
});
describe("addField", () => {
it("should throw exception when field is invalid", async () => {
const {templateApi} = await getMemoryTemplateApi();
const record = getRecordTemplate(templateApi);
const field = getValidField(templateApi);
field.name = "";
expect(() => templateApi.addField(record, field))
.toThrow(new RegExp('^' + fieldErrors.AddFieldValidationFailed, 'i'));
});
it("should add field when field is valid", async () => {
const {templateApi} = await getMemoryTemplateApi();
const record = getRecordTemplate(templateApi);
const field = getValidField(templateApi);
field.name = "some_new_field";
templateApi.addField(record, field);
expect(record.fields.length).toBe(1);
expect(record.fields[0]).toBe(field);
});
});