* Client changes 1 * add DSL functionality * Temp commit for refactoring changes * Do I even know what I'm doing here? * chore: Second GS layout * Update: Visibility conditional outputs for schemas - Added the output from conditional outputs for schema children too * Update: Entity selector visibility control - Added logic for controlling visibility of sub components via the JS expressions system * Update: Passing disabled prop to toggle button * Update: Passing disabled prop to toggle btn * Update: Styled component for toggle button - Added disabled styles based on the disabled prop sent to the toggle form view JSON button * Update: configProperty role in Entity Selector - Removed dependance of the configProperty of the entity selector children to it's parent component * Update: type of placeholder key - Made placeholder key from form config JSON to accept either string or an object - Earlier only string was accepted - This is for pagination component * Update: Added placeholder control for pagination * Client changes 1 * add DSL functionality * Do I even know what I'm doing here? * fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design * fix: updated tooltip component for wrong ui on entity explore * temp triggers * fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design (#12395) * fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design * fix: updated tooltip component for wrong ui on entity explore * fix: updated tooltip ui, where condition placement, sort by ui * temp form data access logic * fix: updated sorting type width ui * fix: updated ui for spacing, width and text issues * Update: Type for tooltip of UQI forms - Added option to send an object to the tooltipText object. - This allows for composite components like pagination to have tooltips for each sub component * Update: tooltip for pagination component - Added handling to parse the tooltip for multiple components. - This allows for composite components like pagination to have tooltips for each sub component * Update: Type cast for tooltip component - Made the content passed to tooltip component as a string only * Update: Fixed tooltip component CSS * Update: Dropdown option component - Added a tooltip wrapper to each option - This is to show on hover text like disabled state * fix: updated ẇhere clause broken ui for condition * Add: functions to check and extract expressions - Loop through the formConfig and find any keys that have a value that is bindable - Used pre defined regex to check if value is a moustache binding * Add: Types for evaluated form configs - Added types for the form configs to be evaluated and their output post eval * Add: Flow to run the form config - Run the form config and update the result to the redux state * Update: Name of the type for formconfigs - Updated since it was clashing with a component of the same name * Add: Function to enforce config type checks - This is done so that the improper configs can be weeded out and the rest of the form can be shown * Add: Function to update evaluated config - Added option to update the config if it's values needed evaluation * Add: Type check for schema sections * Update: Error handling for invalid control type - We were throwing an exception till now, changed it to a warning text * Add: Exposed tooltip for dropdown option disabled state * Update: switch to json mode functionality - Added logic to convert data to a string rather than an object when the first switch to JSON mode happens * Update: Added key to tooltip for dropdown options * Trigger API modification * Add: function to fetch default trigger URL * Update: Made URL optional in dynamic trigger config * Update: Dynamic trigger API call - Made the API call for dynamic triggers have URL as optional field - Added type check to the response of the API call * Update: resp type for trigger APIs * Update: Moved code to utils folder - Moved functions for UQI form eval processing to utils file * Update: passing original controltype to JS switch * Update: config for JSON editor mode - Updated the config to have different options for JSON mode depending on the original control type * Update: Connected line numbers flag to config * Revert: CSS changes for tooltip * Refactor: Removed consle * Add: type for the config of dynamic values * Add: Feature to evaluate config for triggers * Refactor: fix type check errors * fix: dropdown ui width with text alignment * Update: fixed selector for dynamic values * Update: selector call for fetchDynamicValues * Add table header index prop for columns selector * migration partial commit * migration partial commit * Refactor: removed unused import * Update: reused function for checking dynamic value * Update: removed unused import * Fix format JSON issues * Retrieve binding paths from entity selector components * Fixes 6 remaining issues with UQI implementation * Fix dropdown issues * Fix dropdown height issues and fixes triggering of APIs when option is deselected * Migration changes * Fix QA generated UQI issues * Fix projection component height and route change logic * Fix multi select dropdown placeholder text issue and json stringify issue with switching view types * Reset entity type value when command value changes * Test changes * Review comments * Moved migrations around * Corrected import statement * Added JSON schema migration * Updated schema version * perf improvements and filter dropdown options feature * Fix Code mirror component config for toggleComponentToJson input fields. * Fix prettier issues * fix prettier issues * Fix style issues as a result of the merged conflicts * Fix failing test case * Fixed a few other flows (#14225) * Fixed a few other flows * Review comments * Fix generate CRUD, fix evaluation of dynamic bindings and fix various styling issues. * More fixes (#14367) * Factor in the root formconfig parent key. * Fix flickering issues, and evaluatedFormConfig issues * fix: Teeny bugs (#14455) * Teeny bugs * Added previous functionality as is * Improvements in the way we fetch dynamic values * Fix stringiification issue and cyclic dependency issues * Resolve projection component values deletion * Resolve merge conflicts and fix prettier issues * fix: Tsc issues * Fix property pane connection navigation * updating ee locator * updating inputfield locator * dropdown locator update * Merge conflict not properly resolved. * Fix s3 spec * Fix Mongo Spec * Fix some more tests * fix: prevent cyclic dependency when switching to js mode (#14668) * add delete events for change from array to string in diff * add test to assert absence of cyclic dependency error when switching to js in switchgroup widget * Assert that evaluation is not disabled when no cyclic dependency happens * Cypress test preparations for google sheets and form controls * Fixed a few test errors (#14874) * Add: unit tests for uqi UI updates - view type tests - conditional output extraction - processing conditional output to handle view/enabled state of the component * Add: completed isValidFormConfig test * Update: improved tests for update config - These tests cover the functionality to update a section config after it's components are done evaluating * Fix failing cypress tests and cyclic dependency issue * Fixes some more tests * Fixed migration of row objects (#14896) * Bumped the version of design system package * Update: reverted change to EE selector * Fix deletion pointer * Update: selector for js on load spec - Synced with changes related to ADS dropdown * Fix mongoDBShoppingCart spec * Remove comments * Fix: mongo shopping cart test failures * fix: mongo shopping cart spec * Dummy push to retrigger vercel * fix: mongo shopping cart spec * Update MongoDBShoppingCart_spec.js * fix: removed unused click away * dummy commit * Update: moved helper functions to separate file * Add: added tests for saga functions - Worked on testing for - extractFetchDynamicValueFormConfigs - extractQueueOfValuesToBeFetched * Add if check for queueOfValuesToBeFetched * Resolve review comments * Empty-Commit Co-authored-by: Irongade <adeoluayangade@yahoo.com> Co-authored-by: Ayush Pahwa <ayush@appsmith.com> Co-authored-by: Aman Agarwal <aman@appsmith.com> Co-authored-by: Ayangade Adeoluwa <37867493+Irongade@users.noreply.github.com> Co-authored-by: Aishwarya UR <aishwarya@appsmith.com> Co-authored-by: Favour Ohanekwu <fohanekwu@gmail.com> Co-authored-by: Albin <albin@appsmith.com>
906 lines
23 KiB
TypeScript
906 lines
23 KiB
TypeScript
import {
|
|
isHidden,
|
|
getConfigInitialValues,
|
|
caculateIsHidden,
|
|
evaluateCondtionWithType,
|
|
actionPathFromName,
|
|
getViewType,
|
|
ViewTypes,
|
|
switchViewType,
|
|
extractConditionalOutput,
|
|
checkIfSectionCanRender,
|
|
checkIfSectionIsEnabled,
|
|
updateEvaluatedSectionConfig,
|
|
} from "./utils";
|
|
import { HiddenType } from "./BaseControl";
|
|
import { set } from "lodash";
|
|
import { isValidFormConfig } from "reducers/evaluationReducers/formEvaluationReducer";
|
|
|
|
describe("isHidden test", () => {
|
|
it("Test for isHidden true", () => {
|
|
const hiddenTrueInputs: any = [
|
|
{ values: { name: "Name" }, hidden: true },
|
|
{
|
|
values: { name: "Name", number: 2, email: "temp@temp.com" },
|
|
hidden: {
|
|
conditionType: "AND",
|
|
conditions: [
|
|
{
|
|
path: "name",
|
|
value: "Name",
|
|
comparison: "EQUALS",
|
|
},
|
|
{
|
|
conditionType: "AND",
|
|
conditions: [
|
|
{
|
|
path: "number",
|
|
value: 2,
|
|
comparison: "EQUALS",
|
|
},
|
|
{
|
|
path: "email",
|
|
value: "temp@temp.com",
|
|
comparison: "EQUALS",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
},
|
|
{
|
|
values: { name: "Name" },
|
|
hidden: {
|
|
path: "name",
|
|
value: "Name",
|
|
comparison: "EQUALS",
|
|
},
|
|
},
|
|
{
|
|
values: { name: "Name", config: { type: "EMAIL" } },
|
|
hidden: {
|
|
path: "name.config.type",
|
|
value: "USER_ID",
|
|
comparison: "NOT_EQUALS",
|
|
},
|
|
},
|
|
{
|
|
values: undefined,
|
|
hidden: true,
|
|
},
|
|
{
|
|
values: null,
|
|
hidden: true,
|
|
},
|
|
];
|
|
|
|
hiddenTrueInputs.forEach((input: any) => {
|
|
expect(isHidden(input.values, input.hidden)).toBeTruthy();
|
|
});
|
|
});
|
|
|
|
it("Test for isHidden false", () => {
|
|
const hiddenFalseInputs: any = [
|
|
{ values: { name: "Name" }, hidden: false },
|
|
{
|
|
values: { name: "Name" },
|
|
hidden: {
|
|
path: "name",
|
|
value: "Different Name",
|
|
comparison: "EQUALS",
|
|
},
|
|
},
|
|
{
|
|
values: { name: "Name", config: { type: "EMAIL" } },
|
|
hidden: {
|
|
path: "config.type",
|
|
value: "EMAIL",
|
|
comparison: "NOT_EQUALS",
|
|
},
|
|
},
|
|
{
|
|
values: { name: "Name", config: { type: "Different BODY" } },
|
|
hidden: {
|
|
path: "config.type",
|
|
value: ["EMAIL", "BODY"],
|
|
comparison: "IN",
|
|
},
|
|
},
|
|
{
|
|
values: { name: "Name", config: { type: "BODY" } },
|
|
hidden: {
|
|
path: "config.type",
|
|
value: ["EMAIL", "BODY"],
|
|
comparison: "NOT_IN",
|
|
},
|
|
},
|
|
{
|
|
values: undefined,
|
|
hidden: false,
|
|
},
|
|
{
|
|
values: null,
|
|
hidden: false,
|
|
},
|
|
{
|
|
values: undefined,
|
|
},
|
|
{
|
|
values: { name: "Name" },
|
|
},
|
|
{
|
|
values: {
|
|
name: "Name",
|
|
config: { type: "EMAIL", name: "TEMP" },
|
|
contact: { number: 1234, address: "abcd" },
|
|
},
|
|
hidden: {
|
|
conditionType: "AND",
|
|
conditions: [
|
|
{
|
|
path: "contact.number",
|
|
value: 1234,
|
|
comparison: "NOT_EQUALS",
|
|
},
|
|
{
|
|
conditionType: "OR",
|
|
conditions: [
|
|
{
|
|
conditionType: "AND",
|
|
conditions: [
|
|
{
|
|
path: "config.name",
|
|
value: "TEMP",
|
|
comparison: "EQUALS",
|
|
},
|
|
{
|
|
path: "config.name",
|
|
value: "HELLO",
|
|
comparison: "EQUALS",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
path: "config.type",
|
|
value: "EMAIL",
|
|
comparison: "NOT_EQUALS",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
},
|
|
];
|
|
|
|
hiddenFalseInputs.forEach((input: any) => {
|
|
expect(isHidden(input.values, input.hidden)).toBeFalsy();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("getConfigInitialValues test", () => {
|
|
it("getConfigInitialValues test", () => {
|
|
const testCases = [
|
|
{
|
|
input: [
|
|
{
|
|
sectionName: "Connection",
|
|
children: [
|
|
{
|
|
label: "Region",
|
|
configProperty:
|
|
"datasourceConfiguration.authentication.databaseName",
|
|
controlType: "DROP_DOWN",
|
|
initialValue: "ap-south-1",
|
|
options: [
|
|
{
|
|
label: "ap-south-1",
|
|
value: "ap-south-1",
|
|
},
|
|
{
|
|
label: "eu-south-1",
|
|
value: "eu-south-1",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
],
|
|
output: {
|
|
datasourceConfiguration: {
|
|
authentication: { databaseName: "ap-south-1" },
|
|
},
|
|
},
|
|
},
|
|
{
|
|
input: [
|
|
{
|
|
sectionName: "Connection",
|
|
children: [
|
|
{
|
|
label: "Region",
|
|
configProperty:
|
|
"datasourceConfiguration.authentication.databaseName",
|
|
controlType: "INPUT_TEXT",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
output: {},
|
|
},
|
|
{
|
|
input: [
|
|
{
|
|
sectionName: "Connection",
|
|
children: [
|
|
{
|
|
label: "Host Address (for overriding endpoint only)",
|
|
configProperty: "datasourceConfiguration.endpoints[*].host",
|
|
controlType: "KEYVALUE_ARRAY",
|
|
initialValue: ["jsonplaceholder.typicode.com"],
|
|
},
|
|
{
|
|
label: "Port",
|
|
configProperty: "datasourceConfiguration.endpoints[*].port",
|
|
dataType: "NUMBER",
|
|
controlType: "KEYVALUE_ARRAY",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
output: {
|
|
datasourceConfiguration: {
|
|
endpoints: [{ host: "jsonplaceholder.typicode.com" }],
|
|
},
|
|
},
|
|
},
|
|
{
|
|
input: [
|
|
{
|
|
sectionName: "Settings",
|
|
children: [
|
|
{
|
|
label: "Smart substitution",
|
|
configProperty: "datasourceConfiguration.isSmart",
|
|
controlType: "SWITCH",
|
|
initialValue: false,
|
|
},
|
|
],
|
|
},
|
|
],
|
|
output: {
|
|
datasourceConfiguration: {
|
|
isSmart: false,
|
|
},
|
|
},
|
|
},
|
|
];
|
|
|
|
testCases.forEach((testCase) => {
|
|
expect(getConfigInitialValues(testCase.input)).toEqual(testCase.output);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("caculateIsHidden test", () => {
|
|
it("calcualte hidden field value", () => {
|
|
const values = { name: "Name" };
|
|
const hiddenTruthy: HiddenType = {
|
|
path: "name",
|
|
comparison: "EQUALS",
|
|
value: "Name",
|
|
};
|
|
const hiddenFalsy: HiddenType = {
|
|
path: "name",
|
|
comparison: "EQUALS",
|
|
value: "Different Name",
|
|
};
|
|
expect(caculateIsHidden(values, hiddenTruthy)).toBeTruthy();
|
|
expect(caculateIsHidden(values, hiddenFalsy)).toBeFalsy();
|
|
});
|
|
});
|
|
|
|
describe("evaluateCondtionWithType test", () => {
|
|
it("accumulate boolean of array into one based on conditionType", () => {
|
|
const andConditionType = "AND";
|
|
const orConditionType = "OR";
|
|
const booleanArray = [true, false, true];
|
|
|
|
expect(
|
|
evaluateCondtionWithType(booleanArray, andConditionType),
|
|
).toBeFalsy();
|
|
expect(
|
|
evaluateCondtionWithType(booleanArray, orConditionType),
|
|
).toBeTruthy();
|
|
});
|
|
});
|
|
|
|
describe("actionPathFromName test", () => {
|
|
it("creates path from name", () => {
|
|
const actionName = "Api5";
|
|
const name = "actionConfiguration.pluginSpecifiedTemplates[7].value";
|
|
const pathName = "Api5.config.pluginSpecifiedTemplates[7].value";
|
|
|
|
expect(actionPathFromName(actionName, name)).toEqual(pathName);
|
|
});
|
|
});
|
|
|
|
describe("json/form viewTypes test", () => {
|
|
it("should return correct viewType", () => {
|
|
const testValues = {
|
|
actionConfiguration: {
|
|
formData: {
|
|
node1: { data: "value1" },
|
|
node3: { data: "value1" },
|
|
node2: { data: "value1", viewType: ViewTypes.JSON },
|
|
node4: { data: "value1", viewType: ViewTypes.COMPONENT },
|
|
node5: { bata: "value1", viewType: ViewTypes.COMPONENT },
|
|
},
|
|
},
|
|
actionConfiguration2: {
|
|
formData: {
|
|
node6: { data: "value1", viewType: ViewTypes.COMPONENT },
|
|
},
|
|
},
|
|
};
|
|
const testCases = [
|
|
{
|
|
input: "actionConfiguration.formData.node1.data",
|
|
output: ViewTypes.COMPONENT,
|
|
},
|
|
{
|
|
input: "actionConfiguration.formData.node2.data",
|
|
output: ViewTypes.JSON,
|
|
},
|
|
{
|
|
input: "actionConfiguration.formData.node3.data",
|
|
output: ViewTypes.COMPONENT,
|
|
},
|
|
{
|
|
input: "actionConfiguration.formData.node4.data",
|
|
output: ViewTypes.COMPONENT,
|
|
},
|
|
{
|
|
input: "actionConfiguration.formData.node5.bata",
|
|
output: ViewTypes.COMPONENT,
|
|
},
|
|
{
|
|
input: "actionConfiguration2.formData.node6.bata",
|
|
output: ViewTypes.COMPONENT,
|
|
},
|
|
];
|
|
testCases.forEach((testCase) => {
|
|
expect(getViewType(testValues, testCase.input)).toEqual(testCase.output);
|
|
});
|
|
});
|
|
|
|
it("should change the viewType", () => {
|
|
const outputValues: any[] = [
|
|
{
|
|
actionConfiguration: {
|
|
formData: {
|
|
node1: { data: "value1" },
|
|
node3: { data: "value1" },
|
|
node2: { data: "value1", viewType: ViewTypes.JSON },
|
|
node4: { data: "value1", viewType: ViewTypes.COMPONENT },
|
|
node5: {
|
|
data: "value1",
|
|
viewType: ViewTypes.JSON,
|
|
componentData: "value2",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
actionConfiguration: {
|
|
formData: {
|
|
node1: { data: "value1" },
|
|
node3: { data: "value1" },
|
|
node2: { data: "value1", viewType: ViewTypes.JSON },
|
|
node4: { data: "value1", viewType: ViewTypes.COMPONENT },
|
|
node5: {
|
|
data: "value1",
|
|
viewType: ViewTypes.JSON,
|
|
componentData: "value2",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
actionConfiguration: {
|
|
formData: {
|
|
node1: { data: "value1" },
|
|
node3: { data: "value1" },
|
|
node2: { data: "value1", viewType: ViewTypes.JSON },
|
|
node4: {
|
|
data: "value1",
|
|
viewType: ViewTypes.COMPONENT,
|
|
jsonData: "value2",
|
|
},
|
|
node5: {
|
|
data: "value1",
|
|
viewType: ViewTypes.JSON,
|
|
componentData: "value2",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
actionConfiguration: {
|
|
formData: {
|
|
node1: { data: "value1" },
|
|
node3: { data: "value1" },
|
|
node2: { data: "value1", viewType: ViewTypes.JSON },
|
|
node4: { data: "value1", viewType: ViewTypes.COMPONENT },
|
|
node5: {
|
|
data: "value1",
|
|
viewType: ViewTypes.JSON,
|
|
componentData: "value2",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
actionConfiguration: {
|
|
formData: {
|
|
node1: { data: "value1" },
|
|
node3: { data: "value1" },
|
|
node2: { data: "value1", viewType: ViewTypes.JSON },
|
|
node4: { data: "value1", viewType: ViewTypes.COMPONENT },
|
|
node5: {
|
|
data: "value1",
|
|
viewType: ViewTypes.JSON,
|
|
componentData: "value2",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
actionConfiguration: {
|
|
formData: {
|
|
node1: { data: "value1" },
|
|
node3: { data: "value1" },
|
|
node2: { data: "value1", viewType: ViewTypes.JSON },
|
|
node4: { data: "value1", viewType: ViewTypes.COMPONENT },
|
|
node5: {
|
|
data: "value1",
|
|
viewType: ViewTypes.JSON,
|
|
componentData: "value2",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
];
|
|
const customSetterFunction = (
|
|
formName: string,
|
|
path: string,
|
|
value: any,
|
|
) => {
|
|
set(outputValues[Number(formName.split("-")[1])], path, value);
|
|
};
|
|
const inputValue = {
|
|
actionConfiguration: {
|
|
formData: {
|
|
node1: { data: "value1" },
|
|
node2: { data: "value1", viewType: ViewTypes.JSON },
|
|
node3: { data: "value1" },
|
|
node4: {
|
|
data: "value1",
|
|
viewType: ViewTypes.COMPONENT,
|
|
jsonData: "value2",
|
|
},
|
|
node5: {
|
|
data: "value1",
|
|
viewType: ViewTypes.JSON,
|
|
componentData: "value2",
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const expectedOutputValues: any[] = [
|
|
{
|
|
actionConfiguration: {
|
|
formData: {
|
|
node1: {
|
|
data: "value1",
|
|
viewType: ViewTypes.JSON,
|
|
componentData: "value1",
|
|
},
|
|
node2: { data: "value1", viewType: ViewTypes.JSON },
|
|
node3: { data: "value1" },
|
|
node4: { data: "value1", viewType: ViewTypes.COMPONENT },
|
|
node5: {
|
|
data: "value1",
|
|
viewType: ViewTypes.JSON,
|
|
componentData: "value2",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
actionConfiguration: {
|
|
formData: {
|
|
node1: { data: "value1" },
|
|
node3: { data: "value1" },
|
|
node2: {
|
|
data: "value1",
|
|
viewType: ViewTypes.COMPONENT,
|
|
jsonData: "value1",
|
|
},
|
|
node4: { data: "value1", viewType: ViewTypes.COMPONENT },
|
|
node5: {
|
|
data: "value1",
|
|
viewType: ViewTypes.JSON,
|
|
componentData: "value2",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
actionConfiguration: {
|
|
formData: {
|
|
node1: { data: "value1" },
|
|
node3: { data: "value1" },
|
|
node2: { data: "value1", viewType: ViewTypes.JSON },
|
|
node4: {
|
|
data: "value2",
|
|
viewType: ViewTypes.JSON,
|
|
jsonData: "value2",
|
|
componentData: "value1",
|
|
},
|
|
node5: {
|
|
data: "value1",
|
|
viewType: ViewTypes.JSON,
|
|
componentData: "value2",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
actionConfiguration: {
|
|
formData: {
|
|
node1: { data: "value1" },
|
|
node3: { data: "value1" },
|
|
node2: { data: "value1", viewType: ViewTypes.JSON },
|
|
node4: { data: "value1", viewType: ViewTypes.COMPONENT },
|
|
node5: {
|
|
data: "value2",
|
|
viewType: ViewTypes.COMPONENT,
|
|
componentData: "value2",
|
|
jsonData: "value1",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
actionConfiguration: {
|
|
formData: {
|
|
node1: { data: "value1" },
|
|
node3: {
|
|
data: "value1",
|
|
jsonData: "value1",
|
|
viewType: ViewTypes.COMPONENT,
|
|
},
|
|
node2: { data: "value1", viewType: ViewTypes.JSON },
|
|
node4: { data: "value1", viewType: ViewTypes.COMPONENT },
|
|
node5: {
|
|
data: "value1",
|
|
viewType: ViewTypes.JSON,
|
|
componentData: "value2",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
];
|
|
const testCases = [
|
|
{
|
|
path: "actionConfiguration.formData.node1.data",
|
|
viewType: ViewTypes.COMPONENT,
|
|
},
|
|
{
|
|
path: "actionConfiguration.formData.node2.data",
|
|
viewType: ViewTypes.JSON,
|
|
},
|
|
{
|
|
path: "actionConfiguration.formData.node4.data",
|
|
viewType: ViewTypes.COMPONENT,
|
|
},
|
|
{
|
|
path: "actionConfiguration.formData.node5.data",
|
|
viewType: ViewTypes.JSON,
|
|
},
|
|
{
|
|
path: "actionConfiguration.formData.node3.data",
|
|
viewType: ViewTypes.JSON,
|
|
},
|
|
];
|
|
testCases.forEach((testCase, index) => {
|
|
const formName = `testForm-${index}`;
|
|
switchViewType(
|
|
inputValue,
|
|
testCase.path,
|
|
testCase.viewType,
|
|
formName,
|
|
customSetterFunction,
|
|
);
|
|
expect(outputValues[index]).toEqual(expectedOutputValues[index]);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("UQI form render methods", () => {
|
|
it("extract conditional output", () => {
|
|
const expectedOutputs = [
|
|
{},
|
|
{
|
|
conditionals: {},
|
|
visible: true,
|
|
enabled: true,
|
|
},
|
|
{
|
|
conditionals: {},
|
|
visible: true,
|
|
enabled: false,
|
|
},
|
|
{
|
|
conditionals: {},
|
|
visible: false,
|
|
enabled: true,
|
|
},
|
|
];
|
|
const testCases = [
|
|
{
|
|
name: "section1",
|
|
},
|
|
{
|
|
name: "section2",
|
|
identifier: "identifier",
|
|
},
|
|
{
|
|
name: "section3",
|
|
configProperty: "configProperty",
|
|
identifier: "identifier",
|
|
},
|
|
{
|
|
name: "section4",
|
|
configProperty: "configProperty",
|
|
propertyName: "propertyName",
|
|
identifier: "identifier",
|
|
},
|
|
];
|
|
testCases.forEach((testCase, index) => {
|
|
const output = extractConditionalOutput(testCase, formEvaluation);
|
|
expect(output).toEqual(expectedOutputs[index]);
|
|
});
|
|
});
|
|
|
|
it("section render test", () => {
|
|
const testCases = [
|
|
{
|
|
input: "identifier",
|
|
output: true,
|
|
},
|
|
{
|
|
input: "configProperty",
|
|
output: true,
|
|
},
|
|
{
|
|
input: "propertyName",
|
|
output: false,
|
|
},
|
|
{
|
|
input: "identifier2",
|
|
output: true,
|
|
},
|
|
{
|
|
input: "identifier3",
|
|
output: false,
|
|
},
|
|
{
|
|
input: "identifier4",
|
|
output: false,
|
|
},
|
|
{
|
|
input: "identifier5",
|
|
output: true,
|
|
},
|
|
];
|
|
testCases.forEach((testCase) => {
|
|
const output = checkIfSectionCanRender(formEvaluation[testCase.input]);
|
|
expect(output).toEqual(testCase.output);
|
|
});
|
|
});
|
|
|
|
it("section enabled/disabled test", () => {
|
|
const testCases = [
|
|
{
|
|
input: "identifier",
|
|
output: true,
|
|
},
|
|
{
|
|
input: "configProperty",
|
|
output: false,
|
|
},
|
|
{
|
|
input: "propertyName",
|
|
output: true,
|
|
},
|
|
{
|
|
input: "identifier2",
|
|
output: false,
|
|
},
|
|
{
|
|
input: "identifier3",
|
|
output: true,
|
|
},
|
|
];
|
|
testCases.forEach((testCase) => {
|
|
const output = checkIfSectionIsEnabled(formEvaluation[testCase.input]);
|
|
expect(output).toEqual(testCase.output);
|
|
});
|
|
});
|
|
|
|
it("check if valid form config", () => {
|
|
const testCases: any[] = [
|
|
{
|
|
input: {},
|
|
output: false,
|
|
},
|
|
{
|
|
input: {
|
|
controlType: "SECTION",
|
|
label: "Select Bucket to Query",
|
|
children: [
|
|
{
|
|
label: "Bucket Name",
|
|
configProperty: "actionConfiguration.formData.bucket.data",
|
|
controlType: "QUERY_DYNAMIC_INPUT_TEXT",
|
|
evaluationSubstitutionType: "TEMPLATE",
|
|
isRequired: true,
|
|
initialValue: "",
|
|
},
|
|
],
|
|
},
|
|
output: true,
|
|
},
|
|
{
|
|
input: {
|
|
label: "Select Bucket to Query",
|
|
children: [
|
|
{
|
|
label: "Bucket Name",
|
|
configProperty: "actionConfiguration.formData.bucket.data",
|
|
controlType: "QUERY_DYNAMIC_INPUT_TEXT",
|
|
evaluationSubstitutionType: "TEMPLATE",
|
|
isRequired: true,
|
|
initialValue: "",
|
|
},
|
|
],
|
|
},
|
|
output: false,
|
|
},
|
|
];
|
|
|
|
testCases.forEach((testCase) => {
|
|
const output = isValidFormConfig(testCase.input);
|
|
expect(output).toEqual(testCase.output);
|
|
});
|
|
});
|
|
|
|
it("update section config tests", () => {
|
|
const testCases = [
|
|
{
|
|
input: {
|
|
sectionObject: {
|
|
key1: "valueX",
|
|
key2: "valueY",
|
|
disabled: false,
|
|
visible: false,
|
|
controlType: "SECTION",
|
|
},
|
|
path: "updateSectionConfigTest1",
|
|
},
|
|
output: {
|
|
key1: "value1",
|
|
key2: "value2",
|
|
disabled: false,
|
|
visible: false,
|
|
controlType: "SECTION",
|
|
},
|
|
},
|
|
{
|
|
input: {
|
|
sectionObject: {
|
|
key1: "valueX",
|
|
key2: "valueY",
|
|
disabled: false,
|
|
visible: false,
|
|
controlType: "SECTION",
|
|
},
|
|
path: "updateSectionConfigTest2",
|
|
},
|
|
output: {
|
|
key1: "valueX",
|
|
key2: "valueY",
|
|
disabled: false,
|
|
visible: false,
|
|
controlType: "SECTION",
|
|
},
|
|
},
|
|
];
|
|
|
|
testCases.forEach((testCase) => {
|
|
const output = updateEvaluatedSectionConfig(
|
|
testCase.input.sectionObject,
|
|
formEvaluation[testCase.input.path],
|
|
);
|
|
expect(output).toEqual(testCase.output);
|
|
});
|
|
});
|
|
});
|
|
|
|
// Constant evaluation object used for testing
|
|
const formEvaluation: Record<string, any> = {
|
|
propertyName: {
|
|
conditionals: {},
|
|
visible: false,
|
|
enabled: true,
|
|
},
|
|
configProperty: {
|
|
conditionals: {},
|
|
visible: true,
|
|
enabled: false,
|
|
},
|
|
identifier: {
|
|
conditionals: {},
|
|
visible: true,
|
|
enabled: true,
|
|
},
|
|
identifier2: {
|
|
conditionals: {},
|
|
enabled: false,
|
|
},
|
|
identifier3: {
|
|
conditionals: {},
|
|
visible: false,
|
|
},
|
|
identifier4: {
|
|
conditionals: {},
|
|
visible: true,
|
|
evaluateFormConfig: {
|
|
updateEvaluatedConfig: false,
|
|
},
|
|
},
|
|
identifier5: {
|
|
conditionals: {},
|
|
visible: true,
|
|
evaluateFormConfig: {
|
|
updateEvaluatedConfig: "false",
|
|
},
|
|
},
|
|
updateSectionConfigTest1: {
|
|
conditionals: {},
|
|
visible: true,
|
|
enabled: true,
|
|
evaluateFormConfig: {
|
|
updateEvaluatedConfig: true,
|
|
evaluateFormConfigObject: {
|
|
key1: { output: "value1" },
|
|
key2: { output: "value2" },
|
|
},
|
|
},
|
|
},
|
|
updateSectionConfigTest2: {
|
|
conditionals: {},
|
|
visible: true,
|
|
enabled: true,
|
|
evaluateFormConfig: {
|
|
updateEvaluatedConfig: false,
|
|
evaluateFormConfigObject: {
|
|
key1: { output: "value1" },
|
|
key2: { output: "value2" },
|
|
},
|
|
},
|
|
},
|
|
};
|