n8n/packages/testing/playwright/composables/TemplatesComposer.ts
Declan Carroll 6477c066c3
test: Janitor tsx shortcut, docs cleanup, dead code removal (#26210)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 06:11:26 +00:00

66 lines
2.8 KiB
TypeScript

import { expect } from '@playwright/test';
import type { n8nPage } from '../pages/n8nPage';
/**
* A class for user interactions with templates that go across multiple pages.
*/
export class TemplatesComposer {
constructor(private readonly n8n: n8nPage) {}
/**
* Navigates to templates page, waits for loading to complete,
* selects the first available template, and imports it to a new workflow
* @returns Promise that resolves when the template has been imported
*/
async importFirstTemplate(): Promise<void> {
await this.n8n.navigate.toTemplates();
await expect(this.n8n.templates.getSkeletonLoader()).toBeHidden();
await expect(this.n8n.templates.getFirstTemplateCard()).toBeVisible();
await expect(this.n8n.templates.getTemplatesLoadingContainer()).toBeHidden();
await this.n8n.templates.clickFirstTemplateCard();
await expect(this.n8n.templates.getUseTemplateButton()).toBeVisible();
await this.n8n.templates.clickUseTemplateButton();
// New workflows redirect to /workflow/<id>?new=true with optional templateId
await expect(this.n8n.page).toHaveURL(/\/workflow\/[a-zA-Z0-9_-]+\?.*new=true/);
}
/**
* Fill in dummy credentials for an app in the template credential setup flow
* Opens credential creation, fills name, saves, and closes modal
* @param appName - The name of the app (e.g. 'Shopify', 'X (Formerly Twitter)')
*/
async fillDummyCredentialForApp(
appName: string,
{ fields }: { fields: Record<string, string> } = { fields: {} },
): Promise<void> {
await this.n8n.templateCredentialSetup.openCredentialCreation(appName);
await this.n8n.templateCredentialSetup.credentialModal.getCredentialName().click();
await this.n8n.templateCredentialSetup.credentialModal.getNameInput().fill('test');
await this.n8n.templateCredentialSetup.credentialModal.fillAllFields(fields);
await this.n8n.templateCredentialSetup.credentialModal.save();
await this.n8n.templateCredentialSetup.credentialModal.close();
}
/**
* Fill in dummy credentials for an OAuth app.
* OAuth credentials have no Save button — clicking Connect implicitly saves.
* @param appName - The name of the app (e.g. 'X (Formerly Twitter)')
*/
async fillDummyCredentialForOAuthApp(
appName: string,
{ fields }: { fields: Record<string, string> } = { fields: {} },
): Promise<void> {
await this.n8n.templateCredentialSetup.openCredentialCreation(appName);
await this.n8n.templateCredentialSetup.credentialModal.getCredentialName().click();
await this.n8n.templateCredentialSetup.credentialModal.getNameInput().fill('test');
await this.n8n.templateCredentialSetup.credentialModal.fillAllFields(fields);
await this.n8n.templateCredentialSetup.credentialModal.oauthConnectButton.click();
await this.n8n.templateCredentialSetup.credentialModal.close();
await this.n8n.templateCredentialSetup.dismissMessageBox();
}
}