2024-01-17 18:17:01 +01:00
|
|
|
import { expect, describe, it, vi } from "vitest"
|
|
|
|
import {
|
|
|
|
runtimeToReadableBinding,
|
|
|
|
readableToRuntimeBinding,
|
|
|
|
updateReferencesInObject,
|
2024-02-01 10:55:30 +01:00
|
|
|
} from "./dataBinding"
|
2024-01-17 18:17:01 +01:00
|
|
|
|
|
|
|
describe("Builder dataBinding", () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
vi.clearAllMocks()
|
|
|
|
})
|
|
|
|
|
|
|
|
describe("runtimeToReadableBinding", () => {
|
|
|
|
const bindableProperties = [
|
|
|
|
{
|
|
|
|
category: "Current User",
|
|
|
|
icon: "User",
|
|
|
|
providerId: "user",
|
|
|
|
readableBinding: "Current User.firstName",
|
|
|
|
runtimeBinding: "[user].[firstName]",
|
|
|
|
type: "context",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
category: "Bindings",
|
|
|
|
icon: "Brackets",
|
|
|
|
readableBinding: "Binding.count",
|
|
|
|
runtimeBinding: "count",
|
|
|
|
type: "context",
|
|
|
|
},
|
|
|
|
]
|
|
|
|
it("should convert a runtime binding to a readable one", () => {
|
|
|
|
const textWithBindings = `Hello {{ [user].[firstName] }}! The count is {{ count }}.`
|
|
|
|
expect(
|
|
|
|
runtimeToReadableBinding(
|
|
|
|
bindableProperties,
|
|
|
|
textWithBindings,
|
|
|
|
"readableBinding"
|
|
|
|
)
|
|
|
|
).toEqual(
|
|
|
|
`Hello {{ Current User.firstName }}! The count is {{ Binding.count }}.`
|
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
it("should not convert to readable binding if it is already readable", () => {
|
|
|
|
const textWithBindings = `Hello {{ [user].[firstName] }}! The count is {{ Binding.count }}.`
|
|
|
|
expect(
|
|
|
|
runtimeToReadableBinding(
|
|
|
|
bindableProperties,
|
|
|
|
textWithBindings,
|
|
|
|
"readableBinding"
|
|
|
|
)
|
|
|
|
).toEqual(
|
|
|
|
`Hello {{ Current User.firstName }}! The count is {{ Binding.count }}.`
|
|
|
|
)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
describe("readableToRuntimeBinding", () => {
|
|
|
|
const bindableProperties = [
|
|
|
|
{
|
|
|
|
category: "Current User",
|
|
|
|
icon: "User",
|
|
|
|
providerId: "user",
|
|
|
|
readableBinding: "Current User.firstName",
|
|
|
|
runtimeBinding: "[user].[firstName]",
|
|
|
|
type: "context",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
category: "Bindings",
|
|
|
|
icon: "Brackets",
|
|
|
|
readableBinding: "Binding.count",
|
|
|
|
runtimeBinding: "count",
|
|
|
|
type: "context",
|
|
|
|
},
|
|
|
|
]
|
|
|
|
it("should convert a readable binding to a runtime one", () => {
|
|
|
|
const textWithBindings = `Hello {{ Current User.firstName }}! The count is {{ Binding.count }}.`
|
|
|
|
expect(
|
|
|
|
readableToRuntimeBinding(
|
|
|
|
bindableProperties,
|
|
|
|
textWithBindings,
|
|
|
|
"runtimeBinding"
|
|
|
|
)
|
|
|
|
).toEqual(`Hello {{ [user].[firstName] }}! The count is {{ count }}.`)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
describe("updateReferencesInObject", () => {
|
|
|
|
it("should increment steps in sequence on 'add'", () => {
|
|
|
|
let obj = [
|
|
|
|
{
|
|
|
|
id: "a0",
|
|
|
|
parameters: {
|
|
|
|
text: "Alpha",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "a1",
|
|
|
|
parameters: {
|
|
|
|
text: "Apple",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "b2",
|
|
|
|
parameters: {
|
|
|
|
text: "Banana {{ actions.1.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "c3",
|
|
|
|
parameters: {
|
|
|
|
text: "Carrot {{ actions.1.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "d4",
|
|
|
|
parameters: {
|
|
|
|
text: "Dog {{ actions.3.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "e5",
|
|
|
|
parameters: {
|
|
|
|
text: "Eagle {{ actions.4.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
]
|
|
|
|
updateReferencesInObject({
|
|
|
|
obj,
|
|
|
|
modifiedIndex: 0,
|
|
|
|
action: "add",
|
|
|
|
label: "actions",
|
|
|
|
})
|
|
|
|
|
|
|
|
expect(obj).toEqual([
|
|
|
|
{
|
|
|
|
id: "a0",
|
|
|
|
parameters: {
|
|
|
|
text: "Alpha",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "a1",
|
|
|
|
parameters: {
|
|
|
|
text: "Apple",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "b2",
|
|
|
|
parameters: {
|
|
|
|
text: "Banana {{ actions.2.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "c3",
|
|
|
|
parameters: {
|
|
|
|
text: "Carrot {{ actions.2.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "d4",
|
|
|
|
parameters: {
|
|
|
|
text: "Dog {{ actions.4.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "e5",
|
|
|
|
parameters: {
|
|
|
|
text: "Eagle {{ actions.5.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
])
|
|
|
|
})
|
|
|
|
|
|
|
|
it("should decrement steps in sequence on 'delete'", () => {
|
|
|
|
let obj = [
|
|
|
|
{
|
|
|
|
id: "a1",
|
|
|
|
parameters: {
|
|
|
|
text: "Apple",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "b2",
|
|
|
|
parameters: {
|
|
|
|
text: "Banana {{ actions.1.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "d4",
|
|
|
|
parameters: {
|
|
|
|
text: "Dog {{ actions.3.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "e5",
|
|
|
|
parameters: {
|
|
|
|
text: "Eagle {{ actions.4.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
]
|
|
|
|
updateReferencesInObject({
|
|
|
|
obj,
|
|
|
|
modifiedIndex: 2,
|
|
|
|
action: "delete",
|
|
|
|
label: "actions",
|
|
|
|
})
|
|
|
|
|
|
|
|
expect(obj).toEqual([
|
|
|
|
{
|
|
|
|
id: "a1",
|
|
|
|
parameters: {
|
|
|
|
text: "Apple",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "b2",
|
|
|
|
parameters: {
|
|
|
|
text: "Banana {{ actions.1.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "d4",
|
|
|
|
parameters: {
|
|
|
|
text: "Dog {{ actions.2.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "e5",
|
|
|
|
parameters: {
|
|
|
|
text: "Eagle {{ actions.3.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
])
|
|
|
|
})
|
|
|
|
|
|
|
|
it("should handle on 'move' to a lower index", () => {
|
|
|
|
let obj = [
|
|
|
|
{
|
|
|
|
id: "a1",
|
|
|
|
parameters: {
|
|
|
|
text: "Apple",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "b2",
|
|
|
|
parameters: {
|
|
|
|
text: "Banana {{ actions.0.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "e5",
|
|
|
|
parameters: {
|
|
|
|
text: "Eagle {{ actions.3.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "c3",
|
|
|
|
parameters: {
|
|
|
|
text: "Carrot {{ actions.0.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "d4",
|
|
|
|
parameters: {
|
|
|
|
text: "Dog {{ actions.2.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
]
|
|
|
|
updateReferencesInObject({
|
|
|
|
obj,
|
|
|
|
modifiedIndex: 2,
|
|
|
|
action: "move",
|
|
|
|
label: "actions",
|
|
|
|
originalIndex: 4,
|
|
|
|
})
|
|
|
|
|
|
|
|
expect(obj).toEqual([
|
|
|
|
{
|
|
|
|
id: "a1",
|
|
|
|
parameters: {
|
|
|
|
text: "Apple",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "b2",
|
|
|
|
parameters: {
|
|
|
|
text: "Banana {{ actions.0.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "e5",
|
|
|
|
parameters: {
|
|
|
|
text: "Eagle {{ actions.4.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "c3",
|
|
|
|
parameters: {
|
|
|
|
text: "Carrot {{ actions.0.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "d4",
|
|
|
|
parameters: {
|
|
|
|
text: "Dog {{ actions.3.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
])
|
|
|
|
})
|
|
|
|
|
|
|
|
it("should handle on 'move' to a higher index", () => {
|
|
|
|
let obj = [
|
|
|
|
{
|
|
|
|
id: "b2",
|
|
|
|
parameters: {
|
|
|
|
text: "Banana {{ actions.0.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "c3",
|
|
|
|
parameters: {
|
|
|
|
text: "Carrot {{ actions.0.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "a1",
|
|
|
|
parameters: {
|
|
|
|
text: "Apple",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "d4",
|
|
|
|
parameters: {
|
|
|
|
text: "Dog {{ actions.2.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "e5",
|
|
|
|
parameters: {
|
|
|
|
text: "Eagle {{ actions.3.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
]
|
|
|
|
updateReferencesInObject({
|
|
|
|
obj,
|
|
|
|
modifiedIndex: 2,
|
|
|
|
action: "move",
|
|
|
|
label: "actions",
|
|
|
|
originalIndex: 0,
|
|
|
|
})
|
|
|
|
|
|
|
|
expect(obj).toEqual([
|
|
|
|
{
|
|
|
|
id: "b2",
|
|
|
|
parameters: {
|
|
|
|
text: "Banana {{ actions.2.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "c3",
|
|
|
|
parameters: {
|
|
|
|
text: "Carrot {{ actions.2.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "a1",
|
|
|
|
parameters: {
|
|
|
|
text: "Apple",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "d4",
|
|
|
|
parameters: {
|
|
|
|
text: "Dog {{ actions.1.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "e5",
|
|
|
|
parameters: {
|
|
|
|
text: "Eagle {{ actions.3.row }}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
])
|
|
|
|
})
|
|
|
|
|
|
|
|
it("should handle on 'move' of action being referenced, dragged to a higher index", () => {
|
|
|
|
let obj = [
|
|
|
|
{
|
|
|
|
"##eventHandlerType": "Validate Form",
|
|
|
|
id: "cCD0Dwcnq",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"##eventHandlerType": "Close Screen Modal",
|
|
|
|
id: "3fbbIOfN0H",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"##eventHandlerType": "Save Row",
|
|
|
|
parameters: {
|
|
|
|
tableId: "ta_bb_employee",
|
|
|
|
},
|
|
|
|
id: "aehg5cTmhR",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"##eventHandlerType": "Close Side Panel",
|
|
|
|
id: "mzkpf86cxo",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"##eventHandlerType": "Navigate To",
|
|
|
|
id: "h0uDFeJa8A",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
parameters: {
|
|
|
|
autoDismiss: true,
|
|
|
|
type: "success",
|
|
|
|
message: "{{ actions.1.row }}",
|
|
|
|
},
|
|
|
|
"##eventHandlerType": "Show Notification",
|
|
|
|
id: "JEI5lAyJZ",
|
|
|
|
},
|
|
|
|
]
|
|
|
|
updateReferencesInObject({
|
|
|
|
obj,
|
|
|
|
modifiedIndex: 2,
|
|
|
|
action: "move",
|
|
|
|
label: "actions",
|
|
|
|
originalIndex: 1,
|
|
|
|
})
|
|
|
|
|
|
|
|
expect(obj).toEqual([
|
|
|
|
{
|
|
|
|
"##eventHandlerType": "Validate Form",
|
|
|
|
id: "cCD0Dwcnq",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"##eventHandlerType": "Close Screen Modal",
|
|
|
|
id: "3fbbIOfN0H",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"##eventHandlerType": "Save Row",
|
|
|
|
parameters: {
|
|
|
|
tableId: "ta_bb_employee",
|
|
|
|
},
|
|
|
|
id: "aehg5cTmhR",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"##eventHandlerType": "Close Side Panel",
|
|
|
|
id: "mzkpf86cxo",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"##eventHandlerType": "Navigate To",
|
|
|
|
id: "h0uDFeJa8A",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
parameters: {
|
|
|
|
autoDismiss: true,
|
|
|
|
type: "success",
|
|
|
|
message: "{{ actions.2.row }}",
|
|
|
|
},
|
|
|
|
"##eventHandlerType": "Show Notification",
|
|
|
|
id: "JEI5lAyJZ",
|
|
|
|
},
|
|
|
|
])
|
|
|
|
})
|
|
|
|
|
|
|
|
it("should handle on 'move' of action being referenced, dragged to a lower index", () => {
|
|
|
|
let obj = [
|
|
|
|
{
|
|
|
|
"##eventHandlerType": "Save Row",
|
|
|
|
parameters: {
|
|
|
|
tableId: "ta_bb_employee",
|
|
|
|
},
|
|
|
|
id: "aehg5cTmhR",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"##eventHandlerType": "Validate Form",
|
|
|
|
id: "cCD0Dwcnq",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"##eventHandlerType": "Close Screen Modal",
|
|
|
|
id: "3fbbIOfN0H",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"##eventHandlerType": "Close Side Panel",
|
|
|
|
id: "mzkpf86cxo",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"##eventHandlerType": "Navigate To",
|
|
|
|
id: "h0uDFeJa8A",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
parameters: {
|
|
|
|
autoDismiss: true,
|
|
|
|
type: "success",
|
|
|
|
message: "{{ actions.4.row }}",
|
|
|
|
},
|
|
|
|
"##eventHandlerType": "Show Notification",
|
|
|
|
id: "JEI5lAyJZ",
|
|
|
|
},
|
|
|
|
]
|
|
|
|
updateReferencesInObject({
|
|
|
|
obj,
|
|
|
|
modifiedIndex: 0,
|
|
|
|
action: "move",
|
|
|
|
label: "actions",
|
|
|
|
originalIndex: 4,
|
|
|
|
})
|
|
|
|
|
|
|
|
expect(obj).toEqual([
|
|
|
|
{
|
|
|
|
"##eventHandlerType": "Save Row",
|
|
|
|
parameters: {
|
|
|
|
tableId: "ta_bb_employee",
|
|
|
|
},
|
|
|
|
id: "aehg5cTmhR",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"##eventHandlerType": "Validate Form",
|
|
|
|
id: "cCD0Dwcnq",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"##eventHandlerType": "Close Screen Modal",
|
|
|
|
id: "3fbbIOfN0H",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"##eventHandlerType": "Close Side Panel",
|
|
|
|
id: "mzkpf86cxo",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"##eventHandlerType": "Navigate To",
|
|
|
|
id: "h0uDFeJa8A",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
parameters: {
|
|
|
|
autoDismiss: true,
|
|
|
|
type: "success",
|
|
|
|
message: "{{ actions.0.row }}",
|
|
|
|
},
|
|
|
|
"##eventHandlerType": "Show Notification",
|
|
|
|
id: "JEI5lAyJZ",
|
|
|
|
},
|
|
|
|
])
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|