import type { n8nPage } from '../pages/n8nPage'; /** * A class for user interactions with workflows that go across multiple pages. */ export class WorkflowComposer { constructor(private readonly n8n: n8nPage) {} /** * Executes a successful workflow and waits for the notification to be closed. * This waits for http calls and also closes the notification. */ async executeWorkflowAndWaitForNotification( notificationMessage: string, options: { timeout?: number } = {}, ) { const { timeout = 3000 } = options; const responsePromise = this.n8n.page.waitForResponse( (response) => response.url().includes('/rest/workflows/') && response.url().includes('/run') && response.request().method() === 'POST', ); await this.n8n.canvas.clickExecuteWorkflowButton(); await responsePromise; await this.n8n.notifications.waitForNotificationAndClose(notificationMessage, { timeout }); } /** * Creates a new workflow by clicking the add workflow button and setting the name * @param workflowName - The name of the workflow to create */ async createWorkflow(workflowName = 'My New Workflow') { await this.n8n.workflows.clickAddWorkflowButton(); await this.n8n.canvas.setWorkflowName(workflowName); await this.n8n.canvas.saveWorkflow(); } /** * Creates a new workflow by importing a JSON file * @param fileName - The workflow JSON file name (e.g., 'test_pdf_workflow.json', will search in workflows folder) * @param name - Optional custom name. If not provided, generates a unique name * @returns The actual workflow name that was used */ async createWorkflowFromJsonFile( fileName: string, name?: string, ): Promise<{ workflowName: string }> { const workflowName = name ?? `Imported Workflow ${Date.now()}`; await this.n8n.goHome(); await this.n8n.workflows.clickAddWorkflowButton(); await this.n8n.canvas.importWorkflow(fileName, workflowName); return { workflowName }; } }