@nyaruka/temba-components 0.142.1 → 0.142.2
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/CHANGELOG.md +11 -0
- package/dist/temba-components.js +825 -654
- package/dist/temba-components.js.map +1 -1
- package/out-tsc/src/Icons.js +1 -0
- package/out-tsc/src/Icons.js.map +1 -1
- package/out-tsc/src/flow/CanvasMenu.js +30 -35
- package/out-tsc/src/flow/CanvasMenu.js.map +1 -1
- package/out-tsc/src/flow/CanvasNode.js +13 -8
- package/out-tsc/src/flow/CanvasNode.js.map +1 -1
- package/out-tsc/src/flow/Editor.js +18 -5
- package/out-tsc/src/flow/Editor.js.map +1 -1
- package/out-tsc/src/flow/NodeEditor.js +346 -10
- package/out-tsc/src/flow/NodeEditor.js.map +1 -1
- package/out-tsc/src/flow/NodeTypeSelector.js +2 -0
- package/out-tsc/src/flow/NodeTypeSelector.js.map +1 -1
- package/out-tsc/src/flow/Plumber.js +3 -1
- package/out-tsc/src/flow/Plumber.js.map +1 -1
- package/out-tsc/src/flow/actions/add_contact_urn.js +2 -6
- package/out-tsc/src/flow/actions/add_contact_urn.js.map +1 -1
- package/out-tsc/src/flow/actions/enter_flow.js +2 -2
- package/out-tsc/src/flow/actions/enter_flow.js.map +1 -1
- package/out-tsc/src/flow/actions/say_msg.js +2 -1
- package/out-tsc/src/flow/actions/say_msg.js.map +1 -1
- package/out-tsc/src/flow/actions/send_broadcast.js +2 -6
- package/out-tsc/src/flow/actions/send_broadcast.js.map +1 -1
- package/out-tsc/src/flow/actions/send_email.js +2 -6
- package/out-tsc/src/flow/actions/send_email.js.map +1 -1
- package/out-tsc/src/flow/actions/send_msg.js +52 -35
- package/out-tsc/src/flow/actions/send_msg.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_channel.js +2 -1
- package/out-tsc/src/flow/actions/set_contact_channel.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_field.js +4 -5
- package/out-tsc/src/flow/actions/set_contact_field.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_language.js +3 -3
- package/out-tsc/src/flow/actions/set_contact_language.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_name.js +2 -1
- package/out-tsc/src/flow/actions/set_contact_name.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_status.js +2 -1
- package/out-tsc/src/flow/actions/set_contact_status.js.map +1 -1
- package/out-tsc/src/flow/actions/set_run_result.js +3 -3
- package/out-tsc/src/flow/actions/set_run_result.js.map +1 -1
- package/out-tsc/src/flow/actions/start_session.js +2 -2
- package/out-tsc/src/flow/actions/start_session.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_llm.js +4 -5
- package/out-tsc/src/flow/nodes/split_by_llm.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_resthook.js +3 -8
- package/out-tsc/src/flow/nodes/split_by_resthook.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_subflow.js +2 -2
- package/out-tsc/src/flow/nodes/split_by_subflow.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_webhook.js +25 -33
- package/out-tsc/src/flow/nodes/split_by_webhook.js.map +1 -1
- package/out-tsc/src/flow/nodes/wait_for_response.js +1 -0
- package/out-tsc/src/flow/nodes/wait_for_response.js.map +1 -1
- package/out-tsc/src/flow/types.js.map +1 -1
- package/out-tsc/src/flow/utils.js +68 -0
- package/out-tsc/src/flow/utils.js.map +1 -1
- package/out-tsc/src/form/FieldRenderer.js +17 -2
- package/out-tsc/src/form/FieldRenderer.js.map +1 -1
- package/out-tsc/src/interfaces.js +1 -0
- package/out-tsc/src/interfaces.js.map +1 -1
- package/out-tsc/src/simulator/Simulator.js +1 -1
- package/out-tsc/src/simulator/Simulator.js.map +1 -1
- package/out-tsc/test/temba-canvas-menu.test.js +13 -9
- package/out-tsc/test/temba-canvas-menu.test.js.map +1 -1
- package/out-tsc/test/temba-flow-reflow.test.js.map +1 -1
- package/out-tsc/test/temba-node-editor.test.js +9 -10
- package/out-tsc/test/temba-node-editor.test.js.map +1 -1
- package/out-tsc/test/temba-node-type-selector.test.js +3 -3
- package/out-tsc/test/temba-node-type-selector.test.js.map +1 -1
- package/out-tsc/test/temba-simulator.test.js +2 -2
- package/out-tsc/test/temba-simulator.test.js.map +1 -1
- package/package.json +1 -1
- 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/send_email/render/long-subject.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/long-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/multiline-text-with-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/simple-text.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-linebreaks.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-many-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-without-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/multiline-text-with-replies.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/canvas-menu/open.png +0 -0
- package/screenshots/truth/node-type-selector/action-mode.png +0 -0
- package/screenshots/truth/node-type-selector/split-mode.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_categorize/editor/feedback-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/feedback-categorization.png +0 -0
- package/src/Icons.ts +1 -0
- package/src/flow/CanvasMenu.ts +38 -39
- package/src/flow/CanvasNode.ts +16 -8
- package/src/flow/Editor.ts +33 -6
- package/src/flow/NodeEditor.ts +373 -10
- package/src/flow/NodeTypeSelector.ts +2 -0
- package/src/flow/Plumber.ts +3 -1
- package/src/flow/actions/add_contact_urn.ts +5 -6
- package/src/flow/actions/enter_flow.ts +2 -2
- package/src/flow/actions/say_msg.ts +2 -1
- package/src/flow/actions/send_broadcast.ts +2 -6
- package/src/flow/actions/send_email.ts +2 -6
- package/src/flow/actions/send_msg.ts +56 -38
- package/src/flow/actions/set_contact_channel.ts +5 -1
- package/src/flow/actions/set_contact_field.ts +10 -5
- package/src/flow/actions/set_contact_language.ts +6 -3
- package/src/flow/actions/set_contact_name.ts +5 -1
- package/src/flow/actions/set_contact_status.ts +5 -1
- package/src/flow/actions/set_run_result.ts +6 -3
- package/src/flow/actions/start_session.ts +2 -2
- package/src/flow/nodes/split_by_llm.ts +5 -5
- package/src/flow/nodes/split_by_resthook.ts +3 -8
- package/src/flow/nodes/split_by_subflow.ts +2 -2
- package/src/flow/nodes/split_by_webhook.ts +26 -34
- package/src/flow/nodes/wait_for_response.ts +1 -0
- package/src/flow/types.ts +25 -2
- package/src/flow/utils.ts +81 -1
- package/src/form/FieldRenderer.ts +32 -3
- package/src/interfaces.ts +1 -0
- package/src/simulator/Simulator.ts +1 -1
- package/test/temba-canvas-menu.test.ts +13 -9
- package/test/temba-flow-reflow.test.ts +4 -2
- package/test/temba-node-editor.test.ts +9 -10
- package/test/temba-node-type-selector.test.ts +3 -3
- package/test/temba-simulator.test.ts +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"temba-node-type-selector.test.js","sourceRoot":"","sources":["../../test/temba-node-type-selector.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, assert } from '@open-wc/testing';\nimport { NodeTypeSelector } from '../src/flow/NodeTypeSelector';\nimport { assertScreenshot, getClip, getComponent } from './utils.test';\n\ndescribe('temba-node-type-selector', () => {\n const createSelector = async () => {\n const component = (await getComponent(\n 'temba-node-type-selector',\n {},\n '',\n 700,\n 600\n )) as NodeTypeSelector;\n await component.updateComplete;\n return component;\n };\n\n it('can be created', async () => {\n const selector = await createSelector();\n assert.instanceOf(selector, NodeTypeSelector);\n expect(selector.open).to.be.false;\n });\n\n it('is not visible when closed', async () => {\n const selector = await createSelector();\n expect(selector.open).to.be.false;\n\n // component should not be in DOM when closed\n expect(selector.hasAttribute('open')).to.be.false;\n });\n\n it('shows dialog when opened in action mode', async () => {\n const selector = await createSelector();\n\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n expect(selector.open).to.be.true;\n expect(selector.mode).to.equal('action');\n expect(selector.hasAttribute('open')).to.be.true;\n\n const dialog = selector.shadowRoot?.querySelector('.dialog') as HTMLElement;\n await assertScreenshot('node-type-selector/action-mode', getClip(dialog));\n });\n\n it('shows dialog when opened in split mode', async () => {\n const selector = await createSelector();\n\n selector.show('split', { x: 100, y: 100 });\n await selector.updateComplete;\n\n expect(selector.open).to.be.true;\n expect(selector.mode).to.equal('split');\n\n const dialog = selector.shadowRoot?.querySelector('.dialog') as HTMLElement;\n await assertScreenshot('node-type-selector/split-mode', getClip(dialog));\n });\n\n it('displays action types in action mode', async () => {\n const selector = await createSelector();\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n const title = selector.shadowRoot?.querySelector('.header h2');\n expect(title?.textContent).to.equal('Select an Action');\n\n // verify we have node items\n const nodeItems = selector.shadowRoot?.querySelectorAll('.node-item');\n expect(nodeItems?.length).to.be.greaterThan(0);\n });\n\n it('displays split types in split mode', async () => {\n const selector = await createSelector();\n selector.show('split', { x: 100, y: 100 });\n await selector.updateComplete;\n\n const title = selector.shadowRoot?.querySelector('.header h2');\n expect(title?.textContent).to.equal('Select a Split');\n\n // verify we have node items\n const nodeItems = selector.shadowRoot?.querySelectorAll('.node-item');\n expect(nodeItems?.length).to.be.greaterThan(0);\n });\n\n it('closes when close() is called', async () => {\n const selector = await createSelector();\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n expect(selector.open).to.be.true;\n\n selector.close();\n await selector.updateComplete;\n\n expect(selector.open).to.be.false;\n });\n\n it('closes when overlay is clicked', async () => {\n const selector = await createSelector();\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n const overlay = selector.shadowRoot?.querySelector(\n '.overlay'\n ) as HTMLElement;\n overlay.click();\n await selector.updateComplete;\n\n expect(selector.open).to.be.false;\n });\n\n it('closes when cancel button is clicked', async () => {\n const selector = await createSelector();\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n const cancelButton = selector.shadowRoot?.querySelector(\n 'temba-button'\n ) as HTMLElement;\n cancelButton.click();\n await selector.updateComplete;\n\n expect(selector.open).to.be.false;\n });\n\n it('fires selection event when node type is clicked', async () => {\n const selector = await createSelector();\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n let selectionFired = false;\n let selectionDetail = null;\n\n selector.addEventListener('temba-selection', (event: any) => {\n selectionFired = true;\n selectionDetail = event.detail;\n });\n\n // click on first node item\n const firstNodeItem = selector.shadowRoot?.querySelector(\n '.node-item'\n ) as HTMLElement;\n firstNodeItem.click();\n await selector.updateComplete;\n\n expect(selectionFired).to.be.true;\n expect(selectionDetail).to.have.property('nodeType');\n expect(selectionDetail).to.have.property('position');\n expect(selectionDetail.position).to.deep.equal({ x: 100, y: 100 });\n expect(selector.open).to.be.false;\n });\n\n it('filters actions by flow type - voice flow should show voice-only actions', async () => {\n const selector = await createSelector();\n selector.flowType = 'voice';\n await selector.updateComplete;\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // get all node item titles\n const nodeItems = selector.shadowRoot?.querySelectorAll('.node-item-title');\n const titles = Array.from(nodeItems || []).map((item) =>\n item.textContent?.trim()\n );\n\n // voice flow should have Say Message and Play Recording\n expect(titles).to.include('Say Message');\n expect(titles).to.include('Play Recording');\n });\n\n it('filters actions by flow type - message flow should not show voice-only actions', async () => {\n const selector = await createSelector();\n selector.flowType = 'message';\n await selector.updateComplete;\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // get all node item titles\n const nodeItems = selector.shadowRoot?.querySelectorAll('.node-item-title');\n const titles = Array.from(nodeItems || []).map((item) =>\n item.textContent?.trim()\n );\n\n // message flow should not have Say Message or Play Recording\n expect(titles).to.not.include('Say Message');\n expect(titles).to.not.include('Play Recording');\n });\n\n it('filters splits by flow type - message flow should show wait for response', async () => {\n const selector = await createSelector();\n selector.flowType = 'message';\n await selector.updateComplete;\n selector.show('split', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // get all node item titles\n const nodeItems = selector.shadowRoot?.querySelectorAll('.node-item-title');\n const titles = Array.from(nodeItems || []).map((item) =>\n item.textContent?.trim()\n );\n\n // message flow should have Wait for Response\n expect(titles).to.include('Wait for Response');\n });\n\n it('filters splits by flow type - voice flow should not show wait for response', async () => {\n const selector = await createSelector();\n selector.flowType = 'voice';\n await selector.updateComplete;\n selector.show('split', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // get all node item titles\n const nodeItems = selector.shadowRoot?.querySelectorAll('.node-item-title');\n const titles = Array.from(nodeItems || []).map((item) =>\n item.textContent?.trim()\n );\n\n // voice flow should not have Wait for Response\n expect(titles).to.not.include('Wait for Response');\n\n // but should have Wait for Digits and Wait for Menu\n expect(titles).to.include('Wait for Digits');\n expect(titles).to.include('Wait for Menu');\n });\n\n it('filters by features - AI feature enables AI splits', async () => {\n const selector = await createSelector();\n selector.flowType = 'message';\n selector.features = ['ai'];\n await selector.updateComplete;\n selector.show('split', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // get all node item titles\n const nodeItems = selector.shadowRoot?.querySelectorAll('.node-item-title');\n const titles = Array.from(nodeItems || []).map((item) =>\n item.textContent?.trim()\n );\n\n // split_by_llm_categorize (Split by AI) is filtered out for old editor compatibility\n // so it should NOT appear even when AI feature is enabled\n expect(titles).to.not.include('Split by AI');\n });\n\n it('filters by features - without AI feature, AI splits are hidden', async () => {\n const selector = await createSelector();\n selector.flowType = 'message';\n selector.features = [];\n await selector.updateComplete;\n selector.show('split', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // get all node item titles\n const nodeItems = selector.shadowRoot?.querySelectorAll('.node-item-title');\n const titles = Array.from(nodeItems || []).map((item) =>\n item.textContent?.trim()\n );\n\n // without ai feature, should not have Call AI or Split by AI\n expect(titles).to.not.include('Call AI');\n expect(titles).to.not.include('Split by AI');\n });\n\n it('filters by features - airtime feature enables airtime actions', async () => {\n const selector = await createSelector();\n selector.flowType = 'message';\n selector.features = ['airtime'];\n await selector.updateComplete;\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // get all node item titles\n const nodeItems = selector.shadowRoot?.querySelectorAll('.node-item-title');\n const titles = Array.from(nodeItems || []).map((item) =>\n item.textContent?.trim()\n );\n\n // with airtime feature, should have Send Airtime\n expect(titles).to.include('Send Airtime');\n });\n\n it('filters by features - without airtime feature, airtime actions are hidden', async () => {\n const selector = await createSelector();\n selector.flowType = 'message';\n selector.features = [];\n await selector.updateComplete;\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // get all node item titles\n const nodeItems = selector.shadowRoot?.querySelectorAll('.node-item-title');\n const titles = Array.from(nodeItems || []).map((item) =>\n item.textContent?.trim()\n );\n\n // without airtime feature, should not have Send Airtime\n expect(titles).to.not.include('Send Airtime');\n });\n\n it('hides actions/nodes with empty flowTypes array from selector', async () => {\n const selector = await createSelector();\n\n // test that isConfigAvailable returns false for empty flowTypes array\n const configWithEmptyFlowTypes = {\n name: 'Test Action',\n type: 'test_action',\n flowTypes: [] // empty array should hide from all flow types\n };\n\n selector.flowType = 'message';\n await selector.updateComplete;\n\n // call private method via any to test behavior\n const isAvailable = (selector as any).isConfigAvailable(\n configWithEmptyFlowTypes\n );\n expect(isAvailable).to.be.false;\n\n // test with different flow types - should still be false\n selector.flowType = 'voice';\n await selector.updateComplete;\n\n const isAvailableVoice = (selector as any).isConfigAvailable(\n configWithEmptyFlowTypes\n );\n expect(isAvailableVoice).to.be.false;\n });\n\n it('shows actions/nodes with undefined flowTypes for all flow types', async () => {\n const selector = await createSelector();\n\n // test that isConfigAvailable returns true for undefined flowTypes\n const configWithUndefinedFlowTypes = {\n name: 'Test Action',\n type: 'test_action'\n // flowTypes is undefined - should be available for all\n };\n\n selector.flowType = 'message';\n await selector.updateComplete;\n\n const isAvailable = (selector as any).isConfigAvailable(\n configWithUndefinedFlowTypes\n );\n expect(isAvailable).to.be.true;\n\n // test with different flow types - should still be true\n selector.flowType = 'voice';\n await selector.updateComplete;\n\n const isAvailableVoice = (selector as any).isConfigAvailable(\n configWithUndefinedFlowTypes\n );\n expect(isAvailableVoice).to.be.true;\n });\n\n describe('alias filtering', () => {\n it('should not show split_by_run_result twice when aliases exist', async () => {\n const selector = await createSelector();\n\n selector.show('split', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // Get all the node items rendered in the selector\n const nodeItems = selector.shadowRoot!.querySelectorAll('.node-item');\n\n // Count how many times \"Split by Result\" appears\n let splitByResultCount = 0;\n nodeItems.forEach((item) => {\n const title = item.querySelector('.node-item-title');\n if (title?.textContent?.includes('Split by Result')) {\n splitByResultCount++;\n }\n });\n\n // Should only appear once, not twice\n expect(splitByResultCount).to.equal(1);\n });\n\n it('should not show split_by_run_result_delimited type in the selector', async () => {\n const selector = await createSelector();\n\n selector.show('split', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // Get all the node items and check their data-type attributes\n const nodeItems = selector.shadowRoot!.querySelectorAll('.node-item');\n\n let foundDelimitedType = false;\n nodeItems.forEach((item) => {\n const typeAttr = item.getAttribute('data-type');\n if (typeAttr === 'split_by_run_result_delimited') {\n foundDelimitedType = true;\n }\n });\n\n expect(foundDelimitedType).to.be.false;\n });\n\n it('should not show split_by_llm_categorize in split mode', async () => {\n const selector = await createSelector();\n\n selector.show('split', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // Get all the node items and check their data-type attributes\n const nodeItems = selector.shadowRoot!.querySelectorAll('.node-item');\n\n let foundLLMCategorize = false;\n nodeItems.forEach((item) => {\n const typeAttr = item.getAttribute('data-type');\n if (typeAttr === 'split_by_llm_categorize') {\n foundLLMCategorize = true;\n }\n });\n\n expect(foundLLMCategorize).to.be.false;\n });\n\n it('should not show split_by_llm_categorize in action mode', async () => {\n const selector = await createSelector();\n\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // Get all the node items and check their data-type attributes\n const nodeItems = selector.shadowRoot!.querySelectorAll('.node-item');\n\n let foundLLMCategorize = false;\n nodeItems.forEach((item) => {\n const typeAttr = item.getAttribute('data-type');\n if (typeAttr === 'split_by_llm_categorize') {\n foundLLMCategorize = true;\n }\n });\n\n expect(foundLLMCategorize).to.be.false;\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"temba-node-type-selector.test.js","sourceRoot":"","sources":["../../test/temba-node-type-selector.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, assert } from '@open-wc/testing';\nimport { NodeTypeSelector } from '../src/flow/NodeTypeSelector';\nimport { assertScreenshot, getClip, getComponent } from './utils.test';\n\ndescribe('temba-node-type-selector', () => {\n const createSelector = async () => {\n const component = (await getComponent(\n 'temba-node-type-selector',\n {},\n '',\n 700,\n 600\n )) as NodeTypeSelector;\n await component.updateComplete;\n return component;\n };\n\n it('can be created', async () => {\n const selector = await createSelector();\n assert.instanceOf(selector, NodeTypeSelector);\n expect(selector.open).to.be.false;\n });\n\n it('is not visible when closed', async () => {\n const selector = await createSelector();\n expect(selector.open).to.be.false;\n\n // component should not be in DOM when closed\n expect(selector.hasAttribute('open')).to.be.false;\n });\n\n it('shows dialog when opened in action mode', async () => {\n const selector = await createSelector();\n\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n expect(selector.open).to.be.true;\n expect(selector.mode).to.equal('action');\n expect(selector.hasAttribute('open')).to.be.true;\n\n const dialog = selector.shadowRoot?.querySelector('.dialog') as HTMLElement;\n await assertScreenshot('node-type-selector/action-mode', getClip(dialog));\n });\n\n it('shows dialog when opened in split mode', async () => {\n const selector = await createSelector();\n\n selector.show('split', { x: 100, y: 100 });\n await selector.updateComplete;\n\n expect(selector.open).to.be.true;\n expect(selector.mode).to.equal('split');\n\n const dialog = selector.shadowRoot?.querySelector('.dialog') as HTMLElement;\n await assertScreenshot('node-type-selector/split-mode', getClip(dialog));\n });\n\n it('displays action types in action mode', async () => {\n const selector = await createSelector();\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n const title = selector.shadowRoot?.querySelector('.header h2');\n expect(title?.textContent).to.equal('Select an Action');\n\n // verify we have node items\n const nodeItems = selector.shadowRoot?.querySelectorAll('.node-item');\n expect(nodeItems?.length).to.be.greaterThan(0);\n });\n\n it('displays split types in split mode', async () => {\n const selector = await createSelector();\n selector.show('split', { x: 100, y: 100 });\n await selector.updateComplete;\n\n const title = selector.shadowRoot?.querySelector('.header h2');\n expect(title?.textContent).to.equal('Select a Split');\n\n // verify we have node items\n const nodeItems = selector.shadowRoot?.querySelectorAll('.node-item');\n expect(nodeItems?.length).to.be.greaterThan(0);\n });\n\n it('closes when close() is called', async () => {\n const selector = await createSelector();\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n expect(selector.open).to.be.true;\n\n selector.close();\n await selector.updateComplete;\n\n expect(selector.open).to.be.false;\n });\n\n it('closes when overlay is clicked', async () => {\n const selector = await createSelector();\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n const overlay = selector.shadowRoot?.querySelector(\n '.overlay'\n ) as HTMLElement;\n overlay.click();\n await selector.updateComplete;\n\n expect(selector.open).to.be.false;\n });\n\n it('closes when cancel button is clicked', async () => {\n const selector = await createSelector();\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n const cancelButton = selector.shadowRoot?.querySelector(\n 'temba-button'\n ) as HTMLElement;\n cancelButton.click();\n await selector.updateComplete;\n\n expect(selector.open).to.be.false;\n });\n\n it('fires selection event when node type is clicked', async () => {\n const selector = await createSelector();\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n let selectionFired = false;\n let selectionDetail = null;\n\n selector.addEventListener('temba-selection', (event: any) => {\n selectionFired = true;\n selectionDetail = event.detail;\n });\n\n // click on first node item\n const firstNodeItem = selector.shadowRoot?.querySelector(\n '.node-item'\n ) as HTMLElement;\n firstNodeItem.click();\n await selector.updateComplete;\n\n expect(selectionFired).to.be.true;\n expect(selectionDetail).to.have.property('nodeType');\n expect(selectionDetail).to.have.property('position');\n expect(selectionDetail.position).to.deep.equal({ x: 100, y: 100 });\n expect(selector.open).to.be.false;\n });\n\n it('filters actions by flow type - voice flow should show voice-only actions', async () => {\n const selector = await createSelector();\n selector.flowType = 'voice';\n await selector.updateComplete;\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // get all node item titles\n const nodeItems = selector.shadowRoot?.querySelectorAll('.node-item-title');\n const titles = Array.from(nodeItems || []).map((item) =>\n item.textContent?.trim()\n );\n\n // voice flow should have Say Message and Play Recording\n expect(titles).to.include('Say Message');\n expect(titles).to.include('Play Recording');\n });\n\n it('filters actions by flow type - message flow should not show voice-only actions', async () => {\n const selector = await createSelector();\n selector.flowType = 'message';\n await selector.updateComplete;\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // get all node item titles\n const nodeItems = selector.shadowRoot?.querySelectorAll('.node-item-title');\n const titles = Array.from(nodeItems || []).map((item) =>\n item.textContent?.trim()\n );\n\n // message flow should not have Say Message or Play Recording\n expect(titles).to.not.include('Say Message');\n expect(titles).to.not.include('Play Recording');\n });\n\n it('filters splits by flow type - message flow should not show wait for response in split dialog', async () => {\n const selector = await createSelector();\n selector.flowType = 'message';\n await selector.updateComplete;\n selector.show('split', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // get all node item titles\n const nodeItems = selector.shadowRoot?.querySelectorAll('.node-item-title');\n const titles = Array.from(nodeItems || []).map((item) =>\n item.textContent?.trim()\n );\n\n // Wait for Response is now promoted to the context menu, not in split dialog\n expect(titles).to.not.include('Wait for Response');\n });\n\n it('filters splits by flow type - voice flow should not show wait for response', async () => {\n const selector = await createSelector();\n selector.flowType = 'voice';\n await selector.updateComplete;\n selector.show('split', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // get all node item titles\n const nodeItems = selector.shadowRoot?.querySelectorAll('.node-item-title');\n const titles = Array.from(nodeItems || []).map((item) =>\n item.textContent?.trim()\n );\n\n // voice flow should not have Wait for Response\n expect(titles).to.not.include('Wait for Response');\n\n // but should have Wait for Digits and Wait for Menu\n expect(titles).to.include('Wait for Digits');\n expect(titles).to.include('Wait for Menu');\n });\n\n it('filters by features - AI feature enables AI splits', async () => {\n const selector = await createSelector();\n selector.flowType = 'message';\n selector.features = ['ai'];\n await selector.updateComplete;\n selector.show('split', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // get all node item titles\n const nodeItems = selector.shadowRoot?.querySelectorAll('.node-item-title');\n const titles = Array.from(nodeItems || []).map((item) =>\n item.textContent?.trim()\n );\n\n // split_by_llm_categorize (Split by AI) is filtered out for old editor compatibility\n // so it should NOT appear even when AI feature is enabled\n expect(titles).to.not.include('Split by AI');\n });\n\n it('filters by features - without AI feature, AI splits are hidden', async () => {\n const selector = await createSelector();\n selector.flowType = 'message';\n selector.features = [];\n await selector.updateComplete;\n selector.show('split', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // get all node item titles\n const nodeItems = selector.shadowRoot?.querySelectorAll('.node-item-title');\n const titles = Array.from(nodeItems || []).map((item) =>\n item.textContent?.trim()\n );\n\n // without ai feature, should not have Call AI or Split by AI\n expect(titles).to.not.include('Call AI');\n expect(titles).to.not.include('Split by AI');\n });\n\n it('filters by features - airtime feature enables airtime actions', async () => {\n const selector = await createSelector();\n selector.flowType = 'message';\n selector.features = ['airtime'];\n await selector.updateComplete;\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // get all node item titles\n const nodeItems = selector.shadowRoot?.querySelectorAll('.node-item-title');\n const titles = Array.from(nodeItems || []).map((item) =>\n item.textContent?.trim()\n );\n\n // with airtime feature, should have Send Airtime\n expect(titles).to.include('Send Airtime');\n });\n\n it('filters by features - without airtime feature, airtime actions are hidden', async () => {\n const selector = await createSelector();\n selector.flowType = 'message';\n selector.features = [];\n await selector.updateComplete;\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // get all node item titles\n const nodeItems = selector.shadowRoot?.querySelectorAll('.node-item-title');\n const titles = Array.from(nodeItems || []).map((item) =>\n item.textContent?.trim()\n );\n\n // without airtime feature, should not have Send Airtime\n expect(titles).to.not.include('Send Airtime');\n });\n\n it('hides actions/nodes with empty flowTypes array from selector', async () => {\n const selector = await createSelector();\n\n // test that isConfigAvailable returns false for empty flowTypes array\n const configWithEmptyFlowTypes = {\n name: 'Test Action',\n type: 'test_action',\n flowTypes: [] // empty array should hide from all flow types\n };\n\n selector.flowType = 'message';\n await selector.updateComplete;\n\n // call private method via any to test behavior\n const isAvailable = (selector as any).isConfigAvailable(\n configWithEmptyFlowTypes\n );\n expect(isAvailable).to.be.false;\n\n // test with different flow types - should still be false\n selector.flowType = 'voice';\n await selector.updateComplete;\n\n const isAvailableVoice = (selector as any).isConfigAvailable(\n configWithEmptyFlowTypes\n );\n expect(isAvailableVoice).to.be.false;\n });\n\n it('shows actions/nodes with undefined flowTypes for all flow types', async () => {\n const selector = await createSelector();\n\n // test that isConfigAvailable returns true for undefined flowTypes\n const configWithUndefinedFlowTypes = {\n name: 'Test Action',\n type: 'test_action'\n // flowTypes is undefined - should be available for all\n };\n\n selector.flowType = 'message';\n await selector.updateComplete;\n\n const isAvailable = (selector as any).isConfigAvailable(\n configWithUndefinedFlowTypes\n );\n expect(isAvailable).to.be.true;\n\n // test with different flow types - should still be true\n selector.flowType = 'voice';\n await selector.updateComplete;\n\n const isAvailableVoice = (selector as any).isConfigAvailable(\n configWithUndefinedFlowTypes\n );\n expect(isAvailableVoice).to.be.true;\n });\n\n describe('alias filtering', () => {\n it('should not show split_by_run_result twice when aliases exist', async () => {\n const selector = await createSelector();\n\n selector.show('split', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // Get all the node items rendered in the selector\n const nodeItems = selector.shadowRoot!.querySelectorAll('.node-item');\n\n // Count how many times \"Split by Result\" appears\n let splitByResultCount = 0;\n nodeItems.forEach((item) => {\n const title = item.querySelector('.node-item-title');\n if (title?.textContent?.includes('Split by Result')) {\n splitByResultCount++;\n }\n });\n\n // Should only appear once, not twice\n expect(splitByResultCount).to.equal(1);\n });\n\n it('should not show split_by_run_result_delimited type in the selector', async () => {\n const selector = await createSelector();\n\n selector.show('split', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // Get all the node items and check their data-type attributes\n const nodeItems = selector.shadowRoot!.querySelectorAll('.node-item');\n\n let foundDelimitedType = false;\n nodeItems.forEach((item) => {\n const typeAttr = item.getAttribute('data-type');\n if (typeAttr === 'split_by_run_result_delimited') {\n foundDelimitedType = true;\n }\n });\n\n expect(foundDelimitedType).to.be.false;\n });\n\n it('should not show split_by_llm_categorize in split mode', async () => {\n const selector = await createSelector();\n\n selector.show('split', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // Get all the node items and check their data-type attributes\n const nodeItems = selector.shadowRoot!.querySelectorAll('.node-item');\n\n let foundLLMCategorize = false;\n nodeItems.forEach((item) => {\n const typeAttr = item.getAttribute('data-type');\n if (typeAttr === 'split_by_llm_categorize') {\n foundLLMCategorize = true;\n }\n });\n\n expect(foundLLMCategorize).to.be.false;\n });\n\n it('should not show split_by_llm_categorize in action mode', async () => {\n const selector = await createSelector();\n\n selector.show('action', { x: 100, y: 100 });\n await selector.updateComplete;\n\n // Get all the node items and check their data-type attributes\n const nodeItems = selector.shadowRoot!.querySelectorAll('.node-item');\n\n let foundLLMCategorize = false;\n nodeItems.forEach((item) => {\n const typeAttr = item.getAttribute('data-type');\n if (typeAttr === 'split_by_llm_categorize') {\n foundLLMCategorize = true;\n }\n });\n\n expect(foundLLMCategorize).to.be.false;\n });\n });\n});\n"]}
|
|
@@ -527,9 +527,9 @@ describe('temba-simulator', () => {
|
|
|
527
527
|
expect(messageCountBefore).to.be.greaterThan(1);
|
|
528
528
|
// mock the start response for reset
|
|
529
529
|
mockSimulatorStart();
|
|
530
|
-
// click the reset button (has
|
|
530
|
+
// click the reset button (has refresh icon)
|
|
531
531
|
const optionButtons = Array.from(simulator.shadowRoot.querySelectorAll('.option-btn'));
|
|
532
|
-
const resetButton = optionButtons.find((btn) => btn.querySelector('temba-icon[name="
|
|
532
|
+
const resetButton = optionButtons.find((btn) => btn.querySelector('temba-icon[name="refresh"]'));
|
|
533
533
|
expect(resetButton).to.exist;
|
|
534
534
|
resetButton.click();
|
|
535
535
|
await delay(100);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"temba-simulator.test.js","sourceRoot":"","sources":["../../test/temba-simulator.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EACL,gBAAgB,EAChB,OAAO,EACP,QAAQ,EACR,cAAc,EACd,KAAK,EACL,gBAAgB,EAChB,SAAS,EACV,MAAM,cAAc,CAAC;AAEtB,MAAM,SAAS,GAAG,eAAe,CAAC;AAElC,MAAM,eAAe,GAAG,KAAK,EAAE,QAAa,EAAE,EAAE,EAAE;IAChD,iDAAiD;IACjD,MAAM,SAAS,EAAE,CAAC;IAElB,MAAM,QAAQ,GAAG;QACf,IAAI,EAAE,SAAS;QACf,aAAa,EAAE,GAAG,CAAC,6CAA6C;KACjE,CAAC;IACF,MAAM,WAAW,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;IAE9C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;SAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,KAAK,GAAG,CAAC;SAC1C,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,MAAM,SAAS,GAAc,MAAM,OAAO,CACxC,oBAAoB,UAAU,qBAAqB,CACpD,CAAC;IAEF,wDAAwD;IACxD,SAAS,CAAC,IAAI,GAAG,QAAQ,CAAC;IACzB,SAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;IACnC,SAAiB,CAAC,mBAAmB,GAAG,KAAK,CAAC;IAC/C,MAAM,SAAS,CAAC,cAAc,CAAC;IAE/B,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,+BAA+B;AAC/B,MAAM,aAAa,GAAG,KAAK,EAAE,SAAoB,EAAE,EAAE;IACnD,MAAM,GAAG,GAAG,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,oBAAoB,CAAQ,CAAC;IAC5E,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;IAErB,8CAA8C;IAC9C,GAAG,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,sBAAsB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAE9E,MAAM,SAAS,CAAC,cAAc,CAAC;IAC/B,gDAAgD;IAChD,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC,CAAC;AAEF,kEAAkE;AAClE,MAAM,gBAAgB,GAAG,CACvB,SAAoB,EACpB,iBAA0B,KAAK,EAC/B,EAAE;;IACF,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,aAAa,CACpD,uBAAuB,CACjB,CAAC;IAET,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,uCAAuC;QACvC,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,aAAa,GAAG,MAAA,WAAW,CAAC,UAAU,0CAAE,aAAa,CACzD,SAAS,CACK,CAAC;IACjB,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,YAAY,GAAG,aAAa,CAAC,qBAAqB,EAAE,CAAC;IAE3D,IAAI,cAAc,EAAE,CAAC;QACnB,8DAA8D;QAC9D,MAAM,cAAc,GAAG,WAAW,CAAC,aAAa,CAC9C,kBAAkB,CACJ,CAAC;QACjB,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;QAED,MAAM,eAAe,GAAG,cAAc,CAAC,aAAa,CAClD,mBAAmB,CACL,CAAC;QACjB,MAAM,UAAU,GAAG,cAAc,CAAC,aAAa,CAC7C,cAAc,CACA,CAAC;QAEjB,IAAI,CAAC,eAAe,IAAI,CAAC,UAAU,EAAE,CAAC;YACpC,OAAO;gBACL,CAAC,EAAE,YAAY,CAAC,CAAC;gBACjB,CAAC,EAAE,YAAY,CAAC,CAAC;gBACjB,KAAK,EAAE,YAAY,CAAC,KAAK;gBACzB,MAAM,EAAE,YAAY,CAAC,MAAM;aAC5B,CAAC;QACJ,CAAC;QAED,MAAM,aAAa,GAAG,eAAe,CAAC,qBAAqB,EAAE,CAAC;QAC9D,MAAM,WAAW,GAAG,UAAU,CAAC,qBAAqB,EAAE,CAAC;QAEvD,oFAAoF;QACpF,oEAAoE;QACpE,qFAAqF;QACrF,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,GAAG,OAAO,CAAC;QAExC,6EAA6E;QAC7E,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC;QAEjC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QAChE,MAAM,OAAO,GACX,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;QAE/D,OAAO;YACL,CAAC,EAAE,KAAK;YACR,CAAC,EAAE,IAAI;YACP,KAAK,EAAE,MAAM,GAAG,KAAK;YACrB,MAAM,EAAE,OAAO,GAAG,IAAI;SACvB,CAAC;IACJ,CAAC;IAED,+EAA+E;IAC/E,MAAM,cAAc,GAAG,WAAW,CAAC,aAAa,CAC9C,kBAAkB,CACJ,CAAC;IACjB,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC;IAED,sDAAsD;IACtD,MAAM,UAAU,GAAG,cAAc,CAAC,aAAa,CAC7C,cAAc,CACA,CAAC;IACjB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,qDAAqD;QACrD,OAAO;YACL,CAAC,EAAE,YAAY,CAAC,CAAC;YACjB,CAAC,EAAE,YAAY,CAAC,CAAC;YACjB,KAAK,EAAE,YAAY,CAAC,KAAK;YACzB,MAAM,EAAE,YAAY,CAAC,MAAM;SAC5B,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,UAAU,CAAC,qBAAqB,EAAE,CAAC;IAEvD,oCAAoC;IACpC,MAAM,OAAO,GAAG,EAAE,CAAC;IAEnB,OAAO;QACL,CAAC,EAAE,WAAW,CAAC,CAAC,GAAG,OAAO;QAC1B,CAAC,EAAE,WAAW,CAAC,CAAC,GAAG,OAAO;QAC1B,uEAAuE;QACvE,KAAK,EAAE,WAAW,CAAC,KAAK,GAAG,OAAO;QAClC,MAAM,EAAE,WAAW,CAAC,MAAM,GAAG,OAAO,GAAG,CAAC;KACzC,CAAC;AACJ,CAAC,CAAC;AAEF,kDAAkD;AAClD,MAAM,eAAe,GAAG,CAAC,SAAoB,EAAU,EAAE;;IACvD,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,CAAQ,CAAC;IACrE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,CAAC;IACX,CAAC;IACD,oDAAoD;IACpD,2DAA2D;IAC3D,OAAO,CACL,CAAA,MAAA,IAAI,CAAC,aAAa,0CAAE,MAAM,CAAC,CAAC,KAAa,EAAE,KAAU,EAAE,EAAE;;QACvD,OAAO,KAAK,GAAG,CAAC,CAAA,MAAA,KAAK,CAAC,QAAQ,0CAAE,MAAM,KAAI,CAAC,CAAC,CAAC;IAC/C,CAAC,EAAE,CAAC,CAAC,KAAI,CAAC,CACX,CAAC;AACJ,CAAC,CAAC;AAEF,0CAA0C;AAC1C,MAAM,kBAAkB,GAAG,GAAG,EAAE;IAC9B,MAAM,QAAQ,GAAG;QACf,OAAO,EAAE;YACP,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;aAC7C;YACD,IAAI,EAAE;gBACJ;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;oBAC5C,MAAM,EAAE,SAAS;oBACjB,IAAI,EAAE;wBACJ;4BACE,IAAI,EAAE,QAAQ;4BACd,SAAS,EAAE,QAAQ;4BACnB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;4BACpC,SAAS,EAAE,IAAI;yBAChB;qBACF;iBACF;aACF;YACD,WAAW,EAAE;gBACX,WAAW,EAAE,YAAY;gBACzB,WAAW,EAAE,OAAO;gBACpB,QAAQ,EAAE,kBAAkB;gBAC5B,iBAAiB,EAAE,CAAC,KAAK,CAAC;gBAC1B,eAAe,EAAE,IAAI;aACtB;SACF;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,aAAa;gBACnB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpC,GAAG,EAAE;oBACH,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,kCAAkC;oBACxC,GAAG,EAAE,kBAAkB;iBACxB;aACF;SACF;QACD,OAAO,EAAE;YACP,IAAI,EAAE,sCAAsC;YAC5C,IAAI,EAAE,CAAC,kBAAkB,CAAC;YAC1B,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC;QACD,OAAO,EAAE;YACP,OAAO,EAAE;gBACP,IAAI,EAAE,sCAAsC;gBAC5C,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE;oBACJ,GAAG,EAAE,CAAC,cAAc,CAAC;oBACrB,WAAW,EAAE,cAAc;iBAC5B;gBACD,MAAM,EAAE;oBACN,GAAG,EAAE,IAAI;oBACT,IAAI,EAAE,SAAS;iBAChB;aACF;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,QAAQ;aACtB;SACF;KACF,CAAC;IAEF,QAAQ,CAAC,wBAAwB,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,YAAoB,EAAE,YAAuB,EAAE,EAAE;IAC5E,MAAM,GAAG,GAAQ;QACf,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,YAAY;QAClB,GAAG,EAAE,kBAAkB;KACxB,CAAC;IAEF,IAAI,YAAY,EAAE,CAAC;QACjB,GAAG,CAAC,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,QAAQ,GAAG;QACf,OAAO,EAAE;YACP,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;aAC7C;YACD,IAAI,EAAE;gBACJ;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;oBAC5C,MAAM,EAAE,SAAS;oBACjB,IAAI,EAAE;wBACJ;4BACE,IAAI,EAAE,QAAQ;4BACd,SAAS,EAAE,QAAQ;4BACnB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;4BACpC,SAAS,EAAE,QAAQ;yBACpB;wBACD;4BACE,IAAI,EAAE,QAAQ;4BACd,SAAS,EAAE,QAAQ;4BACnB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;4BACpC,SAAS,EAAE,IAAI;yBAChB;qBACF;iBACF;aACF;YACD,WAAW,EAAE;gBACX,WAAW,EAAE,YAAY;gBACzB,WAAW,EAAE,OAAO;gBACpB,QAAQ,EAAE,kBAAkB;gBAC5B,iBAAiB,EAAE,CAAC,KAAK,CAAC;gBAC1B,eAAe,EAAE,IAAI;aACtB;SACF;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,aAAa;gBACnB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpC,GAAG;aACJ;SACF;QACD,OAAO,EAAE;YACP,IAAI,EAAE,sCAAsC;YAC5C,IAAI,EAAE,CAAC,kBAAkB,CAAC;YAC1B,MAAM,EAAE;gBACN,GAAG,EAAE,IAAI;gBACT,IAAI,EAAE,SAAS;aAChB;YACD,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC;QACD,OAAO,EAAE;YACP,OAAO,EAAE;gBACP,IAAI,EAAE,sCAAsC;gBAC5C,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE;oBACJ,GAAG,EAAE,CAAC,cAAc,CAAC;oBACrB,WAAW,EAAE,cAAc;iBAC5B;gBACD,MAAM,EAAE;oBACN,GAAG,EAAE,IAAI;oBACT,IAAI,EAAE,SAAS;iBAChB;aACF;YACD,OAAO,EAAE;gBACP,aAAa,EAAE;oBACb,KAAK,EAAE,YAAY;oBACnB,WAAW,EAAE,YAAY;iBAC1B;aACF;SACF;KACF,CAAC;IAEF,QAAQ,CAAC,wBAAwB,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,UAAU,CAAC,GAAG,EAAE;QACd,cAAc,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,SAAS,GAAc,MAAM,eAAe,EAAE,CAAC;QACrD,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACxC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,SAAS,GAAG,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,kBAAkB,EAAE,CAAC;QAErB,MAAM,SAAS,GAAc,MAAM,eAAe,EAAE,CAAC;QACrD,MAAM,SAAS,CAAC,cAAc,CAAC;QAC/B,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;QAE/B,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,aAAa,CACpD,uBAAuB,CACjB,CAAC;QACT,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAE7B,iCAAiC;QACjC,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;QACxE,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAE7B,yDAAyD;QACzD,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAE1C,MAAM,gBAAgB,CACpB,wBAAwB,EACxB,gBAAgB,CAAC,SAAS,CAAC,CAC5B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QACpC,kBAAkB,EAAE,CAAC;QAErB,MAAM,SAAS,GAAc,MAAM,eAAe,EAAE,CAAC;QACrD,MAAM,SAAS,CAAC,cAAc,CAAC;QAC/B,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;QAE/B,yBAAyB;QACzB,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAEhD,2BAA2B;QAC3B,mBAAmB,CAAC,0BAA0B,CAAC,CAAC;QAEhD,iBAAiB;QACjB,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,aAAa,CAC9C,sBAAsB,CACH,CAAC;QACtB,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAEvB,KAAK,CAAC,KAAK,GAAG,iBAAiB,CAAC;QAChC,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACxC,MAAM,SAAS,CAAC,cAAc,CAAC;QAE/B,sBAAsB;QACtB,MAAM,UAAU,GAAG,IAAI,aAAa,CAAC,OAAO,EAAE;YAC5C,GAAG,EAAE,OAAO;YACZ,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAEhC,4DAA4D;QAC5D,MAAM,gBAAgB,CACpB,GAAG,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,YAAY,EAC/C,EAAE,EACF,EAAE,CACH,CAAC;QAEF,MAAM,SAAS,CAAC,cAAc,CAAC;QAC/B,oCAAoC;QACpC,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,CAAQ,CAAC;QACrE,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,IAAI,CAAC,cAAc,CAAC;QAC5B,CAAC;QAED,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAEjD,wBAAwB;QACxB,MAAM,SAAS,CAAC,cAAc,CAAC;QAE/B,MAAM,gBAAgB,CACpB,8BAA8B,EAC9B,gBAAgB,CAAC,SAAS,CAAC,CAC5B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,kBAAkB,EAAE,CAAC;QAErB,MAAM,SAAS,GAAc,MAAM,eAAe,EAAE,CAAC;QACrD,MAAM,SAAS,CAAC,cAAc,CAAC;QAC/B,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;QAE/B,0DAA0D;QAC1D,cAAc,EAAE,CAAC;QACjB,mBAAmB,CAAC,6BAA6B,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAE3E,iBAAiB;QACjB,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,aAAa,CAC9C,sBAAsB,CACH,CAAC;QACtB,KAAK,CAAC,KAAK,GAAG,cAAc,CAAC;QAC7B,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAExC,MAAM,UAAU,GAAG,IAAI,aAAa,CAAC,OAAO,EAAE;YAC5C,GAAG,EAAE,OAAO;YACZ,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAEhC,mCAAmC;QACnC,MAAM,gBAAgB,CACpB,GAAG,EAAE,CACH,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,MAAM,GAAG,CAAC,EACtE,IAAI,CACL,CAAC;QACF,MAAM,SAAS,CAAC,cAAc,CAAC;QAC/B,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,4BAA4B;QAE9C,qCAAqC;QACrC,MAAM,gBAAgB,CACpB,yBAAyB,EACzB,gBAAgB,CAAC,SAAS,CAAC,CAC5B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,kBAAkB,EAAE,CAAC;QAErB,MAAM,SAAS,GAAc,MAAM,eAAe,EAAE,CAAC;QACrD,MAAM,SAAS,CAAC,cAAc,CAAC;QAC/B,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;QAE/B,8BAA8B;QAC9B,MAAM,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC,aAAa,CACzD,oBAAoB,CACN,CAAC;QACjB,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAClC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAEzB,MAAM,SAAS,CAAC,cAAc,CAAC;QAE/B,sCAAsC;QACtC,MAAM,cAAc,GAClB,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;QACzD,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAChC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAE7D,MAAM,gBAAgB,CACpB,2BAA2B,EAC3B,gBAAgB,CAAC,SAAS,CAAC,CAC5B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,kBAAkB,EAAE,CAAC;QAErB,MAAM,SAAS,GAAc,MAAM,eAAe,EAAE,CAAC;QACrD,MAAM,SAAS,CAAC,cAAc,CAAC;QAC/B,qDAAqD;QACrD,SAAS,CAAC,sBAAsB,EAAE,CAAC;QACnC,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;QAE/B,yBAAyB;QACzB,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAEhD,yCAAyC;QACzC,mBAAmB,CAAC,eAAe,CAAC,CAAC;QAErC,8CAA8C;QAC9C,MAAM,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC,aAAa,CACzD,oBAAoB,CACN,CAAC;QACjB,gBAAgB,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,SAAS,CAAC,cAAc,CAAC;QAC/B,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAEjB,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAC9B,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAC/D,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,WAAC,OAAA,MAAA,EAAE,CAAC,WAAW,0CAAE,QAAQ,CAAC,OAAO,CAAC,CAAA,EAAA,CAAgB,CAAC;QACjE,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC/B,aAAa,CAAC,KAAK,EAAE,CAAC;QAEtB,+DAA+D;QAC/D,MAAM,gBAAgB,CACpB,GAAG,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,YAAY,EAC/C,EAAE,EACF,EAAE,CACH,CAAC;QAEF,MAAM,SAAS,CAAC,cAAc,CAAC;QAC/B,oCAAoC;QACpC,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,CAAQ,CAAC;QACrE,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,IAAI,CAAC,cAAc,CAAC;QAC5B,CAAC;QAED,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAEjD,MAAM,gBAAgB,CACpB,4BAA4B,EAC5B,gBAAgB,CAAC,SAAS,CAAC,CAC5B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,kBAAkB,EAAE,CAAC;QAErB,MAAM,SAAS,GAAc,MAAM,eAAe,EAAE,CAAC;QACrD,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;QAE/B,oEAAoE;QACpE,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAC9B,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,aAAa,CAAC,CACrD,CAAC;QACF,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAC/C,GAAG,CAAC,aAAa,CAAC,gCAAgC,CAAC,CACrC,CAAC;QACjB,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC/B,aAAa,CAAC,KAAK,EAAE,CAAC;QAEtB,MAAM,SAAS,CAAC,cAAc,CAAC;QAC/B,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAEjB,uCAAuC;QACvC,MAAM,eAAe,GACnB,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;QAC1D,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACjC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAE9D,6CAA6C;QAC7C,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACjB,MAAM,SAAS,CAAC,cAAc,CAAC;QAC/B,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;QAE3B,MAAM,gBAAgB,CACpB,iCAAiC,EACjC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,CAClC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,kBAAkB,EAAE,CAAC;QAErB,MAAM,SAAS,GAAc,MAAM,eAAe,EAAE,CAAC;QACrD,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;QAE/B,wCAAwC;QACxC,IAAK,SAAiB,CAAC,mBAAmB,EAAE,CAAC;YAC3C,0BAA0B;YAC1B,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAC9B,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,aAAa,CAAC,CACrD,CAAC;YACF,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAC/C,GAAG,CAAC,aAAa,CAAC,gCAAgC,CAAC,CACrC,CAAC;YACjB,aAAa,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,SAAS,CAAC,cAAc,CAAC;YAC/B,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QAED,4BAA4B;QAC5B,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAC9B,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,aAAa,CAAC,CACrD,CAAC;QACF,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAC/C,GAAG,CAAC,aAAa,CAAC,gCAAgC,CAAC,CACrC,CAAC;QACjB,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC/B,aAAa,CAAC,KAAK,EAAE,CAAC;QAEtB,MAAM,SAAS,CAAC,cAAc,CAAC;QAC/B,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAEjB,sCAAsC;QACtC,MAAM,CAAE,SAAiB,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAC1D,MAAM,eAAe,GACnB,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;QAC1D,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACjC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAE9D,mFAAmF;QACnF,MAAM,eAAe,GAAG,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAC3D,0BAA0B,CAC3B,CAAC;QACF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAEpD,MAAM,eAAe,GAAG,eAAe,CAAC,CAAC,CAAgB,CAAC;QAC1D,eAAe,CAAC,KAAK,EAAE,CAAC;QAExB,0DAA0D;QAC1D,MAAM,gBAAgB,CAAC,GAAG,EAAE;YAC1B,MAAM,QAAQ,GACZ,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;YAC7D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YACxC,qDAAqD;YACrD,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;YACrE,OAAO,KAAK,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;QAC/C,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,gCAAgC;QAChC,MAAM,eAAe,GACnB,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;QAC7D,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAEpD,MAAM,SAAS,CAAC,cAAc,CAAC;QAC/B,gFAAgF;QAChF,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACjB,MAAM,SAAS,CAAC,cAAc,CAAC;QAE/B,4DAA4D;QAC5D,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;QAE3B,wCAAwC;QACxC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC5B,qBAAqB,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAC5D,CAAC;QACF,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAEjB,MAAM,gBAAgB,CACpB,4BAA4B,EAC5B,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,CAClC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,kBAAkB,EAAE,CAAC;QAErB,MAAM,SAAS,GAAc,MAAM,eAAe,EAAE,CAAC;QACrD,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;QAE/B,sDAAsD;QACtD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAE1C,8DAA8D;QAC9D,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAC9B,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,aAAa,CAAC,CACrD,CAAC;QACF,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;;YAC5C,MAAM,IAAI,GAAG,MAAA,GAAG,CAAC,WAAW,0CAAE,IAAI,EAAE,CAAC;YACrC,OAAO,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC;QACtD,CAAC,CAAgB,CAAC;QAClB,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC5B,UAAU,CAAC,KAAK,EAAE,CAAC;QAEnB,MAAM,SAAS,CAAC,cAAc,CAAC;QAE/B,wCAAwC;QACxC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACjC,kBAAkB,EAAE,CAAC;QAErB,MAAM,SAAS,GAAc,MAAM,eAAe,EAAE,CAAC;QACrD,MAAM,SAAS,CAAC,cAAc,CAAC;QAC/B,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;QAE/B,uBAAuB;QACvB,mBAAmB,CAAC,0BAA0B,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,aAAa,CAC9C,sBAAsB,CACH,CAAC;QACtB,KAAK,CAAC,KAAK,GAAG,cAAc,CAAC;QAC7B,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAExC,MAAM,UAAU,GAAG,IAAI,aAAa,CAAC,OAAO,EAAE;YAC5C,GAAG,EAAE,OAAO;YACZ,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAEhC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,SAAS,CAAC,cAAc,CAAC;QAE/B,mCAAmC;QACnC,MAAM,kBAAkB,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAEhD,oCAAoC;QACpC,kBAAkB,EAAE,CAAC;QAErB,2CAA2C;QAC3C,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAC9B,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,aAAa,CAAC,CACrD,CAAC;QACF,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAC7C,GAAG,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAChC,CAAC;QACjB,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC7B,WAAW,CAAC,KAAK,EAAE,CAAC;QAEpB,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACjB,MAAM,SAAS,CAAC,cAAc,CAAC;QAE/B,qEAAqE;QACrE,MAAM,iBAAiB,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;QAE7D,MAAM,gBAAgB,CACpB,uBAAuB,EACvB,gBAAgB,CAAC,SAAS,CAAC,CAC5B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,kBAAkB,GAAG;YACzB,OAAO,EAAE;gBACP,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;iBAC7C;gBACD,IAAI,EAAE;oBACJ;wBACE,IAAI,EAAE,OAAO;wBACb,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;wBAC5C,MAAM,EAAE,SAAS;wBACjB,IAAI,EAAE;4BACJ;gCACE,IAAI,EAAE,QAAQ;gCACd,SAAS,EAAE,QAAQ;gCACnB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gCACpC,SAAS,EAAE,IAAI;6BAChB;yBACF;qBACF;iBACF;gBACD,WAAW,EAAE;oBACX,WAAW,EAAE,YAAY;oBACzB,WAAW,EAAE,OAAO;oBACpB,QAAQ,EAAE,kBAAkB;oBAC5B,iBAAiB,EAAE,CAAC,KAAK,CAAC;oBAC1B,eAAe,EAAE,IAAI;iBACtB;aACF;YACD,MAAM,EAAE;gBACN;oBACE,IAAI,EAAE,uBAAuB;oBAC7B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACpC,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;oBACpC,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;iBAC5B;gBACD;oBACE,IAAI,EAAE,aAAa;oBACnB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACpC,GAAG,EAAE;wBACH,IAAI,EAAE,OAAO;wBACb,IAAI,EAAE,6BAA6B;wBACnC,GAAG,EAAE,kBAAkB;qBACxB;iBACF;aACF;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,sCAAsC;gBAC5C,IAAI,EAAE,CAAC,kBAAkB,CAAC;gBAC1B,MAAM,EAAE;oBACN,IAAI,EAAE,UAAU;iBACjB;gBACD,MAAM,EAAE,EAAE;gBACV,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,QAAQ;gBAChB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACrC;YACD,OAAO,EAAE;gBACP,OAAO,EAAE;oBACP,IAAI,EAAE,sCAAsC;oBAC5C,IAAI,EAAE,UAAU;oBAChB,MAAM,EAAE;wBACN,IAAI,EAAE,UAAU;qBACjB;iBACF;aACF;SACF,CAAC;QAEF,QAAQ,CAAC,wBAAwB,EAAE,kBAAkB,CAAC,CAAC;QAEvD,MAAM,SAAS,GAAc,MAAM,eAAe,EAAE,CAAC;QACrD,MAAM,SAAS,CAAC,cAAc,CAAC;QAC/B,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;QAE/B,qFAAqF;QACrF,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAE1C,MAAM,gBAAgB,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,kBAAkB,EAAE,CAAC;QAErB,MAAM,SAAS,GAAc,MAAM,eAAe,EAAE,CAAC;QACrD,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;QAE/B,2EAA2E;QAC3E,IAAI,aAAa,GAAG,KAAK,CAAC,IAAI,CAC5B,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,aAAa,CAAC,CACrD,CAAC;QACF,IAAI,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;;YAC1C,MAAM,IAAI,GAAG,MAAA,GAAG,CAAC,WAAW,0CAAE,IAAI,EAAE,CAAC;YACrC,OAAO,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC;QACtD,CAAC,CAAgB,CAAC;QAClB,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAE5B,qBAAqB;QACrB,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,SAAS,CAAC,cAAc,CAAC;QAC/B,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAEjB,sBAAsB;QACtB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEzC,uCAAuC;QACvC,aAAa,GAAG,KAAK,CAAC,IAAI,CACxB,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,aAAa,CAAC,CACrD,CAAC;QACF,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;;YACtC,MAAM,IAAI,GAAG,MAAA,GAAG,CAAC,WAAW,0CAAE,IAAI,EAAE,CAAC;YACrC,OAAO,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC;QACtD,CAAC,CAAgB,CAAC;QAElB,qBAAqB;QACrB,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,SAAS,CAAC,cAAc,CAAC;QAC/B,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAEjB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,SAAS,GAAc,MAAM,eAAe,EAAE,CAAC;QAErD,kDAAkD;QAClD,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,SAAS,GAAG,CAAC,CAAC;QAEpE,+CAA+C;QAC/C,SAAS,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACtC,MAAM,SAAS,CAAC,cAAc,CAAC;QAE/B,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { fixture, expect, assert } from '@open-wc/testing';\nimport { Simulator } from '../src/simulator/Simulator';\nimport {\n assertScreenshot,\n getClip,\n mockPOST,\n clearMockPosts,\n delay,\n waitForCondition,\n loadStore\n} from './utils.test';\n\nconst FLOW_UUID = 'test-flow-123';\n\nconst createSimulator = async (attrs: any = {}) => {\n // load store first since simulator depends on it\n await loadStore();\n\n const defaults = {\n flow: FLOW_UUID,\n animationTime: '0' // disable animations for deterministic tests\n };\n const mergedAttrs = { ...defaults, ...attrs };\n\n const attrString = Object.entries(mergedAttrs)\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(' ');\n\n const simulator: Simulator = await fixture(\n `<temba-simulator ${attrString}></temba-simulator>`\n );\n\n // reset cookie-based properties for deterministic tests\n simulator.size = 'medium';\n (simulator as any).following = true;\n (simulator as any).contextExplorerOpen = false;\n await simulator.updateComplete;\n\n return simulator;\n};\n\n// helper to open the simulator\nconst openSimulator = async (simulator: Simulator) => {\n const tab = simulator.shadowRoot.querySelector('temba-floating-tab') as any;\n expect(tab).to.exist;\n\n // trigger the button clicked event on the tab\n tab.dispatchEvent(new CustomEvent('temba-button-clicked', { bubbles: true }));\n\n await simulator.updateComplete;\n // brief delay for async API response processing\n await delay(50);\n};\n\n// helper to get clip for the simulator window (fixed positioning)\nconst getSimulatorClip = (\n simulator: Simulator,\n includeContext: boolean = false\n) => {\n const phoneWindow = simulator.shadowRoot.querySelector(\n 'temba-floating-window'\n ) as any;\n\n if (!phoneWindow) {\n // if window not open, use default clip\n return getClip(simulator);\n }\n\n const windowElement = phoneWindow.shadowRoot?.querySelector(\n '.window'\n ) as HTMLElement;\n if (!windowElement) {\n return getClip(simulator);\n }\n\n const windowBounds = windowElement.getBoundingClientRect();\n\n if (includeContext) {\n // get the context explorer and phone to clip just those areas\n const phoneSimulator = phoneWindow.querySelector(\n '.phone-simulator'\n ) as HTMLElement;\n if (!phoneSimulator) {\n return getClip(simulator);\n }\n\n const contextExplorer = phoneSimulator.querySelector(\n '.context-explorer'\n ) as HTMLElement;\n const phoneFrame = phoneSimulator.querySelector(\n '.phone-frame'\n ) as HTMLElement;\n\n if (!contextExplorer || !phoneFrame) {\n return {\n x: windowBounds.x,\n y: windowBounds.y,\n width: windowBounds.width,\n height: windowBounds.height\n };\n }\n\n const contextBounds = contextExplorer.getBoundingClientRect();\n const phoneBounds = phoneFrame.getBoundingClientRect();\n\n // clip from the left edge of context explorer to the right edge of phone frame only\n // do not include the option-pane which is to the right of the phone\n // keep padding within the phone bounds to avoid capturing the gap to the option pane\n const padding = 10;\n const leftX = contextBounds.x - padding;\n\n // don't extend past the phone frame right edge - the option pane is close by\n const rightX = phoneBounds.right;\n\n const topY = Math.min(contextBounds.y, phoneBounds.y) - padding;\n const bottomY =\n Math.max(contextBounds.bottom, phoneBounds.bottom) + padding;\n\n return {\n x: leftX,\n y: topY,\n width: rightX - leftX,\n height: bottomY - topY\n };\n }\n\n // the phone-simulator is in the light DOM of the phoneWindow (slotted content)\n const phoneSimulator = phoneWindow.querySelector(\n '.phone-simulator'\n ) as HTMLElement;\n if (!phoneSimulator) {\n return getClip(simulator);\n }\n\n // get the phone-frame from within the phone-simulator\n const phoneFrame = phoneSimulator.querySelector(\n '.phone-frame'\n ) as HTMLElement;\n if (!phoneFrame) {\n // fallback to window bounds if phone-frame not found\n return {\n x: windowBounds.x,\n y: windowBounds.y,\n width: windowBounds.width,\n height: windowBounds.height\n };\n }\n\n const frameBounds = phoneFrame.getBoundingClientRect();\n\n // clip to just the phone frame area\n const padding = 10;\n\n return {\n x: frameBounds.x - padding,\n y: frameBounds.y - padding,\n // only add padding to the left to avoid capturing option pane on right\n width: frameBounds.width + padding,\n height: frameBounds.height + padding * 2\n };\n};\n\n// helper to get message count from chat component\nconst getMessageCount = (simulator: Simulator): number => {\n const chat = simulator.shadowRoot.querySelector('temba-chat') as any;\n if (!chat) {\n return 0;\n }\n // check how many messages are in the chat component\n // the chat component stores messages in its internal state\n return (\n chat.messageGroups?.reduce((total: number, group: any) => {\n return total + (group.messages?.length || 0);\n }, 0) || 0\n );\n};\n\n// mock responses for simulation endpoints\nconst mockSimulatorStart = () => {\n const response = {\n session: {\n status: 'waiting',\n trigger: {\n type: 'manual',\n flow: { uuid: FLOW_UUID, name: 'Test Flow' }\n },\n runs: [\n {\n uuid: 'run-1',\n flow: { uuid: FLOW_UUID, name: 'Test Flow' },\n status: 'waiting',\n path: [\n {\n uuid: 'step-1',\n node_uuid: 'node-1',\n arrived_on: new Date().toISOString(),\n exit_uuid: null\n }\n ]\n }\n ],\n environment: {\n date_format: 'YYYY-MM-DD',\n time_format: 'HH:mm',\n timezone: 'America/New_York',\n allowed_languages: ['eng'],\n default_country: 'US'\n }\n },\n events: [\n {\n type: 'msg_created',\n created_on: new Date().toISOString(),\n msg: {\n uuid: 'msg-1',\n text: 'Hello! How can I help you today?',\n urn: 'tel:+12065551212'\n }\n }\n ],\n contact: {\n uuid: 'fb3787ab-2eda-48a0-a2bc-e2ddadec1286',\n urns: ['tel:+12065551212'],\n fields: {},\n groups: [],\n language: 'eng',\n status: 'active',\n created_on: new Date().toISOString()\n },\n context: {\n contact: {\n uuid: 'fb3787ab-2eda-48a0-a2bc-e2ddadec1286',\n name: 'Test User',\n urns: {\n tel: ['+12065551212'],\n __default__: '+12065551212'\n },\n fields: {\n age: '25',\n city: 'Seattle'\n }\n },\n trigger: {\n type: 'manual',\n __default__: 'manual'\n }\n }\n };\n\n mockPOST(/\\/flow\\/simulate\\/.*\\//, response);\n};\n\nconst mockSimulatorResume = (responseText: string, quickReplies?: string[]) => {\n const msg: any = {\n uuid: 'msg-response',\n text: responseText,\n urn: 'tel:+12065551212'\n };\n\n if (quickReplies) {\n msg.quick_replies = quickReplies.map((text) => ({ text }));\n }\n\n const response = {\n session: {\n status: 'waiting',\n trigger: {\n type: 'manual',\n flow: { uuid: FLOW_UUID, name: 'Test Flow' }\n },\n runs: [\n {\n uuid: 'run-1',\n flow: { uuid: FLOW_UUID, name: 'Test Flow' },\n status: 'waiting',\n path: [\n {\n uuid: 'step-1',\n node_uuid: 'node-1',\n arrived_on: new Date().toISOString(),\n exit_uuid: 'exit-1'\n },\n {\n uuid: 'step-2',\n node_uuid: 'node-2',\n arrived_on: new Date().toISOString(),\n exit_uuid: null\n }\n ]\n }\n ],\n environment: {\n date_format: 'YYYY-MM-DD',\n time_format: 'HH:mm',\n timezone: 'America/New_York',\n allowed_languages: ['eng'],\n default_country: 'US'\n }\n },\n events: [\n {\n type: 'msg_created',\n created_on: new Date().toISOString(),\n msg\n }\n ],\n contact: {\n uuid: 'fb3787ab-2eda-48a0-a2bc-e2ddadec1286',\n urns: ['tel:+12065551212'],\n fields: {\n age: '25',\n city: 'Seattle'\n },\n groups: [],\n language: 'eng',\n status: 'active',\n created_on: new Date().toISOString()\n },\n context: {\n contact: {\n uuid: 'fb3787ab-2eda-48a0-a2bc-e2ddadec1286',\n name: 'Test User',\n urns: {\n tel: ['+12065551212'],\n __default__: '+12065551212'\n },\n fields: {\n age: '25',\n city: 'Seattle'\n }\n },\n results: {\n user_response: {\n value: responseText,\n __default__: responseText\n }\n }\n }\n };\n\n mockPOST(/\\/flow\\/simulate\\/.*\\//, response);\n};\n\ndescribe('temba-simulator', () => {\n beforeEach(() => {\n clearMockPosts();\n });\n\n it('can be created', async () => {\n const simulator: Simulator = await createSimulator();\n assert.instanceOf(simulator, Simulator);\n expect(simulator.flow).to.equal(FLOW_UUID);\n expect(simulator.endpoint).to.equal(`/flow/simulate/${FLOW_UUID}/`);\n });\n\n it('opens simulator window and starts flow', async () => {\n mockSimulatorStart();\n\n const simulator: Simulator = await createSimulator();\n await simulator.updateComplete;\n await openSimulator(simulator);\n\n const phoneWindow = simulator.shadowRoot.querySelector(\n 'temba-floating-window'\n ) as any;\n expect(phoneWindow).to.exist;\n\n // verify phone screen is visible\n const phoneScreen = simulator.shadowRoot.querySelector('.phone-screen');\n expect(phoneScreen).to.exist;\n\n // verify initial message is displayed via chat component\n const messageCount = getMessageCount(simulator);\n expect(messageCount).to.be.greaterThan(0);\n\n await assertScreenshot(\n 'simulator/open-initial',\n getSimulatorClip(simulator)\n );\n });\n\n it('sends a text message', async () => {\n mockSimulatorStart();\n\n const simulator: Simulator = await createSimulator();\n await simulator.updateComplete;\n await openSimulator(simulator);\n\n // count initial messages\n const initialCount = getMessageCount(simulator);\n\n // mock the resume response\n mockSimulatorResume('Thanks for your message!');\n\n // type a message\n const input = simulator.shadowRoot.querySelector(\n '.message-input input'\n ) as HTMLInputElement;\n expect(input).to.exist;\n\n input.value = 'Hello from test';\n input.dispatchEvent(new Event('input'));\n await simulator.updateComplete;\n\n // press enter to send\n const enterEvent = new KeyboardEvent('keyup', {\n key: 'Enter',\n bubbles: true\n });\n input.dispatchEvent(enterEvent);\n\n // wait for the message to be sent and response to come back\n await waitForCondition(\n () => getMessageCount(simulator) > initialCount,\n 40,\n 50\n );\n\n await simulator.updateComplete;\n // wait for chat component to update\n const chat = simulator.shadowRoot.querySelector('temba-chat') as any;\n if (chat) {\n await chat.updateComplete;\n }\n\n // verify we have more messages than before\n const newCount = getMessageCount(simulator);\n expect(newCount).to.be.greaterThan(initialCount);\n\n // ensure DOM is settled\n await simulator.updateComplete;\n\n await assertScreenshot(\n 'simulator/after-message-sent',\n getSimulatorClip(simulator)\n );\n });\n\n it('tests message flow and takes screenshot', async () => {\n mockSimulatorStart();\n\n const simulator: Simulator = await createSimulator();\n await simulator.updateComplete;\n await openSimulator(simulator);\n\n // clear previous mocks and set up new mock for a response\n clearMockPosts();\n mockSimulatorResume('Thank you for your message!', ['Yes', 'No', 'Maybe']);\n\n // send a message\n const input = simulator.shadowRoot.querySelector(\n '.message-input input'\n ) as HTMLInputElement;\n input.value = 'Test message';\n input.dispatchEvent(new Event('input'));\n\n const enterEvent = new KeyboardEvent('keyup', {\n key: 'Enter',\n bubbles: true\n });\n input.dispatchEvent(enterEvent);\n\n // wait for quick replies to appear\n await waitForCondition(\n () =>\n simulator.shadowRoot.querySelectorAll('.quick-reply-btn').length > 0,\n 5000\n );\n await simulator.updateComplete;\n await delay(100); // extra delay for rendering\n\n // take screenshot with quick replies\n await assertScreenshot(\n 'simulator/quick-replies',\n getSimulatorClip(simulator)\n );\n });\n\n it('opens attachment menu', async () => {\n mockSimulatorStart();\n\n const simulator: Simulator = await createSimulator();\n await simulator.updateComplete;\n await openSimulator(simulator);\n\n // click the attachment button\n const attachmentButton = simulator.shadowRoot.querySelector(\n '.attachment-button'\n ) as HTMLElement;\n expect(attachmentButton).to.exist;\n attachmentButton.click();\n\n await simulator.updateComplete;\n\n // verify attachment menu is displayed\n const attachmentMenu =\n simulator.shadowRoot.querySelector('.attachment-menu');\n expect(attachmentMenu).to.exist;\n expect(attachmentMenu.classList.contains('open')).to.be.true;\n\n await assertScreenshot(\n 'simulator/attachment-menu',\n getSimulatorClip(simulator)\n );\n });\n\n it('sends an image attachment', async () => {\n mockSimulatorStart();\n\n const simulator: Simulator = await createSimulator();\n await simulator.updateComplete;\n // reset attachment indices for deterministic testing\n simulator.resetAttachmentIndices();\n await openSimulator(simulator);\n\n // count initial messages\n const initialCount = getMessageCount(simulator);\n\n // mock the response for image attachment\n mockSimulatorResume('Nice picture!');\n\n // open attachment menu and click image option\n const attachmentButton = simulator.shadowRoot.querySelector(\n '.attachment-button'\n ) as HTMLElement;\n attachmentButton.click();\n await simulator.updateComplete;\n await delay(200);\n\n const imageMenuItem = Array.from(\n simulator.shadowRoot.querySelectorAll('.attachment-menu-item')\n ).find((el) => el.textContent?.includes('Image')) as HTMLElement;\n expect(imageMenuItem).to.exist;\n imageMenuItem.click();\n\n // wait for the attachment to be sent and response to come back\n await waitForCondition(\n () => getMessageCount(simulator) > initialCount,\n 40,\n 50\n );\n\n await simulator.updateComplete;\n // wait for chat component to update\n const chat = simulator.shadowRoot.querySelector('temba-chat') as any;\n if (chat) {\n await chat.updateComplete;\n }\n\n // verify message with attachment was added via chat component\n const newCount = getMessageCount(simulator);\n expect(newCount).to.be.greaterThan(initialCount);\n\n await assertScreenshot(\n 'simulator/image-attachment',\n getSimulatorClip(simulator)\n );\n });\n\n it('opens context explorer', async () => {\n mockSimulatorStart();\n\n const simulator: Simulator = await createSimulator();\n await openSimulator(simulator);\n\n // find and click the context explorer button (has expressions icon)\n const optionButtons = Array.from(\n simulator.shadowRoot.querySelectorAll('.option-btn')\n );\n const contextButton = optionButtons.find((btn) =>\n btn.querySelector('temba-icon[name=\"expressions\"]')\n ) as HTMLElement;\n expect(contextButton).to.exist;\n contextButton.click();\n\n await simulator.updateComplete;\n await delay(100);\n\n // verify context explorer is displayed\n const contextExplorer =\n simulator.shadowRoot.querySelector('.context-explorer');\n expect(contextExplorer).to.exist;\n expect(contextExplorer.classList.contains('open')).to.be.true;\n\n // delay for context explorer to fully render\n await delay(300);\n await simulator.updateComplete;\n await document.fonts.ready;\n\n await assertScreenshot(\n 'simulator/context-explorer-open',\n getSimulatorClip(simulator, true)\n );\n });\n\n it('expands context tree items', async () => {\n mockSimulatorStart();\n\n const simulator: Simulator = await createSimulator();\n await openSimulator(simulator);\n\n // ensure context explorer starts closed\n if ((simulator as any).contextExplorerOpen) {\n // click to close it first\n const optionButtons = Array.from(\n simulator.shadowRoot.querySelectorAll('.option-btn')\n );\n const contextButton = optionButtons.find((btn) =>\n btn.querySelector('temba-icon[name=\"expressions\"]')\n ) as HTMLElement;\n contextButton.click();\n await simulator.updateComplete;\n await delay(100);\n }\n\n // now open context explorer\n const optionButtons = Array.from(\n simulator.shadowRoot.querySelectorAll('.option-btn')\n );\n const contextButton = optionButtons.find((btn) =>\n btn.querySelector('temba-icon[name=\"expressions\"]')\n ) as HTMLElement;\n expect(contextButton).to.exist;\n contextButton.click();\n\n await simulator.updateComplete;\n await delay(100);\n\n // verify context explorer is now open\n expect((simulator as any).contextExplorerOpen).to.be.true;\n const contextExplorer =\n simulator.shadowRoot.querySelector('.context-explorer');\n expect(contextExplorer).to.exist;\n expect(contextExplorer.classList.contains('open')).to.be.true;\n\n // find and click on an expandable item (should have context-item-expandable class)\n const expandableItems = simulator.shadowRoot.querySelectorAll(\n '.context-item-expandable'\n );\n expect(expandableItems.length).to.be.greaterThan(0);\n\n const firstExpandable = expandableItems[0] as HTMLElement;\n firstExpandable.click();\n\n // wait for children to be displayed with specific content\n await waitForCondition(() => {\n const children =\n simulator.shadowRoot.querySelectorAll('.context-children');\n if (children.length === 0) return false;\n // also check that the children have rendered content\n const items = simulator.shadowRoot.querySelectorAll('.context-item');\n return items.length > expandableItems.length;\n }, 2000);\n\n // verify children are displayed\n const contextChildren =\n simulator.shadowRoot.querySelectorAll('.context-children');\n expect(contextChildren.length).to.be.greaterThan(0);\n\n await simulator.updateComplete;\n // delay for DOM to fully render expanded content (context rendering is complex)\n await delay(300);\n await simulator.updateComplete;\n\n // ensure fonts are loaded and give extra time for rendering\n await document.fonts.ready;\n\n // wait for any pending animation frames\n await new Promise((resolve) =>\n requestAnimationFrame(() => requestAnimationFrame(resolve))\n );\n await delay(200);\n\n await assertScreenshot(\n 'simulator/context-expanded',\n getSimulatorClip(simulator, true)\n );\n });\n\n it('cycles simulator size', async () => {\n mockSimulatorStart();\n\n const simulator: Simulator = await createSimulator();\n await openSimulator(simulator);\n\n // initially should be medium (set in createSimulator)\n expect(simulator.size).to.equal('medium');\n\n // find and click the size button (shows current size as text)\n const optionButtons = Array.from(\n simulator.shadowRoot.querySelectorAll('.option-btn')\n );\n const sizeButton = optionButtons.find((btn) => {\n const text = btn.textContent?.trim();\n return text === 'S' || text === 'M' || text === 'L';\n }) as HTMLElement;\n expect(sizeButton).to.exist;\n sizeButton.click();\n\n await simulator.updateComplete;\n\n // should now be large (medium -> large)\n expect(simulator.size).to.equal('large');\n });\n\n it('resets simulation', async () => {\n mockSimulatorStart();\n\n const simulator: Simulator = await createSimulator();\n await simulator.updateComplete;\n await openSimulator(simulator);\n\n // send a message first\n mockSimulatorResume('Response to test message');\n const input = simulator.shadowRoot.querySelector(\n '.message-input input'\n ) as HTMLInputElement;\n input.value = 'Test message';\n input.dispatchEvent(new Event('input'));\n\n const enterEvent = new KeyboardEvent('keyup', {\n key: 'Enter',\n bubbles: true\n });\n input.dispatchEvent(enterEvent);\n\n await delay(1000);\n await simulator.updateComplete;\n\n // verify we have multiple messages\n const messageCountBefore = getMessageCount(simulator);\n expect(messageCountBefore).to.be.greaterThan(1);\n\n // mock the start response for reset\n mockSimulatorStart();\n\n // click the reset button (has delete icon)\n const optionButtons = Array.from(\n simulator.shadowRoot.querySelectorAll('.option-btn')\n );\n const resetButton = optionButtons.find((btn) =>\n btn.querySelector('temba-icon[name=\"delete\"]')\n ) as HTMLElement;\n expect(resetButton).to.exist;\n resetButton.click();\n\n await delay(100);\n await simulator.updateComplete;\n\n // verify messages are reset - should go back to just initial message\n const messageCountAfter = getMessageCount(simulator);\n expect(messageCountAfter).to.be.lessThan(messageCountBefore);\n\n await assertScreenshot(\n 'simulator/after-reset',\n getSimulatorClip(simulator)\n );\n });\n\n it('displays event info messages', async () => {\n const responseWithEvents = {\n session: {\n status: 'waiting',\n trigger: {\n type: 'manual',\n flow: { uuid: FLOW_UUID, name: 'Test Flow' }\n },\n runs: [\n {\n uuid: 'run-1',\n flow: { uuid: FLOW_UUID, name: 'Test Flow' },\n status: 'waiting',\n path: [\n {\n uuid: 'step-1',\n node_uuid: 'node-1',\n arrived_on: new Date().toISOString(),\n exit_uuid: null\n }\n ]\n }\n ],\n environment: {\n date_format: 'YYYY-MM-DD',\n time_format: 'HH:mm',\n timezone: 'America/New_York',\n allowed_languages: ['eng'],\n default_country: 'US'\n }\n },\n events: [\n {\n type: 'contact_field_changed',\n created_on: new Date().toISOString(),\n field: { key: 'name', name: 'Name' },\n value: { text: 'John Doe' }\n },\n {\n type: 'msg_created',\n created_on: new Date().toISOString(),\n msg: {\n uuid: 'msg-1',\n text: 'Your name has been updated!',\n urn: 'tel:+12065551212'\n }\n }\n ],\n contact: {\n uuid: 'fb3787ab-2eda-48a0-a2bc-e2ddadec1286',\n urns: ['tel:+12065551212'],\n fields: {\n name: 'John Doe'\n },\n groups: [],\n language: 'eng',\n status: 'active',\n created_on: new Date().toISOString()\n },\n context: {\n contact: {\n uuid: 'fb3787ab-2eda-48a0-a2bc-e2ddadec1286',\n name: 'John Doe',\n fields: {\n name: 'John Doe'\n }\n }\n }\n };\n\n mockPOST(/\\/flow\\/simulate\\/.*\\//, responseWithEvents);\n\n const simulator: Simulator = await createSimulator();\n await simulator.updateComplete;\n await openSimulator(simulator);\n\n // verify events are displayed via chat component (field change + message = 2 events)\n const messageCount = getMessageCount(simulator);\n expect(messageCount).to.be.greaterThan(0);\n\n await assertScreenshot('simulator/event-info', getSimulatorClip(simulator));\n });\n\n it('displays different simulator sizes', async () => {\n mockSimulatorStart();\n\n const simulator: Simulator = await createSimulator();\n await openSimulator(simulator);\n\n // get size button - find it by checking if textContent is a size indicator\n let optionButtons = Array.from(\n simulator.shadowRoot.querySelectorAll('.option-btn')\n );\n let sizeButton = optionButtons.find((btn) => {\n const text = btn.textContent?.trim();\n return text === 'S' || text === 'M' || text === 'L';\n }) as HTMLElement;\n expect(sizeButton).to.exist;\n\n // cycle to next size\n sizeButton.click();\n await simulator.updateComplete;\n await delay(200);\n\n // verify size changed\n expect(simulator.size).to.equal('large');\n\n // re-query the button after it updated\n optionButtons = Array.from(\n simulator.shadowRoot.querySelectorAll('.option-btn')\n );\n sizeButton = optionButtons.find((btn) => {\n const text = btn.textContent?.trim();\n return text === 'S' || text === 'M' || text === 'L';\n }) as HTMLElement;\n\n // cycle to next size\n sizeButton.click();\n await simulator.updateComplete;\n await delay(200);\n\n expect(simulator.size).to.equal('small');\n });\n\n it('verifies simulator endpoint configuration', async () => {\n const simulator: Simulator = await createSimulator();\n\n // verify endpoint is set correctly from flow prop\n expect(simulator.endpoint).to.equal(`/flow/simulate/${FLOW_UUID}/`);\n\n // change flow prop and verify endpoint updates\n simulator.flow = 'different-flow-456';\n await simulator.updateComplete;\n\n expect(simulator.endpoint).to.equal('/flow/simulate/different-flow-456/');\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"temba-simulator.test.js","sourceRoot":"","sources":["../../test/temba-simulator.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { fixture, expect, assert } from '@open-wc/testing';\nimport { Simulator } from '../src/simulator/Simulator';\nimport {\n assertScreenshot,\n getClip,\n mockPOST,\n clearMockPosts,\n delay,\n waitForCondition,\n loadStore\n} from './utils.test';\n\nconst FLOW_UUID = 'test-flow-123';\n\nconst createSimulator = async (attrs: any = {}) => {\n // load store first since simulator depends on it\n await loadStore();\n\n const defaults = {\n flow: FLOW_UUID,\n animationTime: '0' // disable animations for deterministic tests\n };\n const mergedAttrs = { ...defaults, ...attrs };\n\n const attrString = Object.entries(mergedAttrs)\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(' ');\n\n const simulator: Simulator = await fixture(\n `<temba-simulator ${attrString}></temba-simulator>`\n );\n\n // reset cookie-based properties for deterministic tests\n simulator.size = 'medium';\n (simulator as any).following = true;\n (simulator as any).contextExplorerOpen = false;\n await simulator.updateComplete;\n\n return simulator;\n};\n\n// helper to open the simulator\nconst openSimulator = async (simulator: Simulator) => {\n const tab = simulator.shadowRoot.querySelector('temba-floating-tab') as any;\n expect(tab).to.exist;\n\n // trigger the button clicked event on the tab\n tab.dispatchEvent(new CustomEvent('temba-button-clicked', { bubbles: true }));\n\n await simulator.updateComplete;\n // brief delay for async API response processing\n await delay(50);\n};\n\n// helper to get clip for the simulator window (fixed positioning)\nconst getSimulatorClip = (\n simulator: Simulator,\n includeContext: boolean = false\n) => {\n const phoneWindow = simulator.shadowRoot.querySelector(\n 'temba-floating-window'\n ) as any;\n\n if (!phoneWindow) {\n // if window not open, use default clip\n return getClip(simulator);\n }\n\n const windowElement = phoneWindow.shadowRoot?.querySelector(\n '.window'\n ) as HTMLElement;\n if (!windowElement) {\n return getClip(simulator);\n }\n\n const windowBounds = windowElement.getBoundingClientRect();\n\n if (includeContext) {\n // get the context explorer and phone to clip just those areas\n const phoneSimulator = phoneWindow.querySelector(\n '.phone-simulator'\n ) as HTMLElement;\n if (!phoneSimulator) {\n return getClip(simulator);\n }\n\n const contextExplorer = phoneSimulator.querySelector(\n '.context-explorer'\n ) as HTMLElement;\n const phoneFrame = phoneSimulator.querySelector(\n '.phone-frame'\n ) as HTMLElement;\n\n if (!contextExplorer || !phoneFrame) {\n return {\n x: windowBounds.x,\n y: windowBounds.y,\n width: windowBounds.width,\n height: windowBounds.height\n };\n }\n\n const contextBounds = contextExplorer.getBoundingClientRect();\n const phoneBounds = phoneFrame.getBoundingClientRect();\n\n // clip from the left edge of context explorer to the right edge of phone frame only\n // do not include the option-pane which is to the right of the phone\n // keep padding within the phone bounds to avoid capturing the gap to the option pane\n const padding = 10;\n const leftX = contextBounds.x - padding;\n\n // don't extend past the phone frame right edge - the option pane is close by\n const rightX = phoneBounds.right;\n\n const topY = Math.min(contextBounds.y, phoneBounds.y) - padding;\n const bottomY =\n Math.max(contextBounds.bottom, phoneBounds.bottom) + padding;\n\n return {\n x: leftX,\n y: topY,\n width: rightX - leftX,\n height: bottomY - topY\n };\n }\n\n // the phone-simulator is in the light DOM of the phoneWindow (slotted content)\n const phoneSimulator = phoneWindow.querySelector(\n '.phone-simulator'\n ) as HTMLElement;\n if (!phoneSimulator) {\n return getClip(simulator);\n }\n\n // get the phone-frame from within the phone-simulator\n const phoneFrame = phoneSimulator.querySelector(\n '.phone-frame'\n ) as HTMLElement;\n if (!phoneFrame) {\n // fallback to window bounds if phone-frame not found\n return {\n x: windowBounds.x,\n y: windowBounds.y,\n width: windowBounds.width,\n height: windowBounds.height\n };\n }\n\n const frameBounds = phoneFrame.getBoundingClientRect();\n\n // clip to just the phone frame area\n const padding = 10;\n\n return {\n x: frameBounds.x - padding,\n y: frameBounds.y - padding,\n // only add padding to the left to avoid capturing option pane on right\n width: frameBounds.width + padding,\n height: frameBounds.height + padding * 2\n };\n};\n\n// helper to get message count from chat component\nconst getMessageCount = (simulator: Simulator): number => {\n const chat = simulator.shadowRoot.querySelector('temba-chat') as any;\n if (!chat) {\n return 0;\n }\n // check how many messages are in the chat component\n // the chat component stores messages in its internal state\n return (\n chat.messageGroups?.reduce((total: number, group: any) => {\n return total + (group.messages?.length || 0);\n }, 0) || 0\n );\n};\n\n// mock responses for simulation endpoints\nconst mockSimulatorStart = () => {\n const response = {\n session: {\n status: 'waiting',\n trigger: {\n type: 'manual',\n flow: { uuid: FLOW_UUID, name: 'Test Flow' }\n },\n runs: [\n {\n uuid: 'run-1',\n flow: { uuid: FLOW_UUID, name: 'Test Flow' },\n status: 'waiting',\n path: [\n {\n uuid: 'step-1',\n node_uuid: 'node-1',\n arrived_on: new Date().toISOString(),\n exit_uuid: null\n }\n ]\n }\n ],\n environment: {\n date_format: 'YYYY-MM-DD',\n time_format: 'HH:mm',\n timezone: 'America/New_York',\n allowed_languages: ['eng'],\n default_country: 'US'\n }\n },\n events: [\n {\n type: 'msg_created',\n created_on: new Date().toISOString(),\n msg: {\n uuid: 'msg-1',\n text: 'Hello! How can I help you today?',\n urn: 'tel:+12065551212'\n }\n }\n ],\n contact: {\n uuid: 'fb3787ab-2eda-48a0-a2bc-e2ddadec1286',\n urns: ['tel:+12065551212'],\n fields: {},\n groups: [],\n language: 'eng',\n status: 'active',\n created_on: new Date().toISOString()\n },\n context: {\n contact: {\n uuid: 'fb3787ab-2eda-48a0-a2bc-e2ddadec1286',\n name: 'Test User',\n urns: {\n tel: ['+12065551212'],\n __default__: '+12065551212'\n },\n fields: {\n age: '25',\n city: 'Seattle'\n }\n },\n trigger: {\n type: 'manual',\n __default__: 'manual'\n }\n }\n };\n\n mockPOST(/\\/flow\\/simulate\\/.*\\//, response);\n};\n\nconst mockSimulatorResume = (responseText: string, quickReplies?: string[]) => {\n const msg: any = {\n uuid: 'msg-response',\n text: responseText,\n urn: 'tel:+12065551212'\n };\n\n if (quickReplies) {\n msg.quick_replies = quickReplies.map((text) => ({ text }));\n }\n\n const response = {\n session: {\n status: 'waiting',\n trigger: {\n type: 'manual',\n flow: { uuid: FLOW_UUID, name: 'Test Flow' }\n },\n runs: [\n {\n uuid: 'run-1',\n flow: { uuid: FLOW_UUID, name: 'Test Flow' },\n status: 'waiting',\n path: [\n {\n uuid: 'step-1',\n node_uuid: 'node-1',\n arrived_on: new Date().toISOString(),\n exit_uuid: 'exit-1'\n },\n {\n uuid: 'step-2',\n node_uuid: 'node-2',\n arrived_on: new Date().toISOString(),\n exit_uuid: null\n }\n ]\n }\n ],\n environment: {\n date_format: 'YYYY-MM-DD',\n time_format: 'HH:mm',\n timezone: 'America/New_York',\n allowed_languages: ['eng'],\n default_country: 'US'\n }\n },\n events: [\n {\n type: 'msg_created',\n created_on: new Date().toISOString(),\n msg\n }\n ],\n contact: {\n uuid: 'fb3787ab-2eda-48a0-a2bc-e2ddadec1286',\n urns: ['tel:+12065551212'],\n fields: {\n age: '25',\n city: 'Seattle'\n },\n groups: [],\n language: 'eng',\n status: 'active',\n created_on: new Date().toISOString()\n },\n context: {\n contact: {\n uuid: 'fb3787ab-2eda-48a0-a2bc-e2ddadec1286',\n name: 'Test User',\n urns: {\n tel: ['+12065551212'],\n __default__: '+12065551212'\n },\n fields: {\n age: '25',\n city: 'Seattle'\n }\n },\n results: {\n user_response: {\n value: responseText,\n __default__: responseText\n }\n }\n }\n };\n\n mockPOST(/\\/flow\\/simulate\\/.*\\//, response);\n};\n\ndescribe('temba-simulator', () => {\n beforeEach(() => {\n clearMockPosts();\n });\n\n it('can be created', async () => {\n const simulator: Simulator = await createSimulator();\n assert.instanceOf(simulator, Simulator);\n expect(simulator.flow).to.equal(FLOW_UUID);\n expect(simulator.endpoint).to.equal(`/flow/simulate/${FLOW_UUID}/`);\n });\n\n it('opens simulator window and starts flow', async () => {\n mockSimulatorStart();\n\n const simulator: Simulator = await createSimulator();\n await simulator.updateComplete;\n await openSimulator(simulator);\n\n const phoneWindow = simulator.shadowRoot.querySelector(\n 'temba-floating-window'\n ) as any;\n expect(phoneWindow).to.exist;\n\n // verify phone screen is visible\n const phoneScreen = simulator.shadowRoot.querySelector('.phone-screen');\n expect(phoneScreen).to.exist;\n\n // verify initial message is displayed via chat component\n const messageCount = getMessageCount(simulator);\n expect(messageCount).to.be.greaterThan(0);\n\n await assertScreenshot(\n 'simulator/open-initial',\n getSimulatorClip(simulator)\n );\n });\n\n it('sends a text message', async () => {\n mockSimulatorStart();\n\n const simulator: Simulator = await createSimulator();\n await simulator.updateComplete;\n await openSimulator(simulator);\n\n // count initial messages\n const initialCount = getMessageCount(simulator);\n\n // mock the resume response\n mockSimulatorResume('Thanks for your message!');\n\n // type a message\n const input = simulator.shadowRoot.querySelector(\n '.message-input input'\n ) as HTMLInputElement;\n expect(input).to.exist;\n\n input.value = 'Hello from test';\n input.dispatchEvent(new Event('input'));\n await simulator.updateComplete;\n\n // press enter to send\n const enterEvent = new KeyboardEvent('keyup', {\n key: 'Enter',\n bubbles: true\n });\n input.dispatchEvent(enterEvent);\n\n // wait for the message to be sent and response to come back\n await waitForCondition(\n () => getMessageCount(simulator) > initialCount,\n 40,\n 50\n );\n\n await simulator.updateComplete;\n // wait for chat component to update\n const chat = simulator.shadowRoot.querySelector('temba-chat') as any;\n if (chat) {\n await chat.updateComplete;\n }\n\n // verify we have more messages than before\n const newCount = getMessageCount(simulator);\n expect(newCount).to.be.greaterThan(initialCount);\n\n // ensure DOM is settled\n await simulator.updateComplete;\n\n await assertScreenshot(\n 'simulator/after-message-sent',\n getSimulatorClip(simulator)\n );\n });\n\n it('tests message flow and takes screenshot', async () => {\n mockSimulatorStart();\n\n const simulator: Simulator = await createSimulator();\n await simulator.updateComplete;\n await openSimulator(simulator);\n\n // clear previous mocks and set up new mock for a response\n clearMockPosts();\n mockSimulatorResume('Thank you for your message!', ['Yes', 'No', 'Maybe']);\n\n // send a message\n const input = simulator.shadowRoot.querySelector(\n '.message-input input'\n ) as HTMLInputElement;\n input.value = 'Test message';\n input.dispatchEvent(new Event('input'));\n\n const enterEvent = new KeyboardEvent('keyup', {\n key: 'Enter',\n bubbles: true\n });\n input.dispatchEvent(enterEvent);\n\n // wait for quick replies to appear\n await waitForCondition(\n () =>\n simulator.shadowRoot.querySelectorAll('.quick-reply-btn').length > 0,\n 5000\n );\n await simulator.updateComplete;\n await delay(100); // extra delay for rendering\n\n // take screenshot with quick replies\n await assertScreenshot(\n 'simulator/quick-replies',\n getSimulatorClip(simulator)\n );\n });\n\n it('opens attachment menu', async () => {\n mockSimulatorStart();\n\n const simulator: Simulator = await createSimulator();\n await simulator.updateComplete;\n await openSimulator(simulator);\n\n // click the attachment button\n const attachmentButton = simulator.shadowRoot.querySelector(\n '.attachment-button'\n ) as HTMLElement;\n expect(attachmentButton).to.exist;\n attachmentButton.click();\n\n await simulator.updateComplete;\n\n // verify attachment menu is displayed\n const attachmentMenu =\n simulator.shadowRoot.querySelector('.attachment-menu');\n expect(attachmentMenu).to.exist;\n expect(attachmentMenu.classList.contains('open')).to.be.true;\n\n await assertScreenshot(\n 'simulator/attachment-menu',\n getSimulatorClip(simulator)\n );\n });\n\n it('sends an image attachment', async () => {\n mockSimulatorStart();\n\n const simulator: Simulator = await createSimulator();\n await simulator.updateComplete;\n // reset attachment indices for deterministic testing\n simulator.resetAttachmentIndices();\n await openSimulator(simulator);\n\n // count initial messages\n const initialCount = getMessageCount(simulator);\n\n // mock the response for image attachment\n mockSimulatorResume('Nice picture!');\n\n // open attachment menu and click image option\n const attachmentButton = simulator.shadowRoot.querySelector(\n '.attachment-button'\n ) as HTMLElement;\n attachmentButton.click();\n await simulator.updateComplete;\n await delay(200);\n\n const imageMenuItem = Array.from(\n simulator.shadowRoot.querySelectorAll('.attachment-menu-item')\n ).find((el) => el.textContent?.includes('Image')) as HTMLElement;\n expect(imageMenuItem).to.exist;\n imageMenuItem.click();\n\n // wait for the attachment to be sent and response to come back\n await waitForCondition(\n () => getMessageCount(simulator) > initialCount,\n 40,\n 50\n );\n\n await simulator.updateComplete;\n // wait for chat component to update\n const chat = simulator.shadowRoot.querySelector('temba-chat') as any;\n if (chat) {\n await chat.updateComplete;\n }\n\n // verify message with attachment was added via chat component\n const newCount = getMessageCount(simulator);\n expect(newCount).to.be.greaterThan(initialCount);\n\n await assertScreenshot(\n 'simulator/image-attachment',\n getSimulatorClip(simulator)\n );\n });\n\n it('opens context explorer', async () => {\n mockSimulatorStart();\n\n const simulator: Simulator = await createSimulator();\n await openSimulator(simulator);\n\n // find and click the context explorer button (has expressions icon)\n const optionButtons = Array.from(\n simulator.shadowRoot.querySelectorAll('.option-btn')\n );\n const contextButton = optionButtons.find((btn) =>\n btn.querySelector('temba-icon[name=\"expressions\"]')\n ) as HTMLElement;\n expect(contextButton).to.exist;\n contextButton.click();\n\n await simulator.updateComplete;\n await delay(100);\n\n // verify context explorer is displayed\n const contextExplorer =\n simulator.shadowRoot.querySelector('.context-explorer');\n expect(contextExplorer).to.exist;\n expect(contextExplorer.classList.contains('open')).to.be.true;\n\n // delay for context explorer to fully render\n await delay(300);\n await simulator.updateComplete;\n await document.fonts.ready;\n\n await assertScreenshot(\n 'simulator/context-explorer-open',\n getSimulatorClip(simulator, true)\n );\n });\n\n it('expands context tree items', async () => {\n mockSimulatorStart();\n\n const simulator: Simulator = await createSimulator();\n await openSimulator(simulator);\n\n // ensure context explorer starts closed\n if ((simulator as any).contextExplorerOpen) {\n // click to close it first\n const optionButtons = Array.from(\n simulator.shadowRoot.querySelectorAll('.option-btn')\n );\n const contextButton = optionButtons.find((btn) =>\n btn.querySelector('temba-icon[name=\"expressions\"]')\n ) as HTMLElement;\n contextButton.click();\n await simulator.updateComplete;\n await delay(100);\n }\n\n // now open context explorer\n const optionButtons = Array.from(\n simulator.shadowRoot.querySelectorAll('.option-btn')\n );\n const contextButton = optionButtons.find((btn) =>\n btn.querySelector('temba-icon[name=\"expressions\"]')\n ) as HTMLElement;\n expect(contextButton).to.exist;\n contextButton.click();\n\n await simulator.updateComplete;\n await delay(100);\n\n // verify context explorer is now open\n expect((simulator as any).contextExplorerOpen).to.be.true;\n const contextExplorer =\n simulator.shadowRoot.querySelector('.context-explorer');\n expect(contextExplorer).to.exist;\n expect(contextExplorer.classList.contains('open')).to.be.true;\n\n // find and click on an expandable item (should have context-item-expandable class)\n const expandableItems = simulator.shadowRoot.querySelectorAll(\n '.context-item-expandable'\n );\n expect(expandableItems.length).to.be.greaterThan(0);\n\n const firstExpandable = expandableItems[0] as HTMLElement;\n firstExpandable.click();\n\n // wait for children to be displayed with specific content\n await waitForCondition(() => {\n const children =\n simulator.shadowRoot.querySelectorAll('.context-children');\n if (children.length === 0) return false;\n // also check that the children have rendered content\n const items = simulator.shadowRoot.querySelectorAll('.context-item');\n return items.length > expandableItems.length;\n }, 2000);\n\n // verify children are displayed\n const contextChildren =\n simulator.shadowRoot.querySelectorAll('.context-children');\n expect(contextChildren.length).to.be.greaterThan(0);\n\n await simulator.updateComplete;\n // delay for DOM to fully render expanded content (context rendering is complex)\n await delay(300);\n await simulator.updateComplete;\n\n // ensure fonts are loaded and give extra time for rendering\n await document.fonts.ready;\n\n // wait for any pending animation frames\n await new Promise((resolve) =>\n requestAnimationFrame(() => requestAnimationFrame(resolve))\n );\n await delay(200);\n\n await assertScreenshot(\n 'simulator/context-expanded',\n getSimulatorClip(simulator, true)\n );\n });\n\n it('cycles simulator size', async () => {\n mockSimulatorStart();\n\n const simulator: Simulator = await createSimulator();\n await openSimulator(simulator);\n\n // initially should be medium (set in createSimulator)\n expect(simulator.size).to.equal('medium');\n\n // find and click the size button (shows current size as text)\n const optionButtons = Array.from(\n simulator.shadowRoot.querySelectorAll('.option-btn')\n );\n const sizeButton = optionButtons.find((btn) => {\n const text = btn.textContent?.trim();\n return text === 'S' || text === 'M' || text === 'L';\n }) as HTMLElement;\n expect(sizeButton).to.exist;\n sizeButton.click();\n\n await simulator.updateComplete;\n\n // should now be large (medium -> large)\n expect(simulator.size).to.equal('large');\n });\n\n it('resets simulation', async () => {\n mockSimulatorStart();\n\n const simulator: Simulator = await createSimulator();\n await simulator.updateComplete;\n await openSimulator(simulator);\n\n // send a message first\n mockSimulatorResume('Response to test message');\n const input = simulator.shadowRoot.querySelector(\n '.message-input input'\n ) as HTMLInputElement;\n input.value = 'Test message';\n input.dispatchEvent(new Event('input'));\n\n const enterEvent = new KeyboardEvent('keyup', {\n key: 'Enter',\n bubbles: true\n });\n input.dispatchEvent(enterEvent);\n\n await delay(1000);\n await simulator.updateComplete;\n\n // verify we have multiple messages\n const messageCountBefore = getMessageCount(simulator);\n expect(messageCountBefore).to.be.greaterThan(1);\n\n // mock the start response for reset\n mockSimulatorStart();\n\n // click the reset button (has refresh icon)\n const optionButtons = Array.from(\n simulator.shadowRoot.querySelectorAll('.option-btn')\n );\n const resetButton = optionButtons.find((btn) =>\n btn.querySelector('temba-icon[name=\"refresh\"]')\n ) as HTMLElement;\n expect(resetButton).to.exist;\n resetButton.click();\n\n await delay(100);\n await simulator.updateComplete;\n\n // verify messages are reset - should go back to just initial message\n const messageCountAfter = getMessageCount(simulator);\n expect(messageCountAfter).to.be.lessThan(messageCountBefore);\n\n await assertScreenshot(\n 'simulator/after-reset',\n getSimulatorClip(simulator)\n );\n });\n\n it('displays event info messages', async () => {\n const responseWithEvents = {\n session: {\n status: 'waiting',\n trigger: {\n type: 'manual',\n flow: { uuid: FLOW_UUID, name: 'Test Flow' }\n },\n runs: [\n {\n uuid: 'run-1',\n flow: { uuid: FLOW_UUID, name: 'Test Flow' },\n status: 'waiting',\n path: [\n {\n uuid: 'step-1',\n node_uuid: 'node-1',\n arrived_on: new Date().toISOString(),\n exit_uuid: null\n }\n ]\n }\n ],\n environment: {\n date_format: 'YYYY-MM-DD',\n time_format: 'HH:mm',\n timezone: 'America/New_York',\n allowed_languages: ['eng'],\n default_country: 'US'\n }\n },\n events: [\n {\n type: 'contact_field_changed',\n created_on: new Date().toISOString(),\n field: { key: 'name', name: 'Name' },\n value: { text: 'John Doe' }\n },\n {\n type: 'msg_created',\n created_on: new Date().toISOString(),\n msg: {\n uuid: 'msg-1',\n text: 'Your name has been updated!',\n urn: 'tel:+12065551212'\n }\n }\n ],\n contact: {\n uuid: 'fb3787ab-2eda-48a0-a2bc-e2ddadec1286',\n urns: ['tel:+12065551212'],\n fields: {\n name: 'John Doe'\n },\n groups: [],\n language: 'eng',\n status: 'active',\n created_on: new Date().toISOString()\n },\n context: {\n contact: {\n uuid: 'fb3787ab-2eda-48a0-a2bc-e2ddadec1286',\n name: 'John Doe',\n fields: {\n name: 'John Doe'\n }\n }\n }\n };\n\n mockPOST(/\\/flow\\/simulate\\/.*\\//, responseWithEvents);\n\n const simulator: Simulator = await createSimulator();\n await simulator.updateComplete;\n await openSimulator(simulator);\n\n // verify events are displayed via chat component (field change + message = 2 events)\n const messageCount = getMessageCount(simulator);\n expect(messageCount).to.be.greaterThan(0);\n\n await assertScreenshot('simulator/event-info', getSimulatorClip(simulator));\n });\n\n it('displays different simulator sizes', async () => {\n mockSimulatorStart();\n\n const simulator: Simulator = await createSimulator();\n await openSimulator(simulator);\n\n // get size button - find it by checking if textContent is a size indicator\n let optionButtons = Array.from(\n simulator.shadowRoot.querySelectorAll('.option-btn')\n );\n let sizeButton = optionButtons.find((btn) => {\n const text = btn.textContent?.trim();\n return text === 'S' || text === 'M' || text === 'L';\n }) as HTMLElement;\n expect(sizeButton).to.exist;\n\n // cycle to next size\n sizeButton.click();\n await simulator.updateComplete;\n await delay(200);\n\n // verify size changed\n expect(simulator.size).to.equal('large');\n\n // re-query the button after it updated\n optionButtons = Array.from(\n simulator.shadowRoot.querySelectorAll('.option-btn')\n );\n sizeButton = optionButtons.find((btn) => {\n const text = btn.textContent?.trim();\n return text === 'S' || text === 'M' || text === 'L';\n }) as HTMLElement;\n\n // cycle to next size\n sizeButton.click();\n await simulator.updateComplete;\n await delay(200);\n\n expect(simulator.size).to.equal('small');\n });\n\n it('verifies simulator endpoint configuration', async () => {\n const simulator: Simulator = await createSimulator();\n\n // verify endpoint is set correctly from flow prop\n expect(simulator.endpoint).to.equal(`/flow/simulate/${FLOW_UUID}/`);\n\n // change flow prop and verify endpoint updates\n simulator.flow = 'different-flow-456';\n await simulator.updateComplete;\n\n expect(simulator.endpoint).to.equal('/flow/simulate/different-flow-456/');\n });\n});\n"]}
|
package/package.json
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/src/Icons.ts
CHANGED