@nyaruka/temba-components 0.140.0 → 0.141.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.lintstagedrc.js +10 -0
- package/CHANGELOG.md +22 -0
- package/dist/locales/es.js +5 -5
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/fr.js +5 -5
- package/dist/locales/fr.js.map +1 -1
- package/dist/locales/locale-codes.js +11 -2
- package/dist/locales/locale-codes.js.map +1 -1
- package/dist/locales/pt.js +5 -5
- package/dist/locales/pt.js.map +1 -1
- package/dist/temba-components.js +263 -156
- package/dist/temba-components.js.map +1 -1
- package/out-tsc/src/display/FloatingTab.js +1 -1
- package/out-tsc/src/display/FloatingTab.js.map +1 -1
- package/out-tsc/src/flow/CanvasNode.js +1 -1
- package/out-tsc/src/flow/CanvasNode.js.map +1 -1
- package/out-tsc/src/flow/Editor.js +239 -43
- package/out-tsc/src/flow/Editor.js.map +1 -1
- package/out-tsc/src/flow/Plumber.js +61 -14
- package/out-tsc/src/flow/Plumber.js.map +1 -1
- package/out-tsc/src/flow/actions/add_contact_groups.js +4 -1
- package/out-tsc/src/flow/actions/add_contact_groups.js.map +1 -1
- package/out-tsc/src/flow/actions/add_input_labels.js +4 -1
- package/out-tsc/src/flow/actions/add_input_labels.js.map +1 -1
- package/out-tsc/src/flow/actions/remove_contact_groups.js +6 -1
- package/out-tsc/src/flow/actions/remove_contact_groups.js.map +1 -1
- package/out-tsc/src/flow/actions/send_broadcast.js +6 -2
- package/out-tsc/src/flow/actions/send_broadcast.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_channel.js +13 -0
- package/out-tsc/src/flow/actions/set_contact_channel.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_status.js +7 -5
- package/out-tsc/src/flow/actions/set_contact_status.js.map +1 -1
- package/out-tsc/src/flow/actions/start_session.js +10 -3
- package/out-tsc/src/flow/actions/start_session.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_contact_field.js +18 -5
- package/out-tsc/src/flow/nodes/split_by_contact_field.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_expression.js +1 -1
- package/out-tsc/src/flow/nodes/split_by_expression.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_llm_categorize.js +0 -1
- package/out-tsc/src/flow/nodes/split_by_llm_categorize.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_random.js +0 -1
- package/out-tsc/src/flow/nodes/split_by_random.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_run_result.js +10 -4
- package/out-tsc/src/flow/nodes/split_by_run_result.js.map +1 -1
- package/out-tsc/src/flow/nodes/wait_for_digits.js +1 -1
- package/out-tsc/src/flow/nodes/wait_for_digits.js.map +1 -1
- package/out-tsc/src/flow/nodes/wait_for_response.js +1 -1
- package/out-tsc/src/flow/nodes/wait_for_response.js.map +1 -1
- package/out-tsc/src/form/FieldRenderer.js +7 -0
- package/out-tsc/src/form/FieldRenderer.js.map +1 -1
- package/out-tsc/src/layout/Dialog.js +0 -1
- package/out-tsc/src/layout/Dialog.js.map +1 -1
- package/out-tsc/src/layout/Modax.js +20 -2
- package/out-tsc/src/layout/Modax.js.map +1 -1
- package/out-tsc/src/list/ContentMenu.js +14 -1
- package/out-tsc/src/list/ContentMenu.js.map +1 -1
- package/out-tsc/src/live/ContactChat.js +10 -1
- package/out-tsc/src/live/ContactChat.js.map +1 -1
- package/out-tsc/src/live/TembaChart.js.map +1 -1
- package/out-tsc/src/locales/es.js +5 -5
- package/out-tsc/src/locales/es.js.map +1 -1
- package/out-tsc/src/locales/fr.js +5 -5
- package/out-tsc/src/locales/fr.js.map +1 -1
- package/out-tsc/src/locales/locale-codes.js +11 -2
- package/out-tsc/src/locales/locale-codes.js.map +1 -1
- package/out-tsc/src/locales/pt.js +5 -5
- package/out-tsc/src/locales/pt.js.map +1 -1
- package/out-tsc/src/simulator/Simulator.js +11 -0
- package/out-tsc/src/simulator/Simulator.js.map +1 -1
- package/out-tsc/src/store/AppState.js +13 -0
- package/out-tsc/src/store/AppState.js.map +1 -1
- package/out-tsc/src/version.js +9 -0
- package/out-tsc/src/version.js.map +1 -0
- package/out-tsc/test/actions/add_contact_groups.test.js +35 -0
- package/out-tsc/test/actions/add_contact_groups.test.js.map +1 -1
- package/out-tsc/test/actions/add_input_labels.test.js +53 -0
- package/out-tsc/test/actions/add_input_labels.test.js.map +1 -0
- package/out-tsc/test/actions/enter_flow.test.js +71 -0
- package/out-tsc/test/actions/enter_flow.test.js.map +1 -0
- package/out-tsc/test/actions/remove_contact_groups.test.js +24 -0
- package/out-tsc/test/actions/remove_contact_groups.test.js.map +1 -1
- package/out-tsc/test/actions/send_broadcast.test.js +41 -0
- package/out-tsc/test/actions/send_broadcast.test.js.map +1 -1
- package/out-tsc/test/actions/set_contact_channel.test.js +67 -0
- package/out-tsc/test/actions/set_contact_channel.test.js.map +1 -0
- package/out-tsc/test/actions/set_contact_field.test.js +52 -0
- package/out-tsc/test/actions/set_contact_field.test.js.map +1 -0
- package/out-tsc/test/actions/set_contact_language.test.js +39 -0
- package/out-tsc/test/actions/set_contact_language.test.js.map +1 -0
- package/out-tsc/test/actions/set_contact_name.test.js +28 -0
- package/out-tsc/test/actions/set_contact_name.test.js.map +1 -0
- package/out-tsc/test/actions/set_contact_status.test.js +44 -0
- package/out-tsc/test/actions/set_contact_status.test.js.map +1 -0
- package/out-tsc/test/actions/set_run_result.test.js +47 -0
- package/out-tsc/test/actions/set_run_result.test.js.map +1 -0
- package/out-tsc/test/actions/start_session.test.js +76 -0
- package/out-tsc/test/actions/start_session.test.js.map +1 -1
- package/out-tsc/test/nodes/split_by_contact_field.test.js +50 -0
- package/out-tsc/test/nodes/split_by_contact_field.test.js.map +1 -1
- package/out-tsc/test/nodes/split_by_run_result.test.js +82 -0
- package/out-tsc/test/nodes/split_by_run_result.test.js.map +1 -1
- package/out-tsc/test/nodes/split_by_ticket.test.js +139 -0
- package/out-tsc/test/nodes/split_by_ticket.test.js.map +1 -0
- package/out-tsc/test/nodes/split_by_webhook.test.js +111 -0
- package/out-tsc/test/nodes/split_by_webhook.test.js.map +1 -0
- package/out-tsc/test/temba-contact-chat.test.js +12 -0
- package/out-tsc/test/temba-contact-chat.test.js.map +1 -1
- package/out-tsc/test/temba-flow-editor.test.js +206 -0
- package/out-tsc/test/temba-flow-editor.test.js.map +1 -1
- package/out-tsc/test/temba-flow-plumber.test.js +19 -0
- package/out-tsc/test/temba-flow-plumber.test.js.map +1 -1
- package/out-tsc/test/temba-select.test.js +4 -1
- package/out-tsc/test/temba-select.test.js.map +1 -1
- package/out-tsc/test/utils.test.js +4 -2
- package/out-tsc/test/utils.test.js.map +1 -1
- package/package.json +3 -9
- package/rollup.components.mjs +7 -1
- package/screenshots/truth/actions/add_contact_groups/render/descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/long-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/many-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/multiple-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/single-group.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/expression-facebook.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/expression-phone.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/facebook-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/instagram-handle.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/line-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/phone-number.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/telegram-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/viber-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/wechat-id.png +0 -0
- package/screenshots/truth/actions/add_contact_urn/render/whatsapp.png +0 -0
- package/screenshots/truth/actions/add_input_labels/editor/multiple-labels.png +0 -0
- package/screenshots/truth/actions/add_input_labels/editor/single-label.png +0 -0
- package/screenshots/truth/actions/add_input_labels/render/multiple-labels.png +0 -0
- package/screenshots/truth/actions/add_input_labels/render/single-label.png +0 -0
- package/screenshots/truth/actions/enter_flow/editor/basic-flow.png +0 -0
- package/screenshots/truth/actions/enter_flow/editor/long-flow-name.png +0 -0
- package/screenshots/truth/actions/enter_flow/render/basic-flow.png +0 -0
- package/screenshots/truth/actions/enter_flow/render/long-flow-name.png +0 -0
- package/screenshots/truth/actions/play_audio/render/expression-url.png +0 -0
- package/screenshots/truth/actions/play_audio/render/static-url.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/cleanup-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/long-descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/many-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/multiple-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/remove-from-all-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/single-group.png +0 -0
- package/screenshots/truth/actions/say_msg/render/multiline-text.png +0 -0
- package/screenshots/truth/actions/say_msg/render/simple-text.png +0 -0
- package/screenshots/truth/actions/say_msg/render/text-with-audio-url.png +0 -0
- package/screenshots/truth/actions/send_broadcast/render/contacts-only.png +0 -0
- package/screenshots/truth/actions/send_broadcast/render/groups-and-contacts.png +0 -0
- package/screenshots/truth/actions/send_broadcast/render/groups-only.png +0 -0
- package/screenshots/truth/actions/send_broadcast/render/many-groups.png +0 -0
- package/screenshots/truth/actions/send_broadcast/render/multiline-text.png +0 -0
- package/screenshots/truth/actions/send_email/render/complex-business-email.png +0 -0
- package/screenshots/truth/actions/send_email/render/empty-body.png +0 -0
- package/screenshots/truth/actions/send_email/render/empty-subject.png +0 -0
- package/screenshots/truth/actions/send_email/render/long-subject.png +0 -0
- package/screenshots/truth/actions/send_email/render/multiline-body.png +0 -0
- package/screenshots/truth/actions/send_email/render/multiple-recipients.png +0 -0
- package/screenshots/truth/actions/send_email/render/simple-email.png +0 -0
- package/screenshots/truth/actions/send_email/render/with-expressions.png +0 -0
- package/screenshots/truth/actions/send_msg/render/long-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/multiline-text-with-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/simple-text.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-with-linebreaks.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-with-many-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-with-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-without-quick-replies.png +0 -0
- package/screenshots/truth/actions/set_contact_channel/editor/sms-channel.png +0 -0
- package/screenshots/truth/actions/set_contact_channel/editor/whatsapp-channel.png +0 -0
- package/screenshots/truth/actions/set_contact_channel/render/sms-channel.png +0 -0
- package/screenshots/truth/actions/set_contact_channel/render/whatsapp-channel.png +0 -0
- package/screenshots/truth/actions/set_contact_field/editor/clear-value.png +0 -0
- package/screenshots/truth/actions/set_contact_field/editor/set-value.png +0 -0
- package/screenshots/truth/actions/set_contact_field/render/clear-value.png +0 -0
- package/screenshots/truth/actions/set_contact_field/render/set-value.png +0 -0
- package/screenshots/truth/actions/set_contact_language/editor/english.png +0 -0
- package/screenshots/truth/actions/set_contact_language/editor/french.png +0 -0
- package/screenshots/truth/actions/set_contact_language/render/english.png +0 -0
- package/screenshots/truth/actions/set_contact_language/render/french.png +0 -0
- package/screenshots/truth/actions/set_contact_name/editor/expression-name.png +0 -0
- package/screenshots/truth/actions/set_contact_name/editor/static-name.png +0 -0
- package/screenshots/truth/actions/set_contact_name/render/expression-name.png +0 -0
- package/screenshots/truth/actions/set_contact_name/render/static-name.png +0 -0
- package/screenshots/truth/actions/set_contact_status/editor/active.png +0 -0
- package/screenshots/truth/actions/set_contact_status/editor/archived.png +0 -0
- package/screenshots/truth/actions/set_contact_status/editor/blocked.png +0 -0
- package/screenshots/truth/actions/set_contact_status/render/active.png +0 -0
- package/screenshots/truth/actions/set_contact_status/render/archived.png +0 -0
- package/screenshots/truth/actions/set_contact_status/render/blocked.png +0 -0
- package/screenshots/truth/actions/set_run_result/editor/expression-value.png +0 -0
- package/screenshots/truth/actions/set_run_result/editor/with-category.png +0 -0
- package/screenshots/truth/actions/set_run_result/render/expression-value.png +0 -0
- package/screenshots/truth/actions/set_run_result/render/with-category.png +0 -0
- package/screenshots/truth/actions/start_session/render/contact-query.png +0 -0
- package/screenshots/truth/actions/start_session/render/contacts-only.png +0 -0
- package/screenshots/truth/actions/start_session/render/create-contact.png +0 -0
- package/screenshots/truth/actions/start_session/render/groups-and-contacts.png +0 -0
- package/screenshots/truth/actions/start_session/render/groups-only.png +0 -0
- package/screenshots/truth/actions/start_session/render/many-recipients.png +0 -0
- package/screenshots/truth/editor/wait.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/render/information-extraction.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/render/sentiment-analysis.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/render/summarization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/render/translation-task.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/basic-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/custom-input-and-result-name.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/feedback-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/many-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/minimal-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/basic-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/custom-input-and-result-name.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/feedback-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/many-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/minimal-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/ab-test-multiple-variants.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/sampling-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/three-way-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/editor/two-bucket-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/ab-test-multiple-variants.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/sampling-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/three-way-split.png +0 -0
- package/screenshots/truth/nodes/split_by_random/render/two-bucket-split.png +0 -0
- package/screenshots/truth/nodes/wait_for_audio/render/basic-audio-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_dial/render/basic-dial.png +0 -0
- package/screenshots/truth/nodes/wait_for_dial/render/dial-with-limits.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/basic-digits-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/editor/digits-with-rules.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/basic-digits-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_digits/render/digits-with-rules.png +0 -0
- package/screenshots/truth/nodes/wait_for_menu/render/menu-with-digits.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/basic-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/custom-result-name.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/no-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/short-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/basic-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/custom-result-name.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/no-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/render/short-timeout.png +0 -0
- package/src/display/FloatingTab.ts +1 -1
- package/src/flow/CanvasNode.ts +1 -1
- package/src/flow/Editor.ts +299 -88
- package/src/flow/Plumber.ts +89 -14
- package/src/flow/actions/add_contact_groups.ts +4 -1
- package/src/flow/actions/add_input_labels.ts +4 -1
- package/src/flow/actions/remove_contact_groups.ts +6 -1
- package/src/flow/actions/send_broadcast.ts +6 -2
- package/src/flow/actions/set_contact_channel.ts +13 -1
- package/src/flow/actions/set_contact_status.ts +7 -5
- package/src/flow/actions/start_session.ts +10 -3
- package/src/flow/nodes/split_by_contact_field.ts +16 -5
- package/src/flow/nodes/split_by_expression.ts +1 -1
- package/src/flow/nodes/split_by_llm_categorize.ts +0 -1
- package/src/flow/nodes/split_by_random.ts +0 -1
- package/src/flow/nodes/split_by_run_result.ts +10 -4
- package/src/flow/nodes/wait_for_digits.ts +2 -1
- package/src/flow/nodes/wait_for_response.ts +1 -1
- package/src/form/FieldRenderer.ts +7 -0
- package/src/layout/Dialog.ts +0 -1
- package/src/layout/Modax.ts +19 -2
- package/src/list/ContentMenu.ts +15 -1
- package/src/live/ContactChat.ts +10 -1
- package/src/live/TembaChart.ts +1 -1
- package/src/locales/es.ts +18 -13
- package/src/locales/fr.ts +18 -13
- package/src/locales/locale-codes.ts +11 -2
- package/src/locales/pt.ts +18 -13
- package/src/simulator/Simulator.ts +12 -0
- package/src/store/AppState.ts +15 -0
- package/src/store/flow-definition.d.ts +1 -0
- package/src/version.ts +10 -0
- package/test/actions/add_contact_groups.test.ts +38 -0
- package/test/actions/add_input_labels.test.ts +67 -0
- package/test/actions/enter_flow.test.ts +88 -0
- package/test/actions/remove_contact_groups.test.ts +29 -0
- package/test/actions/send_broadcast.test.ts +44 -0
- package/test/actions/set_contact_channel.test.ts +88 -0
- package/test/actions/set_contact_field.test.ts +68 -0
- package/test/actions/set_contact_language.test.ts +55 -0
- package/test/actions/set_contact_name.test.ts +39 -0
- package/test/actions/set_contact_status.test.ts +64 -0
- package/test/actions/set_run_result.test.ts +61 -0
- package/test/actions/start_session.test.ts +82 -0
- package/test/nodes/split_by_contact_field.test.ts +59 -0
- package/test/nodes/split_by_run_result.test.ts +100 -0
- package/test/nodes/split_by_ticket.test.ts +157 -0
- package/test/nodes/split_by_webhook.test.ts +131 -0
- package/test/temba-contact-chat.test.ts +17 -0
- package/test/temba-flow-editor.test.ts +264 -0
- package/test/temba-flow-plumber.test.ts +62 -0
- package/test/temba-select.test.ts +6 -1
- package/test/utils.test.ts +4 -2
- package/web-dev-server.config.mjs +5 -1
- package/web-test-runner.config.mjs +4 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"split_by_run_result.test.js","sourceRoot":"","sources":["../../../test/nodes/split_by_run_result.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport { split_by_run_result } from '../../src/flow/nodes/split_by_run_result';\nimport { Node } from '../../src/store/flow-definition';\nimport { NodeTest } from '../NodeHelper';\nimport { zustand } from '../../src/store/AppState';\nimport { NODE_CONFIG } from '../../src/flow/config';\n\n/**\n * Test suite for the split_by_run_result node configuration.\n */\ndescribe('split_by_run_result node config', () => {\n const helper = new NodeTest(split_by_run_result, 'split_by_run_result');\n\n // Setup mock flow results in the store before each test\n beforeEach(() => {\n // Mock the store with flow results\n zustand.setState({\n flowInfo: {\n results: [\n {\n key: 'favorite_color',\n name: 'Favorite Color',\n categories: ['Red', 'Blue', 'Green'],\n node_uuids: ['node-1']\n },\n {\n key: 'age',\n name: 'Age',\n categories: ['Adult', 'Teen', 'Child'],\n node_uuids: ['node-2']\n }\n ],\n dependencies: [],\n counts: { nodes: 0, languages: 0 },\n locals: []\n }\n } as any);\n });\n\n describe('basic properties', () => {\n helper.testBasicProperties();\n\n it('has correct name', () => {\n expect(split_by_run_result.name).to.equal('Split by Result');\n });\n\n it('has correct type', () => {\n expect(split_by_run_result.type).to.equal('split_by_run_result');\n });\n\n it('has correct dialog size', () => {\n expect(split_by_run_result.dialogSize).to.equal('large');\n });\n });\n\n describe('toFormData', () => {\n it('should transform node with rules to form data correctly', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_phrase',\n arguments: ['red'],\n category_uuid: 'cat-1'\n },\n {\n uuid: 'case-2',\n type: 'has_any_word',\n arguments: ['blue', 'azure'],\n category_uuid: 'cat-2'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Red', exit_uuid: 'exit-1' },\n { uuid: 'cat-2', name: 'Blue', exit_uuid: 'exit-2' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other',\n result_name: 'color_category'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-2', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n }\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.uuid).to.equal('test-node-uuid');\n expect(formData.result).to.be.an('array');\n expect(formData.result[0].value).to.equal('favorite_color');\n expect(formData.result[0].name).to.equal('Favorite Color');\n expect(formData.rules).to.have.lengthOf(2);\n\n // Check first rule\n expect(formData.rules[0].operator.value).to.equal('has_phrase');\n expect(formData.rules[0].value1).to.equal('red');\n expect(formData.rules[0].category).to.equal('Red');\n\n // Check second rule\n expect(formData.rules[1].operator.value).to.equal('has_any_word');\n expect(formData.rules[1].value1).to.equal('blue azure');\n expect(formData.rules[1].category).to.equal('Blue');\n\n expect(formData.result_name).to.equal('color_category');\n });\n\n it('should transform node with no rules to form data correctly', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [],\n categories: [\n {\n uuid: 'cat-all',\n name: 'All Responses',\n exit_uuid: 'exit-all'\n }\n ],\n default_category_uuid: 'cat-all'\n },\n exits: [{ uuid: 'exit-all', destination_uuid: null }]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'age',\n name: 'Age'\n }\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.uuid).to.equal('test-node-uuid');\n expect(formData.result).to.be.an('array');\n expect(formData.result[0].value).to.equal('age');\n expect(formData.result[0].name).to.equal('Age');\n expect(formData.rules).to.have.lengthOf(0);\n expect(formData.result_name).to.equal('');\n });\n\n it('should handle missing nodeUI config gracefully', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [],\n categories: [\n {\n uuid: 'cat-all',\n name: 'All Responses',\n exit_uuid: 'exit-all'\n }\n ],\n default_category_uuid: 'cat-all'\n },\n exits: [{ uuid: 'exit-all', destination_uuid: null }]\n };\n\n const formData = split_by_run_result.toFormData!(node);\n\n expect(formData.uuid).to.equal('test-node-uuid');\n expect(formData.result).to.be.an('array');\n expect(formData.result).to.have.lengthOf(0);\n });\n\n it('should transform node with two-operand operators correctly', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_number_between',\n arguments: ['13', '17'],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Teen', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'age',\n name: 'Age'\n }\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.rules).to.have.lengthOf(1);\n expect(formData.rules[0].operator.value).to.equal('has_number_between');\n expect(formData.rules[0].value1).to.equal('13');\n expect(formData.rules[0].value2).to.equal('17');\n expect(formData.rules[0].category).to.equal('Teen');\n });\n\n it('should transform node with zero-operand operators correctly', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_number',\n arguments: [],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Has Number', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'age',\n name: 'Age'\n }\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.rules).to.have.lengthOf(1);\n expect(formData.rules[0].operator.value).to.equal('has_number');\n expect(formData.rules[0].value1).to.equal('');\n expect(formData.rules[0].value2).to.equal('');\n });\n });\n\n describe('fromFormData', () => {\n it('should transform form data with rules to node correctly', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n rules: [\n {\n operator: { value: 'has_phrase', name: 'has the phrase' },\n value1: 'red',\n value2: '',\n category: 'Red'\n },\n {\n operator: { value: 'has_any_word', name: 'has any of the words' },\n value1: 'blue azure',\n value2: '',\n category: 'Blue'\n }\n ],\n result_name: 'color_category'\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.uuid).to.equal('test-node-uuid');\n expect(resultNode.router).to.exist;\n expect(resultNode.router!.type).to.equal('switch');\n expect(resultNode.router!.operand).to.equal('@results.favorite_color');\n expect(resultNode.router!.result_name).to.equal('color_category');\n\n // Verify cases\n expect(resultNode.router!.cases).to.have.lengthOf(2);\n expect(resultNode.router!.cases![0].type).to.equal('has_phrase');\n expect(resultNode.router!.cases![0].arguments).to.deep.equal(['red']);\n expect(resultNode.router!.cases![1].type).to.equal('has_any_word');\n expect(resultNode.router!.cases![1].arguments).to.deep.equal([\n 'blue',\n 'azure'\n ]);\n\n // Verify categories\n expect(resultNode.router!.categories).to.have.lengthOf(3); // Red, Blue, Other\n expect(resultNode.router!.categories[0].name).to.equal('Red');\n expect(resultNode.router!.categories[1].name).to.equal('Blue');\n expect(resultNode.router!.categories[2].name).to.equal('Other');\n\n // Verify exits\n expect(resultNode.exits).to.have.lengthOf(3);\n });\n\n it('should transform form data without rules to node correctly', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'age', name: 'Age' }],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.uuid).to.equal('test-node-uuid');\n expect(resultNode.router).to.exist;\n expect(resultNode.router!.type).to.equal('switch');\n expect(resultNode.router!.operand).to.equal('@results.age');\n expect(resultNode.router!.result_name).to.be.undefined;\n\n // Should have only the default 'All Responses' category (no rules means \"All Responses\")\n expect(resultNode.router!.categories).to.have.lengthOf(1);\n expect(resultNode.router!.categories[0].name).to.equal('All Responses');\n\n // Should have one exit\n expect(resultNode.exits).to.have.lengthOf(1);\n });\n\n it('should not set result_name if empty', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.result_name).to.be.undefined;\n });\n\n it('should preserve existing UUIDs when updating categories', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n rules: [\n {\n operator: { value: 'has_phrase', name: 'has the phrase' },\n value1: 'red',\n value2: '',\n category: 'Red'\n }\n ],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [\n {\n uuid: 'existing-case-uuid',\n type: 'has_phrase',\n arguments: ['red'],\n category_uuid: 'existing-cat-uuid'\n }\n ],\n categories: [\n {\n uuid: 'existing-cat-uuid',\n name: 'Red',\n exit_uuid: 'existing-exit-uuid'\n },\n {\n uuid: 'existing-other-uuid',\n name: 'Other',\n exit_uuid: 'existing-other-exit-uuid'\n }\n ],\n default_category_uuid: 'existing-other-uuid'\n },\n exits: [\n { uuid: 'existing-exit-uuid', destination_uuid: 'some-node' },\n { uuid: 'existing-other-exit-uuid', destination_uuid: null }\n ]\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n // Should preserve existing category UUIDs\n const redCategory = resultNode.router!.categories.find(\n (cat) => cat.name === 'Red'\n );\n expect(redCategory!.uuid).to.equal('existing-cat-uuid');\n expect(redCategory!.exit_uuid).to.equal('existing-exit-uuid');\n\n const otherCategory = resultNode.router!.categories.find(\n (cat) => cat.name === 'Other'\n );\n expect(otherCategory!.uuid).to.equal('existing-other-uuid');\n expect(otherCategory!.exit_uuid).to.equal('existing-other-exit-uuid');\n\n // Should preserve exit destinations\n const redExit = resultNode.exits.find(\n (exit) => exit.uuid === 'existing-exit-uuid'\n );\n expect(redExit!.destination_uuid).to.equal('some-node');\n });\n\n it('should handle form data without result selection', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n // Should return the original node unchanged\n expect(resultNode).to.equal(originalNode);\n });\n\n it('should handle incomplete rules gracefully', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'age', name: 'Age' }],\n rules: [\n {\n operator: { value: 'has_number_gte', name: 'has a number above' },\n value1: '18',\n value2: '',\n category: 'Adult'\n },\n {\n operator: { value: 'has_number_lt', name: 'has a number below' },\n value1: '', // Missing value1\n value2: '',\n category: 'Child'\n },\n {\n operator: {\n value: 'has_number_between',\n name: 'has a number between'\n },\n value1: '10',\n value2: '', // Missing value2 for 2-operand operator\n category: 'Teen'\n }\n ],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n // Only the first complete rule should be included\n expect(resultNode.router!.cases).to.have.lengthOf(1);\n expect(resultNode.router!.cases![0].type).to.equal('has_number_gte');\n\n // Should have Adult category and Other\n expect(resultNode.router!.categories).to.have.lengthOf(2);\n expect(resultNode.router!.categories[0].name).to.equal('Adult');\n expect(resultNode.router!.categories[1].name).to.equal('Other');\n });\n\n it('should handle two-operand operators correctly', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'age', name: 'Age' }],\n rules: [\n {\n operator: {\n value: 'has_number_between',\n name: 'has a number between'\n },\n value1: '13',\n value2: '17',\n category: 'Teen'\n }\n ],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.cases).to.have.lengthOf(1);\n expect(resultNode.router!.cases![0].type).to.equal('has_number_between');\n expect(resultNode.router!.cases![0].arguments).to.deep.equal([\n '13',\n '17'\n ]);\n });\n });\n\n describe('validation', () => {\n it('should validate that a result is required', () => {\n const formData = {\n result: [],\n rules: [],\n result_name: ''\n };\n\n const validation = split_by_run_result.validate!(formData);\n\n expect(validation.valid).to.be.false;\n expect(validation.errors).to.have.property('result');\n expect(validation.errors.result).to.equal('A flow result is required');\n });\n\n it('should pass validation with valid result', () => {\n const formData = {\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n rules: [],\n result_name: ''\n };\n\n const validation = split_by_run_result.validate!(formData);\n\n expect(validation.valid).to.be.true;\n expect(validation.errors).to.deep.equal({});\n });\n\n it('should pass validation with result and rules', () => {\n const formData = {\n result: [{ value: 'age', name: 'Age' }],\n rules: [\n {\n operator: { value: 'has_number_gte', name: 'has a number above' },\n value1: '18',\n value2: '',\n category: 'Adult'\n }\n ],\n result_name: 'age_category'\n };\n\n const validation = split_by_run_result.validate!(formData);\n\n expect(validation.valid).to.be.true;\n expect(validation.errors).to.deep.equal({});\n });\n });\n\n describe('delimiter functionality', () => {\n describe('toFormData', () => {\n it('should extract delimiter configuration when enabled', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@(field(results.favorite_color, 2, \".\"))',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_phrase',\n arguments: ['red'],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Red', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other',\n result_name: 'color_category'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n },\n index: 2,\n delimiter: '.'\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.delimit_by).to.be.an('array');\n expect(formData.delimit_by[0].value).to.equal('.');\n expect(formData.delimit_by[0].name).to.equal('Delimited by periods');\n expect(formData.delimit_index).to.be.an('array');\n expect(formData.delimit_index[0].value).to.equal('2');\n expect(formData.delimit_index[0].name).to.equal('third result');\n });\n\n it('should handle delimiter not enabled', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [],\n categories: [\n {\n uuid: 'cat-all',\n name: 'All Responses',\n exit_uuid: 'exit-all'\n }\n ],\n default_category_uuid: 'cat-all'\n },\n exits: [{ uuid: 'exit-all', destination_uuid: null }]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n }\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.delimit_by).to.be.an('array');\n expect(formData.delimit_by[0].value).to.equal('');\n expect(formData.delimit_by[0].name).to.equal(\"Don't delimit result\");\n expect(formData.delimit_index).to.be.an('array');\n expect(formData.delimit_index[0].value).to.equal('0');\n });\n });\n\n describe('fromFormData', () => {\n it('should generate operand with field() function when delimiter enabled', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '+', name: 'plusses' }],\n delimit_index: [{ value: '1', name: 'second' }],\n rules: [\n {\n operator: { value: 'has_phrase', name: 'has the phrase' },\n value1: 'red',\n value2: '',\n category: 'Red'\n }\n ],\n result_name: 'color_category'\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.operand).to.equal(\n '@(field(results.favorite_color, 1, \"+\"))'\n );\n });\n\n it('should generate standard operand when delimiter not enabled', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '', name: \"Don't delimit\" }],\n delimit_index: [{ value: '0', name: 'first' }],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.operand).to.equal('@results.favorite_color');\n });\n\n it('should handle different field numbers correctly', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'age', name: 'Age' }],\n delimit_by: [{ value: '.', name: 'periods' }],\n delimit_index: [{ value: '9', name: 'tenth' }],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.operand).to.equal(\n '@(field(results.age, 9, \".\"))'\n );\n });\n\n it('should use default values when delimiter fields missing', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: ' ', name: 'spaces' }],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.operand).to.equal(\n '@(field(results.favorite_color, 0, \" \"))'\n );\n });\n });\n\n describe('toUIConfig', () => {\n it('should persist delimiter configuration when enabled', () => {\n const formData = {\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '+', name: 'plusses' }],\n delimit_index: [{ value: '3', name: 'fourth' }],\n rules: [],\n result_name: ''\n };\n\n const config = split_by_run_result.toUIConfig!(formData);\n\n expect(config.operand).to.exist;\n expect(config.operand.id).to.equal('favorite_color');\n expect(config.index).to.equal(3);\n expect(config.delimiter).to.equal('+');\n });\n\n it('should not include delimiter config when not enabled', () => {\n const formData = {\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '', name: \"Don't delimit\" }],\n delimit_index: [{ value: '0', name: 'first' }],\n rules: [],\n result_name: ''\n };\n\n const config = split_by_run_result.toUIConfig!(formData);\n\n expect(config.operand).to.exist;\n expect(config.operand.id).to.equal('favorite_color');\n expect(config.index).to.be.undefined;\n expect(config.delimiter).to.be.undefined;\n });\n\n it('should set type to split_by_run_result_delimited when delimiter is enabled', () => {\n const formData = {\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '+', name: 'plusses' }],\n delimit_index: [{ value: '3', name: 'fourth' }],\n rules: [],\n result_name: ''\n };\n\n const config = split_by_run_result.toUIConfig!(formData);\n\n expect(config.type).to.equal('split_by_run_result_delimited');\n });\n\n it('should set type to split_by_run_result when delimiter is not enabled', () => {\n const formData = {\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '', name: \"Don't delimit\" }],\n delimit_index: [{ value: '0', name: 'first' }],\n rules: [],\n result_name: ''\n };\n\n const config = split_by_run_result.toUIConfig!(formData);\n\n expect(config.type).to.equal('split_by_run_result');\n });\n });\n\n describe('round-trip tests', () => {\n it('should preserve delimiter configuration through toFormData and fromFormData', () => {\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@(field(results.favorite_color, 5, \".\"))',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_phrase',\n arguments: ['red'],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Red', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other',\n result_name: 'color_category'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n },\n index: 5,\n delimiter: '.'\n }\n };\n\n // Convert to form data\n const formData = split_by_run_result.toFormData!(originalNode, nodeUI);\n\n // Convert back to node\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n // Verify operand is preserved\n expect(resultNode.router!.operand).to.equal(\n '@(field(results.favorite_color, 5, \".\"))'\n );\n });\n\n it('should handle toggling delimiter on and off', () => {\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [],\n categories: [\n {\n uuid: 'cat-all',\n name: 'All Responses',\n exit_uuid: 'exit-all'\n }\n ],\n default_category_uuid: 'cat-all'\n },\n exits: [{ uuid: 'exit-all', destination_uuid: null }]\n };\n\n // Start with delimiter disabled\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n }\n }\n };\n\n // Convert to form data\n const formData = split_by_run_result.toFormData!(originalNode, nodeUI);\n expect(formData.delimit_by[0].value).to.equal('');\n\n // Enable delimiter\n formData.delimit_by = [{ value: '+', name: 'plusses' }];\n formData.delimit_index = [{ value: '2', name: 'third' }];\n\n // Convert to node\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.operand).to.equal(\n '@(field(results.favorite_color, 2, \"+\"))'\n );\n\n // Get UI config and verify it persists delimiter settings\n const config = split_by_run_result.toUIConfig!(formData);\n expect(config.index).to.equal(2);\n expect(config.delimiter).to.equal('+');\n });\n\n it('should properly remove delimiter when switching from delimited to non-delimited', () => {\n // Start with a node that has delimiter enabled\n const nodeWithDelimiter: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@(field(results.favorite_color, 2, \".\"))',\n cases: [],\n categories: [\n {\n uuid: 'cat-all',\n name: 'All Responses',\n exit_uuid: 'exit-all'\n }\n ],\n default_category_uuid: 'cat-all'\n },\n exits: [{ uuid: 'exit-all', destination_uuid: null }]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n }\n }\n };\n\n // Convert to form data - should show delimiter is enabled\n const formData = split_by_run_result.toFormData!(\n nodeWithDelimiter,\n nodeUI\n );\n expect(formData.delimit_by[0].value).to.equal('.');\n expect(formData.delimit_index[0].value).to.equal('2');\n\n // Now remove the delimiter by selecting \"Don't delimit result\"\n formData.delimit_by = [{ value: '', name: \"Don't delimit result\" }];\n\n // Convert back to node\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n nodeWithDelimiter\n );\n\n // Operand should now be standard without field() function\n expect(resultNode.router!.operand).to.equal('@results.favorite_color');\n\n // Get UI config - should NOT have index or delimiter\n const config = split_by_run_result.toUIConfig!(formData);\n expect(config.index).to.be.undefined;\n expect(config.delimiter).to.be.undefined;\n\n // Re-open the dialog - toFormData should show no delimiter\n const formDataReopened = split_by_run_result.toFormData!(\n resultNode,\n nodeUI\n );\n expect(formDataReopened.delimit_by[0].value).to.equal('');\n expect(formDataReopened.delimit_by[0].name).to.equal(\n \"Don't delimit result\"\n );\n });\n });\n });\n\n describe('backwards compatibility', () => {\n it('should support split_by_run_result_delimited type from old flows', () => {\n // Verify that split_by_run_result_delimited points to the same config as split_by_run_result\n expect(NODE_CONFIG['split_by_run_result_delimited']).to.equal(\n NODE_CONFIG['split_by_run_result']\n );\n expect(NODE_CONFIG['split_by_run_result_delimited']).to.equal(\n split_by_run_result\n );\n\n // Verify we can look up the config with the old type name\n const config = NODE_CONFIG['split_by_run_result_delimited'];\n expect(config).to.not.be.undefined;\n expect(config.name).to.equal('Split by Result');\n });\n\n it('should correctly process old flow with split_by_run_result_delimited type', () => {\n // Simulate a node from an old flow with the delimited type\n const oldNode: Node = {\n uuid: 'old-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@(field(results.bloop, 0, \"+\"))',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_any_word',\n arguments: ['red'],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Red', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const oldNodeUI = {\n type: 'split_by_run_result_delimited',\n config: {\n operand: {\n id: 'bloop',\n name: 'Bloop',\n type: 'result'\n },\n index: 0,\n delimiter: '+'\n }\n };\n\n // Get config using the old type name - this should work due to backwards compatibility\n const config = NODE_CONFIG[oldNodeUI.type];\n expect(config).to.not.be.undefined;\n\n // Verify we can convert to form data\n const formData = config.toFormData!(oldNode, oldNodeUI);\n expect(formData.result[0].id).to.equal('bloop');\n expect(formData.result[0].name).to.equal('Bloop');\n expect(formData.delimit_by[0].value).to.equal('+');\n expect(formData.delimit_index[0].value).to.equal('0');\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"split_by_run_result.test.js","sourceRoot":"","sources":["../../../test/nodes/split_by_run_result.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport { split_by_run_result } from '../../src/flow/nodes/split_by_run_result';\nimport { Node } from '../../src/store/flow-definition';\nimport { NodeTest } from '../NodeHelper';\nimport { zustand } from '../../src/store/AppState';\nimport { NODE_CONFIG } from '../../src/flow/config';\n\n/**\n * Test suite for the split_by_run_result node configuration.\n */\ndescribe('split_by_run_result node config', () => {\n const helper = new NodeTest(split_by_run_result, 'split_by_run_result');\n\n // Setup mock flow results in the store before each test\n beforeEach(() => {\n // Mock the store with flow results\n zustand.setState({\n flowInfo: {\n results: [\n {\n key: 'favorite_color',\n name: 'Favorite Color',\n categories: ['Red', 'Blue', 'Green'],\n node_uuids: ['node-1']\n },\n {\n key: 'age',\n name: 'Age',\n categories: ['Adult', 'Teen', 'Child'],\n node_uuids: ['node-2']\n }\n ],\n dependencies: [],\n counts: { nodes: 0, languages: 0 },\n locals: []\n }\n } as any);\n });\n\n describe('basic properties', () => {\n helper.testBasicProperties();\n\n it('has correct name', () => {\n expect(split_by_run_result.name).to.equal('Split by Result');\n });\n\n it('has correct type', () => {\n expect(split_by_run_result.type).to.equal('split_by_run_result');\n });\n\n it('has correct dialog size', () => {\n expect(split_by_run_result.dialogSize).to.equal('large');\n });\n });\n\n describe('toFormData', () => {\n it('should transform node with rules to form data correctly', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_phrase',\n arguments: ['red'],\n category_uuid: 'cat-1'\n },\n {\n uuid: 'case-2',\n type: 'has_any_word',\n arguments: ['blue', 'azure'],\n category_uuid: 'cat-2'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Red', exit_uuid: 'exit-1' },\n { uuid: 'cat-2', name: 'Blue', exit_uuid: 'exit-2' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other',\n result_name: 'color_category'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-2', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n }\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.uuid).to.equal('test-node-uuid');\n expect(formData.result).to.be.an('array');\n expect(formData.result[0].value).to.equal('favorite_color');\n expect(formData.result[0].name).to.equal('Favorite Color');\n expect(formData.rules).to.have.lengthOf(2);\n\n // Check first rule\n expect(formData.rules[0].operator.value).to.equal('has_phrase');\n expect(formData.rules[0].value1).to.equal('red');\n expect(formData.rules[0].category).to.equal('Red');\n\n // Check second rule\n expect(formData.rules[1].operator.value).to.equal('has_any_word');\n expect(formData.rules[1].value1).to.equal('blue azure');\n expect(formData.rules[1].category).to.equal('Blue');\n\n expect(formData.result_name).to.equal('color_category');\n });\n\n it('should transform node with no rules to form data correctly', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [],\n categories: [\n {\n uuid: 'cat-all',\n name: 'All Responses',\n exit_uuid: 'exit-all'\n }\n ],\n default_category_uuid: 'cat-all'\n },\n exits: [{ uuid: 'exit-all', destination_uuid: null }]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'age',\n name: 'Age'\n }\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.uuid).to.equal('test-node-uuid');\n expect(formData.result).to.be.an('array');\n expect(formData.result[0].value).to.equal('age');\n expect(formData.result[0].name).to.equal('Age');\n expect(formData.rules).to.have.lengthOf(0);\n expect(formData.result_name).to.equal('');\n });\n\n it('should handle missing nodeUI config gracefully', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [],\n categories: [\n {\n uuid: 'cat-all',\n name: 'All Responses',\n exit_uuid: 'exit-all'\n }\n ],\n default_category_uuid: 'cat-all'\n },\n exits: [{ uuid: 'exit-all', destination_uuid: null }]\n };\n\n const formData = split_by_run_result.toFormData!(node);\n\n expect(formData.uuid).to.equal('test-node-uuid');\n expect(formData.result).to.be.an('array');\n expect(formData.result).to.have.lengthOf(0);\n });\n\n it('should transform node with two-operand operators correctly', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_number_between',\n arguments: ['13', '17'],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Teen', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'age',\n name: 'Age'\n }\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.rules).to.have.lengthOf(1);\n expect(formData.rules[0].operator.value).to.equal('has_number_between');\n expect(formData.rules[0].value1).to.equal('13');\n expect(formData.rules[0].value2).to.equal('17');\n expect(formData.rules[0].category).to.equal('Teen');\n });\n\n it('should transform node with zero-operand operators correctly', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_number',\n arguments: [],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Has Number', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'age',\n name: 'Age'\n }\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.rules).to.have.lengthOf(1);\n expect(formData.rules[0].operator.value).to.equal('has_number');\n expect(formData.rules[0].value1).to.equal('');\n expect(formData.rules[0].value2).to.equal('');\n });\n });\n\n describe('fromFormData', () => {\n it('should transform form data with rules to node correctly', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n rules: [\n {\n operator: { value: 'has_phrase', name: 'has the phrase' },\n value1: 'red',\n value2: '',\n category: 'Red'\n },\n {\n operator: { value: 'has_any_word', name: 'has any of the words' },\n value1: 'blue azure',\n value2: '',\n category: 'Blue'\n }\n ],\n result_name: 'color_category'\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.uuid).to.equal('test-node-uuid');\n expect(resultNode.router).to.exist;\n expect(resultNode.router!.type).to.equal('switch');\n expect(resultNode.router!.operand).to.equal('@results.favorite_color');\n expect(resultNode.router!.result_name).to.equal('color_category');\n\n // Verify cases\n expect(resultNode.router!.cases).to.have.lengthOf(2);\n expect(resultNode.router!.cases![0].type).to.equal('has_phrase');\n expect(resultNode.router!.cases![0].arguments).to.deep.equal(['red']);\n expect(resultNode.router!.cases![1].type).to.equal('has_any_word');\n expect(resultNode.router!.cases![1].arguments).to.deep.equal([\n 'blue',\n 'azure'\n ]);\n\n // Verify categories\n expect(resultNode.router!.categories).to.have.lengthOf(3); // Red, Blue, Other\n expect(resultNode.router!.categories[0].name).to.equal('Red');\n expect(resultNode.router!.categories[1].name).to.equal('Blue');\n expect(resultNode.router!.categories[2].name).to.equal('Other');\n\n // Verify exits\n expect(resultNode.exits).to.have.lengthOf(3);\n });\n\n it('should transform form data without rules to node correctly', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'age', name: 'Age' }],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.uuid).to.equal('test-node-uuid');\n expect(resultNode.router).to.exist;\n expect(resultNode.router!.type).to.equal('switch');\n expect(resultNode.router!.operand).to.equal('@results.age');\n expect(resultNode.router!.result_name).to.be.undefined;\n\n // Should have only the default 'All Responses' category (no rules means \"All Responses\")\n expect(resultNode.router!.categories).to.have.lengthOf(1);\n expect(resultNode.router!.categories[0].name).to.equal('All Responses');\n\n // Should have one exit\n expect(resultNode.exits).to.have.lengthOf(1);\n });\n\n it('should not set result_name if empty', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.result_name).to.be.undefined;\n });\n\n it('should preserve existing UUIDs when updating categories', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n rules: [\n {\n operator: { value: 'has_phrase', name: 'has the phrase' },\n value1: 'red',\n value2: '',\n category: 'Red'\n }\n ],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [\n {\n uuid: 'existing-case-uuid',\n type: 'has_phrase',\n arguments: ['red'],\n category_uuid: 'existing-cat-uuid'\n }\n ],\n categories: [\n {\n uuid: 'existing-cat-uuid',\n name: 'Red',\n exit_uuid: 'existing-exit-uuid'\n },\n {\n uuid: 'existing-other-uuid',\n name: 'Other',\n exit_uuid: 'existing-other-exit-uuid'\n }\n ],\n default_category_uuid: 'existing-other-uuid'\n },\n exits: [\n { uuid: 'existing-exit-uuid', destination_uuid: 'some-node' },\n { uuid: 'existing-other-exit-uuid', destination_uuid: null }\n ]\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n // Should preserve existing category UUIDs\n const redCategory = resultNode.router!.categories.find(\n (cat) => cat.name === 'Red'\n );\n expect(redCategory!.uuid).to.equal('existing-cat-uuid');\n expect(redCategory!.exit_uuid).to.equal('existing-exit-uuid');\n\n const otherCategory = resultNode.router!.categories.find(\n (cat) => cat.name === 'Other'\n );\n expect(otherCategory!.uuid).to.equal('existing-other-uuid');\n expect(otherCategory!.exit_uuid).to.equal('existing-other-exit-uuid');\n\n // Should preserve exit destinations\n const redExit = resultNode.exits.find(\n (exit) => exit.uuid === 'existing-exit-uuid'\n );\n expect(redExit!.destination_uuid).to.equal('some-node');\n });\n\n it('should handle form data without result selection', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n // Should return the original node unchanged\n expect(resultNode).to.equal(originalNode);\n });\n\n it('should handle incomplete rules gracefully', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'age', name: 'Age' }],\n rules: [\n {\n operator: { value: 'has_number_gte', name: 'has a number above' },\n value1: '18',\n value2: '',\n category: 'Adult'\n },\n {\n operator: { value: 'has_number_lt', name: 'has a number below' },\n value1: '', // Missing value1\n value2: '',\n category: 'Child'\n },\n {\n operator: {\n value: 'has_number_between',\n name: 'has a number between'\n },\n value1: '10',\n value2: '', // Missing value2 for 2-operand operator\n category: 'Teen'\n }\n ],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n // Only the first complete rule should be included\n expect(resultNode.router!.cases).to.have.lengthOf(1);\n expect(resultNode.router!.cases![0].type).to.equal('has_number_gte');\n\n // Should have Adult category and Other\n expect(resultNode.router!.categories).to.have.lengthOf(2);\n expect(resultNode.router!.categories[0].name).to.equal('Adult');\n expect(resultNode.router!.categories[1].name).to.equal('Other');\n });\n\n it('should handle two-operand operators correctly', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'age', name: 'Age' }],\n rules: [\n {\n operator: {\n value: 'has_number_between',\n name: 'has a number between'\n },\n value1: '13',\n value2: '17',\n category: 'Teen'\n }\n ],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.cases).to.have.lengthOf(1);\n expect(resultNode.router!.cases![0].type).to.equal('has_number_between');\n expect(resultNode.router!.cases![0].arguments).to.deep.equal([\n '13',\n '17'\n ]);\n });\n });\n\n describe('validation', () => {\n it('should validate that a result is required', () => {\n const formData = {\n result: [],\n rules: [],\n result_name: ''\n };\n\n const validation = split_by_run_result.validate!(formData);\n\n expect(validation.valid).to.be.false;\n expect(validation.errors).to.have.property('result');\n expect(validation.errors.result).to.equal('A flow result is required');\n });\n\n it('should pass validation with valid result', () => {\n const formData = {\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n rules: [],\n result_name: ''\n };\n\n const validation = split_by_run_result.validate!(formData);\n\n expect(validation.valid).to.be.true;\n expect(validation.errors).to.deep.equal({});\n });\n\n it('should pass validation with result and rules', () => {\n const formData = {\n result: [{ value: 'age', name: 'Age' }],\n rules: [\n {\n operator: { value: 'has_number_gte', name: 'has a number above' },\n value1: '18',\n value2: '',\n category: 'Adult'\n }\n ],\n result_name: 'age_category'\n };\n\n const validation = split_by_run_result.validate!(formData);\n\n expect(validation.valid).to.be.true;\n expect(validation.errors).to.deep.equal({});\n });\n });\n\n describe('delimiter functionality', () => {\n describe('toFormData', () => {\n it('should extract delimiter configuration when enabled', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@(field(results.favorite_color, 2, \".\"))',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_phrase',\n arguments: ['red'],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Red', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other',\n result_name: 'color_category'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n },\n index: 2,\n delimiter: '.'\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.delimit_by).to.be.an('array');\n expect(formData.delimit_by[0].value).to.equal('.');\n expect(formData.delimit_by[0].name).to.equal('Delimited by periods');\n expect(formData.delimit_index).to.be.an('array');\n expect(formData.delimit_index[0].value).to.equal('2');\n expect(formData.delimit_index[0].name).to.equal('third result');\n });\n\n it('should handle delimiter not enabled', () => {\n const node: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [],\n categories: [\n {\n uuid: 'cat-all',\n name: 'All Responses',\n exit_uuid: 'exit-all'\n }\n ],\n default_category_uuid: 'cat-all'\n },\n exits: [{ uuid: 'exit-all', destination_uuid: null }]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n }\n }\n };\n\n const formData = split_by_run_result.toFormData!(node, nodeUI);\n\n expect(formData.delimit_by).to.be.an('array');\n expect(formData.delimit_by[0].value).to.equal('');\n expect(formData.delimit_by[0].name).to.equal(\"Don't delimit result\");\n expect(formData.delimit_index).to.be.an('array');\n expect(formData.delimit_index[0].value).to.equal('0');\n });\n });\n\n describe('fromFormData', () => {\n it('should generate operand with field() function when delimiter enabled', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '+', name: 'plusses' }],\n delimit_index: [{ value: '1', name: 'second' }],\n rules: [\n {\n operator: { value: 'has_phrase', name: 'has the phrase' },\n value1: 'red',\n value2: '',\n category: 'Red'\n }\n ],\n result_name: 'color_category'\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.operand).to.equal(\n '@(field(results.favorite_color, 1, \"+\"))'\n );\n });\n\n it('should generate standard operand when delimiter not enabled', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '', name: \"Don't delimit\" }],\n delimit_index: [{ value: '0', name: 'first' }],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.operand).to.equal('@results.favorite_color');\n });\n\n it('should handle different field numbers correctly', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'age', name: 'Age' }],\n delimit_by: [{ value: '.', name: 'periods' }],\n delimit_index: [{ value: '9', name: 'tenth' }],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.age',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.operand).to.equal(\n '@(field(results.age, 9, \".\"))'\n );\n });\n\n it('should use default values when delimiter fields missing', () => {\n const formData = {\n uuid: 'test-node-uuid',\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: ' ', name: 'spaces' }],\n rules: [],\n result_name: ''\n };\n\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.old_result',\n cases: [],\n categories: [],\n default_category_uuid: ''\n },\n exits: []\n };\n\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.operand).to.equal(\n '@(field(results.favorite_color, 0, \" \"))'\n );\n });\n });\n\n describe('toUIConfig', () => {\n it('should persist delimiter configuration when enabled', () => {\n const formData = {\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '+', name: 'plusses' }],\n delimit_index: [{ value: '3', name: 'fourth' }],\n rules: [],\n result_name: ''\n };\n\n const config = split_by_run_result.toUIConfig!(formData);\n\n expect(config.operand).to.exist;\n expect(config.operand.id).to.equal('favorite_color');\n expect(config.index).to.equal(3);\n expect(config.delimiter).to.equal('+');\n });\n\n it('should not include delimiter config when not enabled', () => {\n const formData = {\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '', name: \"Don't delimit\" }],\n delimit_index: [{ value: '0', name: 'first' }],\n rules: [],\n result_name: ''\n };\n\n const config = split_by_run_result.toUIConfig!(formData);\n\n expect(config.operand).to.exist;\n expect(config.operand.id).to.equal('favorite_color');\n expect(config.index).to.be.undefined;\n expect(config.delimiter).to.be.undefined;\n });\n\n it('should set type to split_by_run_result_delimited when delimiter is enabled', () => {\n const formData = {\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '+', name: 'plusses' }],\n delimit_index: [{ value: '3', name: 'fourth' }],\n rules: [],\n result_name: ''\n };\n\n const config = split_by_run_result.toUIConfig!(formData);\n\n expect(config.type).to.equal('split_by_run_result_delimited');\n });\n\n it('should set type to split_by_run_result when delimiter is not enabled', () => {\n const formData = {\n result: [{ value: 'favorite_color', name: 'Favorite Color' }],\n delimit_by: [{ value: '', name: \"Don't delimit\" }],\n delimit_index: [{ value: '0', name: 'first' }],\n rules: [],\n result_name: ''\n };\n\n const config = split_by_run_result.toUIConfig!(formData);\n\n expect(config.type).to.equal('split_by_run_result');\n });\n });\n\n describe('round-trip tests', () => {\n it('should preserve delimiter configuration through toFormData and fromFormData', () => {\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@(field(results.favorite_color, 5, \".\"))',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_phrase',\n arguments: ['red'],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Red', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other',\n result_name: 'color_category'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n },\n index: 5,\n delimiter: '.'\n }\n };\n\n // Convert to form data\n const formData = split_by_run_result.toFormData!(originalNode, nodeUI);\n\n // Convert back to node\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n // Verify operand is preserved\n expect(resultNode.router!.operand).to.equal(\n '@(field(results.favorite_color, 5, \".\"))'\n );\n });\n\n it('should handle toggling delimiter on and off', () => {\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [],\n categories: [\n {\n uuid: 'cat-all',\n name: 'All Responses',\n exit_uuid: 'exit-all'\n }\n ],\n default_category_uuid: 'cat-all'\n },\n exits: [{ uuid: 'exit-all', destination_uuid: null }]\n };\n\n // Start with delimiter disabled\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n }\n }\n };\n\n // Convert to form data\n const formData = split_by_run_result.toFormData!(originalNode, nodeUI);\n expect(formData.delimit_by[0].value).to.equal('');\n\n // Enable delimiter\n formData.delimit_by = [{ value: '+', name: 'plusses' }];\n formData.delimit_index = [{ value: '2', name: 'third' }];\n\n // Convert to node\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n expect(resultNode.router!.operand).to.equal(\n '@(field(results.favorite_color, 2, \"+\"))'\n );\n\n // Get UI config and verify it persists delimiter settings\n const config = split_by_run_result.toUIConfig!(formData);\n expect(config.index).to.equal(2);\n expect(config.delimiter).to.equal('+');\n });\n\n it('should properly remove delimiter when switching from delimited to non-delimited', () => {\n // Start with a node that has delimiter enabled\n const nodeWithDelimiter: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@(field(results.favorite_color, 2, \".\"))',\n cases: [],\n categories: [\n {\n uuid: 'cat-all',\n name: 'All Responses',\n exit_uuid: 'exit-all'\n }\n ],\n default_category_uuid: 'cat-all'\n },\n exits: [{ uuid: 'exit-all', destination_uuid: null }]\n };\n\n const nodeUI = {\n config: {\n operand: {\n value: 'favorite_color',\n name: 'Favorite Color'\n }\n }\n };\n\n // Convert to form data - should show delimiter is enabled\n const formData = split_by_run_result.toFormData!(\n nodeWithDelimiter,\n nodeUI\n );\n expect(formData.delimit_by[0].value).to.equal('.');\n expect(formData.delimit_index[0].value).to.equal('2');\n\n // Now remove the delimiter by selecting \"Don't delimit result\"\n formData.delimit_by = [{ value: '', name: \"Don't delimit result\" }];\n\n // Convert back to node\n const resultNode = split_by_run_result.fromFormData!(\n formData,\n nodeWithDelimiter\n );\n\n // Operand should now be standard without field() function\n expect(resultNode.router!.operand).to.equal('@results.favorite_color');\n\n // Get UI config - should NOT have index or delimiter\n const config = split_by_run_result.toUIConfig!(formData);\n expect(config.index).to.be.undefined;\n expect(config.delimiter).to.be.undefined;\n\n // Re-open the dialog - toFormData should show no delimiter\n const formDataReopened = split_by_run_result.toFormData!(\n resultNode,\n nodeUI\n );\n expect(formDataReopened.delimit_by[0].value).to.equal('');\n expect(formDataReopened.delimit_by[0].name).to.equal(\n \"Don't delimit result\"\n );\n });\n });\n });\n\n describe('toFormData normalizes operand from toUIConfig', () => {\n it('should handle round-trip when operand has only id (no value)', () => {\n // Reproduces the bug: toUIConfig saves { id, name, type } without 'value',\n // then toFormData loads it, and fromFormData must still produce a valid operand.\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@results.favorite_color',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_phrase',\n arguments: ['red'],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Red', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other',\n result_name: ''\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n // nodeUI as saved by toUIConfig - note: NO 'value' property, only 'id'\n const nodeUI = {\n config: {\n operand: {\n id: 'favorite_color',\n name: 'Favorite Color',\n type: 'result'\n }\n }\n };\n\n // Step 1: toFormData (opening the editor)\n const formData = split_by_run_result.toFormData!(originalNode, nodeUI);\n\n // The result should have 'value' normalized from 'id'\n expect(formData.result[0].value).to.equal('favorite_color');\n\n // Step 2: fromFormData (saving without re-selecting the result)\n const updatedNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n\n // The operand must NOT be @results.undefined\n expect(updatedNode.router!.operand).to.equal('@results.favorite_color');\n });\n\n it('should handle round-trip with delimiter when operand has only id', () => {\n const originalNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@(field(results.favorite_color, 2, \".\"))',\n cases: [],\n categories: [\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other',\n result_name: ''\n },\n exits: [{ uuid: 'exit-other', destination_uuid: null }]\n };\n\n const nodeUI = {\n config: {\n operand: {\n id: 'favorite_color',\n name: 'Favorite Color',\n type: 'result'\n },\n index: 2,\n delimiter: '.'\n }\n };\n\n const formData = split_by_run_result.toFormData!(originalNode, nodeUI);\n expect(formData.result[0].value).to.equal('favorite_color');\n\n const updatedNode = split_by_run_result.fromFormData!(\n formData,\n originalNode\n );\n expect(updatedNode.router!.operand).to.equal(\n '@(field(results.favorite_color, 2, \".\"))'\n );\n });\n });\n\n describe('backwards compatibility', () => {\n it('should support split_by_run_result_delimited type from old flows', () => {\n // Verify that split_by_run_result_delimited points to the same config as split_by_run_result\n expect(NODE_CONFIG['split_by_run_result_delimited']).to.equal(\n NODE_CONFIG['split_by_run_result']\n );\n expect(NODE_CONFIG['split_by_run_result_delimited']).to.equal(\n split_by_run_result\n );\n\n // Verify we can look up the config with the old type name\n const config = NODE_CONFIG['split_by_run_result_delimited'];\n expect(config).to.not.be.undefined;\n expect(config.name).to.equal('Split by Result');\n });\n\n it('should correctly process old flow with split_by_run_result_delimited type', () => {\n // Simulate a node from an old flow with the delimited type\n const oldNode: Node = {\n uuid: 'old-node-uuid',\n actions: [],\n router: {\n type: 'switch',\n operand: '@(field(results.bloop, 0, \"+\"))',\n cases: [\n {\n uuid: 'case-1',\n type: 'has_any_word',\n arguments: ['red'],\n category_uuid: 'cat-1'\n }\n ],\n categories: [\n { uuid: 'cat-1', name: 'Red', exit_uuid: 'exit-1' },\n { uuid: 'cat-other', name: 'Other', exit_uuid: 'exit-other' }\n ],\n default_category_uuid: 'cat-other'\n },\n exits: [\n { uuid: 'exit-1', destination_uuid: null },\n { uuid: 'exit-other', destination_uuid: null }\n ]\n };\n\n const oldNodeUI = {\n type: 'split_by_run_result_delimited',\n config: {\n operand: {\n id: 'bloop',\n name: 'Bloop',\n type: 'result'\n },\n index: 0,\n delimiter: '+'\n }\n };\n\n // Get config using the old type name - this should work due to backwards compatibility\n const config = NODE_CONFIG[oldNodeUI.type];\n expect(config).to.not.be.undefined;\n\n // Verify we can convert to form data\n const formData = config.toFormData!(oldNode, oldNodeUI);\n expect(formData.result[0].id).to.equal('bloop');\n expect(formData.result[0].name).to.equal('Bloop');\n expect(formData.delimit_by[0].value).to.equal('+');\n expect(formData.delimit_index[0].value).to.equal('0');\n });\n });\n});\n"]}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { expect } from '@open-wc/testing';
|
|
2
|
+
import { split_by_ticket } from '../../src/flow/nodes/split_by_ticket';
|
|
3
|
+
import { NodeTest } from '../NodeHelper';
|
|
4
|
+
/**
|
|
5
|
+
* Test suite for the split_by_ticket node configuration.
|
|
6
|
+
*/
|
|
7
|
+
describe('split_by_ticket node config', () => {
|
|
8
|
+
const helper = new NodeTest(split_by_ticket, 'split_by_ticket');
|
|
9
|
+
describe('basic properties', () => {
|
|
10
|
+
helper.testBasicProperties();
|
|
11
|
+
it('has correct type and name', () => {
|
|
12
|
+
expect(split_by_ticket.type).to.equal('split_by_ticket');
|
|
13
|
+
expect(split_by_ticket.name).to.equal('Open Ticket');
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
describe('round-trip transformation', () => {
|
|
17
|
+
it('should transform from flow definition to form data', () => {
|
|
18
|
+
const node = {
|
|
19
|
+
uuid: 'test-node',
|
|
20
|
+
actions: [
|
|
21
|
+
{
|
|
22
|
+
type: 'open_ticket',
|
|
23
|
+
uuid: 'action-1',
|
|
24
|
+
topic: { uuid: 'topic-1', name: 'General' },
|
|
25
|
+
assignee: { uuid: 'user-1', name: 'Alice' },
|
|
26
|
+
note: 'Test note'
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
exits: []
|
|
30
|
+
};
|
|
31
|
+
const formData = split_by_ticket.toFormData(node);
|
|
32
|
+
expect(formData.uuid).to.equal('test-node');
|
|
33
|
+
expect(formData.topic).to.have.lengthOf(1);
|
|
34
|
+
expect(formData.topic[0]).to.deep.equal({
|
|
35
|
+
uuid: 'topic-1',
|
|
36
|
+
name: 'General'
|
|
37
|
+
});
|
|
38
|
+
expect(formData.assignee).to.have.lengthOf(1);
|
|
39
|
+
expect(formData.assignee[0]).to.deep.equal({
|
|
40
|
+
uuid: 'user-1',
|
|
41
|
+
name: 'Alice'
|
|
42
|
+
});
|
|
43
|
+
expect(formData.note).to.equal('Test note');
|
|
44
|
+
});
|
|
45
|
+
it('should transform from form data to flow definition', () => {
|
|
46
|
+
const originalNode = {
|
|
47
|
+
uuid: 'test-node',
|
|
48
|
+
actions: [],
|
|
49
|
+
exits: []
|
|
50
|
+
};
|
|
51
|
+
const formData = {
|
|
52
|
+
uuid: 'test-node',
|
|
53
|
+
topic: [{ uuid: 'topic-1', name: 'General' }],
|
|
54
|
+
assignee: [{ uuid: 'user-1', name: 'Alice' }],
|
|
55
|
+
note: 'Test note'
|
|
56
|
+
};
|
|
57
|
+
const resultNode = split_by_ticket.fromFormData(formData, originalNode);
|
|
58
|
+
expect(resultNode.uuid).to.equal('test-node');
|
|
59
|
+
expect(resultNode.actions).to.have.lengthOf(1);
|
|
60
|
+
expect(resultNode.actions[0].type).to.equal('open_ticket');
|
|
61
|
+
expect(resultNode.actions[0].topic).to.deep.equal({
|
|
62
|
+
uuid: 'topic-1',
|
|
63
|
+
name: 'General'
|
|
64
|
+
});
|
|
65
|
+
expect(resultNode.actions[0].assignee).to.deep.equal({
|
|
66
|
+
uuid: 'user-1',
|
|
67
|
+
name: 'Alice'
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
it('should strip superfluous API metadata from topic and assignee', () => {
|
|
71
|
+
const originalNode = {
|
|
72
|
+
uuid: 'test-node',
|
|
73
|
+
actions: [],
|
|
74
|
+
exits: []
|
|
75
|
+
};
|
|
76
|
+
const formData = {
|
|
77
|
+
uuid: 'test-node',
|
|
78
|
+
topic: [
|
|
79
|
+
{
|
|
80
|
+
uuid: 'topic-1',
|
|
81
|
+
name: 'General',
|
|
82
|
+
created_on: '2024-01-01T00:00:00.000Z',
|
|
83
|
+
modified_on: '2024-06-15T12:00:00.000Z'
|
|
84
|
+
}
|
|
85
|
+
],
|
|
86
|
+
assignee: [
|
|
87
|
+
{
|
|
88
|
+
uuid: 'user-1',
|
|
89
|
+
name: 'Alice Johnson',
|
|
90
|
+
email: 'alice@example.com',
|
|
91
|
+
first_name: 'Alice',
|
|
92
|
+
last_name: 'Johnson',
|
|
93
|
+
role: 'agent',
|
|
94
|
+
created_on: '2024-01-01T00:00:00.000Z'
|
|
95
|
+
}
|
|
96
|
+
],
|
|
97
|
+
note: ''
|
|
98
|
+
};
|
|
99
|
+
const resultNode = split_by_ticket.fromFormData(formData, originalNode);
|
|
100
|
+
const action = resultNode.actions[0];
|
|
101
|
+
expect(action.topic).to.deep.equal({
|
|
102
|
+
uuid: 'topic-1',
|
|
103
|
+
name: 'General'
|
|
104
|
+
});
|
|
105
|
+
expect(action.assignee).to.deep.equal({
|
|
106
|
+
uuid: 'user-1',
|
|
107
|
+
name: 'Alice Johnson'
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
it('should handle assignee with only first_name/last_name (no name)', () => {
|
|
111
|
+
const originalNode = {
|
|
112
|
+
uuid: 'test-node',
|
|
113
|
+
actions: [],
|
|
114
|
+
exits: []
|
|
115
|
+
};
|
|
116
|
+
const formData = {
|
|
117
|
+
uuid: 'test-node',
|
|
118
|
+
topic: [{ uuid: 'topic-1', name: 'General' }],
|
|
119
|
+
assignee: [
|
|
120
|
+
{
|
|
121
|
+
uuid: 'user-1',
|
|
122
|
+
first_name: 'Bob',
|
|
123
|
+
last_name: 'Smith',
|
|
124
|
+
email: 'bob@example.com',
|
|
125
|
+
role: 'agent'
|
|
126
|
+
}
|
|
127
|
+
],
|
|
128
|
+
note: ''
|
|
129
|
+
};
|
|
130
|
+
const resultNode = split_by_ticket.fromFormData(formData, originalNode);
|
|
131
|
+
const action = resultNode.actions[0];
|
|
132
|
+
expect(action.assignee).to.deep.equal({
|
|
133
|
+
uuid: 'user-1',
|
|
134
|
+
name: 'Bob Smith'
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
//# sourceMappingURL=split_by_ticket.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"split_by_ticket.test.js","sourceRoot":"","sources":["../../../test/nodes/split_by_ticket.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport { split_by_ticket } from '../../src/flow/nodes/split_by_ticket';\nimport { Node, OpenTicket } from '../../src/store/flow-definition';\nimport { NodeTest } from '../NodeHelper';\n\n/**\n * Test suite for the split_by_ticket node configuration.\n */\ndescribe('split_by_ticket node config', () => {\n const helper = new NodeTest(split_by_ticket, 'split_by_ticket');\n\n describe('basic properties', () => {\n helper.testBasicProperties();\n\n it('has correct type and name', () => {\n expect(split_by_ticket.type).to.equal('split_by_ticket');\n expect(split_by_ticket.name).to.equal('Open Ticket');\n });\n });\n\n describe('round-trip transformation', () => {\n it('should transform from flow definition to form data', () => {\n const node: Node = {\n uuid: 'test-node',\n actions: [\n {\n type: 'open_ticket',\n uuid: 'action-1',\n topic: { uuid: 'topic-1', name: 'General' },\n assignee: { uuid: 'user-1', name: 'Alice' },\n note: 'Test note'\n } as OpenTicket\n ],\n exits: []\n };\n\n const formData = split_by_ticket.toFormData!(node);\n\n expect(formData.uuid).to.equal('test-node');\n expect(formData.topic).to.have.lengthOf(1);\n expect(formData.topic[0]).to.deep.equal({\n uuid: 'topic-1',\n name: 'General'\n });\n expect(formData.assignee).to.have.lengthOf(1);\n expect(formData.assignee[0]).to.deep.equal({\n uuid: 'user-1',\n name: 'Alice'\n });\n expect(formData.note).to.equal('Test note');\n });\n\n it('should transform from form data to flow definition', () => {\n const originalNode: Node = {\n uuid: 'test-node',\n actions: [],\n exits: []\n };\n\n const formData = {\n uuid: 'test-node',\n topic: [{ uuid: 'topic-1', name: 'General' }],\n assignee: [{ uuid: 'user-1', name: 'Alice' }],\n note: 'Test note'\n };\n\n const resultNode = split_by_ticket.fromFormData!(formData, originalNode);\n\n expect(resultNode.uuid).to.equal('test-node');\n expect(resultNode.actions).to.have.lengthOf(1);\n expect(resultNode.actions![0].type).to.equal('open_ticket');\n expect((resultNode.actions![0] as any).topic).to.deep.equal({\n uuid: 'topic-1',\n name: 'General'\n });\n expect((resultNode.actions![0] as any).assignee).to.deep.equal({\n uuid: 'user-1',\n name: 'Alice'\n });\n });\n\n it('should strip superfluous API metadata from topic and assignee', () => {\n const originalNode: Node = {\n uuid: 'test-node',\n actions: [],\n exits: []\n };\n\n const formData = {\n uuid: 'test-node',\n topic: [\n {\n uuid: 'topic-1',\n name: 'General',\n created_on: '2024-01-01T00:00:00.000Z',\n modified_on: '2024-06-15T12:00:00.000Z'\n }\n ],\n assignee: [\n {\n uuid: 'user-1',\n name: 'Alice Johnson',\n email: 'alice@example.com',\n first_name: 'Alice',\n last_name: 'Johnson',\n role: 'agent',\n created_on: '2024-01-01T00:00:00.000Z'\n }\n ],\n note: ''\n };\n\n const resultNode = split_by_ticket.fromFormData!(formData, originalNode);\n\n const action = resultNode.actions![0] as any;\n expect(action.topic).to.deep.equal({\n uuid: 'topic-1',\n name: 'General'\n });\n expect(action.assignee).to.deep.equal({\n uuid: 'user-1',\n name: 'Alice Johnson'\n });\n });\n\n it('should handle assignee with only first_name/last_name (no name)', () => {\n const originalNode: Node = {\n uuid: 'test-node',\n actions: [],\n exits: []\n };\n\n const formData = {\n uuid: 'test-node',\n topic: [{ uuid: 'topic-1', name: 'General' }],\n assignee: [\n {\n uuid: 'user-1',\n first_name: 'Bob',\n last_name: 'Smith',\n email: 'bob@example.com',\n role: 'agent'\n }\n ],\n note: ''\n };\n\n const resultNode = split_by_ticket.fromFormData!(formData, originalNode);\n\n const action = resultNode.actions![0] as any;\n expect(action.assignee).to.deep.equal({\n uuid: 'user-1',\n name: 'Bob Smith'\n });\n });\n });\n});\n"]}
|