Skip to content

feat: e2e tests with playwright #5

feat: e2e tests with playwright

feat: e2e tests with playwright #5

Triggered via pull request January 11, 2026 18:01
Status Failure
Total duration 6m 39s
Artifacts 1

ui-tests.yml

on: pull_request
Playwright E2E Tests
6m 20s
Playwright E2E Tests
Fit to window
Zoom out
Zoom in

Annotations

10 errors, 1 warning, and 1 notice
[chromium] › e2e/tests/workflow-editor.spec.ts:31:6 › Workflow Editor › should display existing nodes from workflow: e2e/helpers/frappe.ts#L65
4) [chromium] › e2e/tests/workflow-editor.spec.ts:31:6 › Workflow Editor › should display existing nodes from workflow Error: Failed to create Hazel Workflow: {"exception":"frappe.exceptions.ValidationError: Trigger is required for the workflow!","exc_type":"ValidationError","_exc_source":"hazelnode (app)","exc":"[\"Traceback (most recent call last):\\n File \\\"apps/frappe/frappe/app.py\\\", line 121, in application\\n response = frappe.api.handle(request)\\n File \\\"apps/frappe/frappe/api/__init__.py\\\", line 63, in handle\\n data = endpoint(**arguments)\\n File \\\"apps/frappe/frappe/api/v1.py\\\", line 46, in create_doc\\n return frappe.new_doc(doctype, **data).insert()\\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^\\n File \\\"apps/frappe/frappe/model/document.py\\\", line 447, in insert\\n self.run_before_save_methods()\\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^\\n File \\\"apps/frappe/frappe/model/document.py\\\", line 1332, in run_before_save_methods\\n self.run_method(\\\"validate\\\")\\n ~~~~~~~~~~~~~~~^^^^^^^^^^^^\\n File \\\"apps/frappe/frappe/model/document.py\\\", line 1181, in run_method\\n out = Document.hook(fn)(self, *args, **kwargs)\\n File \\\"apps/frappe/frappe/model/document.py\\\", line 1578, in composer\\n return composed(self, method, *args, **kwargs)\\n File \\\"apps/frappe/frappe/model/document.py\\\", line 1556, in runner\\n add_to_return_value(self, fn(self, *args, **kwargs))\\n ~~^^^^^^^^^^^^^^^^^^^^^^^\\n File \\\"apps/frappe/frappe/model/document.py\\\", line 1178, in fn\\n return method_object(*args, **kwargs)\\n File \\\"apps/hazelnode/hazelnode/hazelnode/doctype/hazel_workflow/hazel_workflow.py\\\", line 34, in validate\\n self.validate_nodes()\\n ~~~~~~~~~~~~~~~~~~~^^\\n File \\\"apps/hazelnode/hazelnode/hazelnode/doctype/hazel_workflow/hazel_workflow.py\\\", line 37, in validate_nodes\\n self.validate_trigger_is_required()\\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^\\n File \\\"apps/hazelnode/hazelnode/hazelnode/doctype/hazel_workflow/hazel_workflow.py\\\", line 47, in validate_trigger_is_required\\n frappe.throw('Trigger is required for the workflow!')\\n ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\n File \\\"apps/frappe/frappe/utils/messages.py\\\", line 148, in throw\\n msgprint(\\n ~~~~~~~~^\\n \\tmsg,\\n ^^^^\\n ...<6 lines>...\\n \\tprimary_action=primary_action,\\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\n )\\n ^\\n File \\\"apps/frappe/frappe/utils/messages.py\\\", line 109, in msgprint\\n _raise_exception()\\n ~~~~~~~~~~~~~~~~^^\\n File \\\"apps/frappe/frappe/utils/messages.py\\\", line 58, in _raise_exception\\n raise exc\\nfrappe.exceptions.ValidationError: Trigger is required for the workflow!\\n\"]","_server_messages":"[\"{\\\"message\\\":\\\"Trigger is required for the workflow!\\\",\\\"as_table\\\":false,\\\"title\\\":\\\"Message\\\",\\\"indicator\\\":\\\"red\\\",\\\"raise_exception\\\":1,\\\"__frappe_exc_id\\\":\\\"a009418dd451c6675faa81fc21e5e5685635e51a8bc0c51c8051e219\\\"}\"]"} at ../helpers/frappe.ts:65 63 | if (!response.ok()) { 64 | const error = await response.text(); > 65 | throw new Error(`Failed to create ${doctype}: ${error}`); | ^ 66 | } 67 | 68 | const result = await response.json(); at createDoc (/home/runner/work/hazelnode/hazelnode/e2e/helpers/frappe.ts:65:9) at createTestWorkflow (/home/runner/work/hazelnode/hazelnode/e2e/helpers/workflow.ts:50:14) at /home/runner/work/hazelnode/hazelnode/e2e/tests/workflow-editor.spec.ts:36:24
[chromium] › e2e/tests/workflow-crud.spec.ts:111:6 › Workflow CRUD Operations › should cancel workflow creation dialog: e2e/pages/workflow-list.page.ts#L71
3) [chromium] › e2e/tests/workflow-crud.spec.ts:111:6 › Workflow CRUD Operations › should cancel workflow creation dialog Retry #2 ─────────────────────────────────────────────────────────────────────────────────────── TimeoutError: locator.waitFor: Timeout 15000ms exceeded. Call log: - waiting for locator('[role="dialog"]') to be visible 35 × locator resolved to hidden <div data-open="" role="dialog" tabindex="-1" aria-modal="true" id="headlessui-dialog-:r0:" data-headlessui-state="open" aria-labelledby="headlessui-dialog-title-:r2:">…</div> at ../pages/workflow-list.page.ts:71 69 | async openCreateDialog(): Promise<void> { 70 | await this.newWorkflowButton.click(); > 71 | await this.createDialog.waitFor({ state: 'visible' }); | ^ 72 | } 73 | 74 | /** at WorkflowListPage.openCreateDialog (/home/runner/work/hazelnode/hazelnode/e2e/pages/workflow-list.page.ts:71:27) at /home/runner/work/hazelnode/hazelnode/e2e/tests/workflow-crud.spec.ts:115:3
[chromium] › e2e/tests/workflow-crud.spec.ts:111:6 › Workflow CRUD Operations › should cancel workflow creation dialog: e2e/pages/workflow-list.page.ts#L71
3) [chromium] › e2e/tests/workflow-crud.spec.ts:111:6 › Workflow CRUD Operations › should cancel workflow creation dialog Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── TimeoutError: locator.waitFor: Timeout 15000ms exceeded. Call log: - waiting for locator('[role="dialog"]') to be visible 35 × locator resolved to hidden <div data-open="" role="dialog" tabindex="-1" aria-modal="true" id="headlessui-dialog-:r0:" data-headlessui-state="open" aria-labelledby="headlessui-dialog-title-:r2:">…</div> at ../pages/workflow-list.page.ts:71 69 | async openCreateDialog(): Promise<void> { 70 | await this.newWorkflowButton.click(); > 71 | await this.createDialog.waitFor({ state: 'visible' }); | ^ 72 | } 73 | 74 | /** at WorkflowListPage.openCreateDialog (/home/runner/work/hazelnode/hazelnode/e2e/pages/workflow-list.page.ts:71:27) at /home/runner/work/hazelnode/hazelnode/e2e/tests/workflow-crud.spec.ts:115:3
[chromium] › e2e/tests/workflow-crud.spec.ts:111:6 › Workflow CRUD Operations › should cancel workflow creation dialog: e2e/pages/workflow-list.page.ts#L71
3) [chromium] › e2e/tests/workflow-crud.spec.ts:111:6 › Workflow CRUD Operations › should cancel workflow creation dialog TimeoutError: locator.waitFor: Timeout 15000ms exceeded. Call log: - waiting for locator('[role="dialog"]') to be visible 35 × locator resolved to hidden <div data-open="" role="dialog" tabindex="-1" aria-modal="true" id="headlessui-dialog-:r0:" data-headlessui-state="open" aria-labelledby="headlessui-dialog-title-:r2:">…</div> at ../pages/workflow-list.page.ts:71 69 | async openCreateDialog(): Promise<void> { 70 | await this.newWorkflowButton.click(); > 71 | await this.createDialog.waitFor({ state: 'visible' }); | ^ 72 | } 73 | 74 | /** at WorkflowListPage.openCreateDialog (/home/runner/work/hazelnode/hazelnode/e2e/pages/workflow-list.page.ts:71:27) at /home/runner/work/hazelnode/hazelnode/e2e/tests/workflow-crud.spec.ts:115:3
[chromium] › e2e/tests/workflow-crud.spec.ts:82:6 › Workflow CRUD Operations › should toggle workflow enabled state: e2e/tests/workflow-crud.spec.ts#L98
2) [chromium] › e2e/tests/workflow-crud.spec.ts:82:6 › Workflow CRUD Operations › should toggle workflow enabled state Retry #2 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(received).toBeTruthy() Received: undefined 96 | const workflow = await getWorkflow(request, workflowName); 97 | // Initial state should be 0/false, after toggle should be 1/true > 98 | expect(workflow.is_active).toBeTruthy(); | ^ 99 | 100 | // Toggle back 101 | await listPage.toggleWorkflowEnabled(workflowTitle); at /home/runner/work/hazelnode/hazelnode/e2e/tests/workflow-crud.spec.ts:98:31
[chromium] › e2e/tests/workflow-crud.spec.ts:82:6 › Workflow CRUD Operations › should toggle workflow enabled state: e2e/tests/workflow-crud.spec.ts#L98
2) [chromium] › e2e/tests/workflow-crud.spec.ts:82:6 › Workflow CRUD Operations › should toggle workflow enabled state Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(received).toBeTruthy() Received: undefined 96 | const workflow = await getWorkflow(request, workflowName); 97 | // Initial state should be 0/false, after toggle should be 1/true > 98 | expect(workflow.is_active).toBeTruthy(); | ^ 99 | 100 | // Toggle back 101 | await listPage.toggleWorkflowEnabled(workflowTitle); at /home/runner/work/hazelnode/hazelnode/e2e/tests/workflow-crud.spec.ts:98:31
[chromium] › e2e/tests/workflow-crud.spec.ts:82:6 › Workflow CRUD Operations › should toggle workflow enabled state: e2e/tests/workflow-crud.spec.ts#L98
2) [chromium] › e2e/tests/workflow-crud.spec.ts:82:6 › Workflow CRUD Operations › should toggle workflow enabled state Error: expect(received).toBeTruthy() Received: undefined 96 | const workflow = await getWorkflow(request, workflowName); 97 | // Initial state should be 0/false, after toggle should be 1/true > 98 | expect(workflow.is_active).toBeTruthy(); | ^ 99 | 100 | // Toggle back 101 | await listPage.toggleWorkflowEnabled(workflowTitle); at /home/runner/work/hazelnode/hazelnode/e2e/tests/workflow-crud.spec.ts:98:31
[chromium] › e2e/tests/workflow-crud.spec.ts:23:6 › Workflow CRUD Operations › should create a new workflow via UI: e2e/pages/workflow-list.page.ts#L71
1) [chromium] › e2e/tests/workflow-crud.spec.ts:23:6 › Workflow CRUD Operations › should create a new workflow via UI Retry #2 ─────────────────────────────────────────────────────────────────────────────────────── TimeoutError: locator.waitFor: Timeout 15000ms exceeded. Call log: - waiting for locator('[role="dialog"]') to be visible 35 × locator resolved to hidden <div data-open="" role="dialog" tabindex="-1" aria-modal="true" id="headlessui-dialog-:r0:" data-headlessui-state="open" aria-labelledby="headlessui-dialog-title-:r2:">…</div> at ../pages/workflow-list.page.ts:71 69 | async openCreateDialog(): Promise<void> { 70 | await this.newWorkflowButton.click(); > 71 | await this.createDialog.waitFor({ state: 'visible' }); | ^ 72 | } 73 | 74 | /** at WorkflowListPage.openCreateDialog (/home/runner/work/hazelnode/hazelnode/e2e/pages/workflow-list.page.ts:71:27) at WorkflowListPage.createWorkflow (/home/runner/work/hazelnode/hazelnode/e2e/pages/workflow-list.page.ts:78:3) at /home/runner/work/hazelnode/hazelnode/e2e/tests/workflow-crud.spec.ts:28:3
[chromium] › e2e/tests/workflow-crud.spec.ts:23:6 › Workflow CRUD Operations › should create a new workflow via UI: e2e/pages/workflow-list.page.ts#L71
1) [chromium] › e2e/tests/workflow-crud.spec.ts:23:6 › Workflow CRUD Operations › should create a new workflow via UI Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── TimeoutError: locator.waitFor: Timeout 15000ms exceeded. Call log: - waiting for locator('[role="dialog"]') to be visible 35 × locator resolved to hidden <div data-open="" role="dialog" tabindex="-1" aria-modal="true" id="headlessui-dialog-:r0:" data-headlessui-state="open" aria-labelledby="headlessui-dialog-title-:r2:">…</div> at ../pages/workflow-list.page.ts:71 69 | async openCreateDialog(): Promise<void> { 70 | await this.newWorkflowButton.click(); > 71 | await this.createDialog.waitFor({ state: 'visible' }); | ^ 72 | } 73 | 74 | /** at WorkflowListPage.openCreateDialog (/home/runner/work/hazelnode/hazelnode/e2e/pages/workflow-list.page.ts:71:27) at WorkflowListPage.createWorkflow (/home/runner/work/hazelnode/hazelnode/e2e/pages/workflow-list.page.ts:78:3) at /home/runner/work/hazelnode/hazelnode/e2e/tests/workflow-crud.spec.ts:28:3
[chromium] › e2e/tests/workflow-crud.spec.ts:23:6 › Workflow CRUD Operations › should create a new workflow via UI: e2e/pages/workflow-list.page.ts#L71
1) [chromium] › e2e/tests/workflow-crud.spec.ts:23:6 › Workflow CRUD Operations › should create a new workflow via UI TimeoutError: locator.waitFor: Timeout 15000ms exceeded. Call log: - waiting for locator('[role="dialog"]') to be visible 35 × locator resolved to hidden <div data-open="" role="dialog" tabindex="-1" aria-modal="true" id="headlessui-dialog-:r0:" data-headlessui-state="open" aria-labelledby="headlessui-dialog-title-:r2:">…</div> at ../pages/workflow-list.page.ts:71 69 | async openCreateDialog(): Promise<void> { 70 | await this.newWorkflowButton.click(); > 71 | await this.createDialog.waitFor({ state: 'visible' }); | ^ 72 | } 73 | 74 | /** at WorkflowListPage.openCreateDialog (/home/runner/work/hazelnode/hazelnode/e2e/pages/workflow-list.page.ts:71:27) at WorkflowListPage.createWorkflow (/home/runner/work/hazelnode/hazelnode/e2e/pages/workflow-list.page.ts:78:3) at /home/runner/work/hazelnode/hazelnode/e2e/tests/workflow-crud.spec.ts:28:3
Playwright E2E Tests
No files were found with the provided path: playwright-report/. No artifacts will be uploaded.
🎭 Playwright Run Summary
10 failed [chromium] › e2e/tests/workflow-crud.spec.ts:23:6 › Workflow CRUD Operations › should create a new workflow via UI [chromium] › e2e/tests/workflow-crud.spec.ts:82:6 › Workflow CRUD Operations › should toggle workflow enabled state [chromium] › e2e/tests/workflow-crud.spec.ts:111:6 › Workflow CRUD Operations › should cancel workflow creation dialog [chromium] › e2e/tests/workflow-editor.spec.ts:31:6 › Workflow Editor › should display existing nodes from workflow [chromium] › e2e/tests/workflow-editor.spec.ts:53:6 › Workflow Editor › should display existing edges from workflow [chromium] › e2e/tests/workflow-editor.spec.ts:112:6 › Workflow Editor › should select a node when clicked [chromium] › e2e/tests/workflow-editor.spec.ts:137:6 › Workflow Editor › should use zoom controls [chromium] › e2e/tests/workflow-editor.spec.ts:161:6 › Workflow Editor › should persist node count after page reload [chromium] › e2e/tests/workflow-editor.spec.ts:202:6 › Workflow Editor - Node Interactions › should drag and drop node from palette to canvas [chromium] › e2e/tests/workflow-editor.spec.ts:230:6 › Workflow Editor - Node Interactions › should delete node with keyboard 13 passed (3.4m)

Artifacts

Produced during runtime
Name Size Digest
test-results Expired
5.32 MB
sha256:8c31e8f3afb04068b501989734c17f5b4890d4d112d97e95d19986915e7d0cb7