From a4011676f060b2f0737656f731caaf0552c9e025 Mon Sep 17 00:00:00 2001 From: Baptiste Devessier Date: Fri, 24 Jan 2025 18:38:35 +0100 Subject: [PATCH] Add e2e tests for the Use as Draft feature (#9845) Test with and without a draft version as the last version of the workflow --- .../lib/fixtures/blank-workflow.ts | 10 + .../tests/workflow-use-as-draft.spec.ts | 175 ++++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100644 packages/twenty-e2e-testing/tests/workflow-use-as-draft.spec.ts diff --git a/packages/twenty-e2e-testing/lib/fixtures/blank-workflow.ts b/packages/twenty-e2e-testing/lib/fixtures/blank-workflow.ts index b6f96a20a..4c554002c 100644 --- a/packages/twenty-e2e-testing/lib/fixtures/blank-workflow.ts +++ b/packages/twenty-e2e-testing/lib/fixtures/blank-workflow.ts @@ -20,6 +20,9 @@ export class WorkflowVisualizerPage { readonly workflowNameButton: Locator; readonly triggerNode: Locator; readonly background: Locator; + readonly useAsDraftButton: Locator; + readonly overrideDraftButton: Locator; + readonly discardDraftButton: Locator; #actionNames: Record = { 'create-record': 'Create Record', @@ -70,6 +73,13 @@ export class WorkflowVisualizerPage { }); this.triggerNode = this.#page.getByTestId('rf__node-trigger'); this.background = page.locator('.react-flow__pane'); + this.useAsDraftButton = page.getByRole('button', { name: 'Use as draft' }); + this.overrideDraftButton = page.getByRole('button', { + name: 'Override Draft', + }); + this.discardDraftButton = page.getByRole('button', { + name: 'Discard Draft', + }); } async createOneWorkflow() { diff --git a/packages/twenty-e2e-testing/tests/workflow-use-as-draft.spec.ts b/packages/twenty-e2e-testing/tests/workflow-use-as-draft.spec.ts new file mode 100644 index 000000000..20226a587 --- /dev/null +++ b/packages/twenty-e2e-testing/tests/workflow-use-as-draft.spec.ts @@ -0,0 +1,175 @@ +import { expect } from '@playwright/test'; +import { test } from '../lib/fixtures/blank-workflow'; + +test('Use an old version as draft', async ({ workflowVisualizer, page }) => { + await workflowVisualizer.createInitialTrigger('record-created'); + + await workflowVisualizer.createStep('create-record'); + + await workflowVisualizer.background.click(); + + await Promise.all([ + expect(workflowVisualizer.workflowStatus).toHaveText('Active'), + + workflowVisualizer.activateWorkflowButton.click(), + ]); + + await Promise.all([ + expect(workflowVisualizer.workflowStatus).toHaveText('Draft'), + + workflowVisualizer.createStep('delete-record'), + ]); + + await workflowVisualizer.background.click(); + + await Promise.all([ + expect(workflowVisualizer.workflowStatus).toHaveText('Active'), + + workflowVisualizer.activateWorkflowButton.click(), + ]); + + await expect(workflowVisualizer.triggerNode).toContainText( + 'Record is Created', + ); + await expect(workflowVisualizer.getAllStepNodes()).toContainText([ + 'Create Record', + 'Delete Record', + ]); + await expect(workflowVisualizer.getAllStepNodes()).toHaveCount(2); + await expect(workflowVisualizer.useAsDraftButton).not.toBeVisible(); + + const workflowsLink = page.getByRole('link', { name: 'Workflows' }); + await workflowsLink.click(); + + const recordTableRowForWorkflow = page.getByRole('row', { + name: workflowVisualizer.workflowName, + }); + + const linkToWorkflow = recordTableRowForWorkflow.getByRole('link', { + name: workflowVisualizer.workflowName, + }); + expect(linkToWorkflow).toBeVisible(); + + const linkToFirstWorkflowVersion = recordTableRowForWorkflow.getByRole( + 'link', + { + name: 'v1', + }, + ); + + await linkToFirstWorkflowVersion.click(); + + await expect(workflowVisualizer.workflowStatus).toHaveText('Archived'); + await expect(workflowVisualizer.useAsDraftButton).toBeVisible(); + await expect(workflowVisualizer.triggerNode).toContainText( + 'Record is Created', + ); + await expect(workflowVisualizer.getAllStepNodes()).toContainText([ + 'Create Record', + ]); + await expect(workflowVisualizer.getAllStepNodes()).toHaveCount(1); + + await Promise.all([ + page.waitForURL(`/object/workflow/${workflowVisualizer.workflowId}`), + + workflowVisualizer.useAsDraftButton.click(), + ]); + + await expect(workflowVisualizer.workflowStatus).toHaveText('Draft'); + await expect(workflowVisualizer.useAsDraftButton).not.toBeVisible(); + await expect(workflowVisualizer.triggerNode).toContainText( + 'Record is Created', + ); + await expect(workflowVisualizer.getAllStepNodes()).toContainText([ + 'Create Record', + ]); + await expect(workflowVisualizer.getAllStepNodes()).toHaveCount(1); +}); + +test('Use an old version as draft while having a pending draft version', async ({ + workflowVisualizer, + page, +}) => { + await workflowVisualizer.createInitialTrigger('record-created'); + + await workflowVisualizer.createStep('create-record'); + + await workflowVisualizer.background.click(); + + await Promise.all([ + expect(workflowVisualizer.workflowStatus).toHaveText('Active'), + + workflowVisualizer.activateWorkflowButton.click(), + ]); + + await Promise.all([ + expect(workflowVisualizer.workflowStatus).toHaveText('Draft'), + + workflowVisualizer.createStep('delete-record'), + ]); + + await expect(workflowVisualizer.triggerNode).toContainText( + 'Record is Created', + ); + await expect(workflowVisualizer.getAllStepNodes()).toContainText([ + 'Create Record', + 'Delete Record', + ]); + await expect(workflowVisualizer.getAllStepNodes()).toHaveCount(2); + await expect(workflowVisualizer.useAsDraftButton).not.toBeVisible(); + + const workflowsLink = page.getByRole('link', { name: 'Workflows' }); + await workflowsLink.click(); + + const recordTableRowForWorkflow = page.getByRole('row', { + name: workflowVisualizer.workflowName, + }); + + const linkToWorkflow = recordTableRowForWorkflow.getByRole('link', { + name: workflowVisualizer.workflowName, + }); + expect(linkToWorkflow).toBeVisible(); + + const linkToFirstWorkflowVersion = recordTableRowForWorkflow.getByRole( + 'link', + { + name: 'v1', + }, + ); + + await linkToFirstWorkflowVersion.click(); + + await expect(workflowVisualizer.workflowStatus).toHaveText('Active'); + await expect(workflowVisualizer.useAsDraftButton).toBeVisible(); + await expect(workflowVisualizer.triggerNode).toContainText( + 'Record is Created', + ); + await expect(workflowVisualizer.getAllStepNodes()).toContainText([ + 'Create Record', + ]); + await expect(workflowVisualizer.getAllStepNodes()).toHaveCount(1); + + await Promise.all([ + expect(workflowVisualizer.overrideDraftButton).toBeVisible(), + + workflowVisualizer.useAsDraftButton.click(), + ]); + + await Promise.all([ + page.waitForURL(`/object/workflow/${workflowVisualizer.workflowId}`), + + workflowVisualizer.overrideDraftButton.click(), + ]); + + await expect(workflowVisualizer.workflowStatus).toHaveText('Draft'); + await expect(workflowVisualizer.useAsDraftButton).not.toBeVisible(); + await expect(workflowVisualizer.triggerNode).toContainText( + 'Record is Created', + ); + await expect(workflowVisualizer.getAllStepNodes()).toContainText([ + 'Create Record', + ]); + await expect(workflowVisualizer.getAllStepNodes()).toHaveCount(1); + await expect(workflowVisualizer.activateWorkflowButton).toBeVisible(); + await expect(workflowVisualizer.discardDraftButton).toBeVisible(); +});