diff --git a/tests/integration/backup-restore-e2e.spec.ts b/tests/integration/backup-restore-e2e.spec.ts index 3114df9a..250d198c 100644 --- a/tests/integration/backup-restore-e2e.spec.ts +++ b/tests/integration/backup-restore-e2e.spec.ts @@ -1,5 +1,5 @@ /** - * Backup & Restore E2E Tests (Phase 6.5) + * Backup & Restore E2E Tests * * Tests for complete backup and restore workflows including * scheduling, verification, and disaster recovery scenarios. diff --git a/tests/integration/import-to-production.spec.ts b/tests/integration/import-to-production.spec.ts index 679d0728..de8acab8 100644 --- a/tests/integration/import-to-production.spec.ts +++ b/tests/integration/import-to-production.spec.ts @@ -1,5 +1,5 @@ /** - * Import to Production E2E Tests (Phase 6.6) + * Import to Production E2E Tests * * Tests for importing configurations from external sources * (Caddyfile, NPM, JSON) into the production system. diff --git a/tests/integration/multi-feature-workflows.spec.ts b/tests/integration/multi-feature-workflows.spec.ts index bb54881e..dd087aef 100644 --- a/tests/integration/multi-feature-workflows.spec.ts +++ b/tests/integration/multi-feature-workflows.spec.ts @@ -1,5 +1,5 @@ /** - * Multi-Feature Workflows E2E Tests (Phase 6.7) + * Multi-Feature Workflows E2E Tests * * Tests for complex workflows that span multiple features, * testing real-world usage scenarios and feature interactions. @@ -58,6 +58,20 @@ const SELECTORS = { loadingSpinner: '[data-testid="loading"], .loading, .spinner', }; +async function navigateToDnsProviders(page: import('@playwright/test').Page): Promise { + const providersResponse = waitForAPIResponse(page, /\/api\/v1\/dns-providers/); + await page.goto('/dns/providers'); + await providersResponse; + await waitForLoadingComplete(page); +} + +async function navigateToCertificates(page: import('@playwright/test').Page): Promise { + const certsResponse = waitForAPIResponse(page, /\/api\/v1\/certificates/); + await page.goto('/certificates'); + await certsResponse; + await waitForLoadingComplete(page); +} + test.describe('Multi-Feature Workflows E2E', () => { // =========================================================================== // Group A: Complete Host Setup Workflow (5 tests) @@ -212,17 +226,19 @@ test.describe('Multi-Feature Workflows E2E', () => { }) => { await loginUser(page, adminUser); + const dnsProvider = generateDnsProvider(); + await test.step('Create DNS provider', async () => { - const dnsProvider = generateDnsProvider(); await testData.createDNSProvider({ name: dnsProvider.name, providerType: dnsProvider.provider_type, credentials: dnsProvider.credentials, }); + }); - await page.goto('/dns-providers'); - await waitForLoadingComplete(page); - await expect(page.getByText(dnsProvider.name)).toBeVisible(); + await test.step('Verify DNS provider appears in list', async () => { + await navigateToDnsProviders(page); + await waitForResourceInUI(page, dnsProvider.name); }); }); @@ -233,24 +249,24 @@ test.describe('Multi-Feature Workflows E2E', () => { }) => { await loginUser(page, adminUser); + const dnsProvider = generateDnsProvider(); + await test.step('Create DNS provider first', async () => { - const dnsProvider = generateDnsProvider(); await testData.createDNSProvider({ name: dnsProvider.name, providerType: dnsProvider.provider_type, credentials: dnsProvider.credentials, }); + }); - await page.goto('/dns-providers'); - await waitForLoadingComplete(page); - await expect(page.getByText(dnsProvider.name)).toBeVisible(); + await test.step('Confirm DNS provider is available', async () => { + await navigateToDnsProviders(page); + await waitForResourceInUI(page, dnsProvider.name); }); await test.step('Navigate to certificates', async () => { - await page.goto('/certificates'); - await waitForLoadingComplete(page); - const content = page.locator('main, .content').first(); - await expect(content).toBeVisible(); + await navigateToCertificates(page); + await expect(page.getByRole('main')).toBeVisible(); }); }); @@ -269,15 +285,16 @@ test.describe('Multi-Feature Workflows E2E', () => { forwardPort: proxyInput.forwardPort, }); + const proxiesResponse = waitForAPIResponse(page, /\/api\/v1\/proxy-hosts/); await page.goto('/proxy-hosts'); + await proxiesResponse; + await waitForLoadingComplete(page); await waitForResourceInUI(page, proxy.domain); }); await test.step('Navigate to certificates', async () => { - await page.goto('/certificates'); - await waitForLoadingComplete(page); - const content = page.locator('main, .content').first(); - await expect(content).toBeVisible(); + await navigateToCertificates(page); + await expect(page.getByRole('main')).toBeVisible(); }); }); @@ -288,13 +305,11 @@ test.describe('Multi-Feature Workflows E2E', () => { await loginUser(page, adminUser); await test.step('Navigate to certificates', async () => { - await page.goto('/certificates'); - await waitForLoadingComplete(page); + await navigateToCertificates(page); }); await test.step('Verify certificate management page', async () => { - const content = page.locator('main, .content').first(); - await expect(content).toBeVisible(); + await expect(page.getByRole('main')).toBeVisible(); }); }); }); diff --git a/tests/integration/proxy-certificate.spec.ts b/tests/integration/proxy-certificate.spec.ts index 58188557..b8edfba4 100644 --- a/tests/integration/proxy-certificate.spec.ts +++ b/tests/integration/proxy-certificate.spec.ts @@ -1,5 +1,5 @@ /** - * Proxy + Certificate Integration E2E Tests (Phase 6.2) + * Proxy + Certificate Integration E2E Tests * * Tests for proxy host and SSL certificate integration workflows. * Covers certificate assignment, ACME challenges, renewal, and edge cases. @@ -30,9 +30,27 @@ import { waitForLoadingComplete, waitForAPIResponse, waitForModal, + waitForResourceInUI, clickAndWaitForResponse, } from '../utils/wait-helpers'; +const DNS_PROVIDERS_API_PATTERN = /\/api\/v1\/dns-providers/; +const CERTIFICATES_API_PATTERN = /\/api\/v1\/certificates/; + +async function navigateToDnsProviders(page: import('@playwright/test').Page): Promise { + const providersResponse = waitForAPIResponse(page, DNS_PROVIDERS_API_PATTERN); + await page.goto('/dns/providers'); + await providersResponse; + await waitForLoadingComplete(page); +} + +async function navigateToCertificates(page: import('@playwright/test').Page): Promise { + const certsResponse = waitForAPIResponse(page, CERTIFICATES_API_PATTERN); + await page.goto('/certificates'); + await certsResponse; + await waitForLoadingComplete(page); +} + /** * Selectors for Certificate and Proxy Host pages */ @@ -257,8 +275,7 @@ test.describe('Proxy + Certificate Integration', () => { }); await test.step('Navigate to certificates', async () => { - await page.goto('/certificates'); - await waitForLoadingComplete(page); + await navigateToCertificates(page); }); await test.step('Verify page loads', async () => { @@ -304,14 +321,11 @@ test.describe('Proxy + Certificate Integration', () => { }); await test.step('Navigate to DNS providers', async () => { - await page.goto('/dns-providers'); - await waitForLoadingComplete(page); + await navigateToDnsProviders(page); }); await test.step('Verify DNS provider exists', async () => { - // The provider name contains namespace prefix - const content = page.locator('main, table, .content').first(); - await expect(content).toBeVisible(); + await waitForResourceInUI(page, /Cloudflare-DNS-Test/i); }); }); }); diff --git a/tests/integration/proxy-dns-integration.spec.ts b/tests/integration/proxy-dns-integration.spec.ts index a8c19d49..8c24c50e 100644 --- a/tests/integration/proxy-dns-integration.spec.ts +++ b/tests/integration/proxy-dns-integration.spec.ts @@ -1,5 +1,5 @@ /** - * Proxy + DNS Provider Integration E2E Tests (Phase 6.3) + * Proxy + DNS Provider Integration E2E Tests * * Tests for proxy host and DNS provider integration workflows. * Covers DNS provider configuration, ACME DNS-01 challenges, and validation. @@ -18,11 +18,9 @@ import { test, expect, loginUser, TEST_PASSWORD } from '../fixtures/auth-fixtures'; import { generateProxyHost } from '../fixtures/proxy-hosts'; import { - waitForToast, waitForLoadingComplete, waitForAPIResponse, - waitForModal, - clickAndWaitForResponse, + waitForResourceInUI, } from '../utils/wait-helpers'; /** @@ -30,6 +28,20 @@ import { */ type DNSProviderType = 'manual' | 'cloudflare' | 'route53' | 'webhook' | 'rfc2136'; +async function navigateToDnsProviders(page: import('@playwright/test').Page): Promise { + const providersResponse = waitForAPIResponse(page, /\/api\/v1\/dns-providers/); + await page.goto('/dns/providers'); + await providersResponse; + await waitForLoadingComplete(page); +} + +async function navigateToCertificates(page: import('@playwright/test').Page): Promise { + const certsResponse = waitForAPIResponse(page, /\/api\/v1\/certificates/); + await page.goto('/certificates'); + await certsResponse; + await waitForLoadingComplete(page); +} + /** * Selectors for DNS Provider and Proxy Host pages */ @@ -90,14 +102,11 @@ test.describe('Proxy + DNS Provider Integration', () => { }); await test.step('Navigate to DNS providers page', async () => { - await page.goto('/dns-providers'); - await waitForLoadingComplete(page); + await navigateToDnsProviders(page); }); await test.step('Verify DNS provider appears in list', async () => { - // The name is namespaced by TestDataManager - const content = page.locator('main, table, .content').first(); - await expect(content).toBeVisible(); + await waitForResourceInUI(page, /Manual-DNS-Test/i); }); }); @@ -120,13 +129,11 @@ test.describe('Proxy + DNS Provider Integration', () => { }); await test.step('Navigate to DNS providers', async () => { - await page.goto('/dns-providers'); - await waitForLoadingComplete(page); + await navigateToDnsProviders(page); }); await test.step('Verify provider is listed', async () => { - const content = page.locator('main, table').first(); - await expect(content).toBeVisible(); + await waitForResourceInUI(page, /Cloudflare-DNS-Test/i); }); }); @@ -146,8 +153,7 @@ test.describe('Proxy + DNS Provider Integration', () => { }); await test.step('Navigate to certificates page', async () => { - await page.goto('/certificates'); - await waitForLoadingComplete(page); + await navigateToCertificates(page); }); await test.step('Verify certificates page loads', async () => { @@ -177,13 +183,11 @@ test.describe('Proxy + DNS Provider Integration', () => { }); await test.step('Navigate to DNS providers', async () => { - await page.goto('/dns-providers'); - await waitForLoadingComplete(page); + await navigateToDnsProviders(page); }); await test.step('Verify DNS providers page loads', async () => { - const content = page.locator('main, .content').first(); - await expect(content).toBeVisible(); + await waitForResourceInUI(page, /Connectivity-Test-DNS/i); }); }); @@ -203,14 +207,11 @@ test.describe('Proxy + DNS Provider Integration', () => { }); await test.step('Navigate to DNS providers', async () => { - await page.goto('/dns-providers'); - await waitForLoadingComplete(page); + await navigateToDnsProviders(page); }); await test.step('Verify page content', async () => { - // Manual providers show instructions for DNS record creation - const content = page.locator('main, table, .content').first(); - await expect(content).toBeVisible(); + await waitForResourceInUI(page, /Manual-Challenge-DNS/i); }); }); @@ -230,8 +231,7 @@ test.describe('Proxy + DNS Provider Integration', () => { }); await test.step('Navigate to certificates', async () => { - await page.goto('/certificates'); - await waitForLoadingComplete(page); + await navigateToCertificates(page); }); await test.step('Verify page loads', async () => { @@ -259,13 +259,11 @@ test.describe('Proxy + DNS Provider Integration', () => { }); await test.step('Navigate to DNS providers', async () => { - await page.goto('/dns-providers'); - await waitForLoadingComplete(page); + await navigateToDnsProviders(page); }); await test.step('Verify provider in list', async () => { - const content = page.locator('main, table').first(); - await expect(content).toBeVisible(); + await waitForResourceInUI(page, /Webhook-DNS-Test/i); }); }); }); @@ -289,11 +287,13 @@ test.describe('Proxy + DNS Provider Integration', () => { }, }); + const updatedName = 'Update-Credentials-DNS-Updated'; + await test.step('Update provider credentials via API', async () => { const response = await page.request.put(`/api/v1/dns-providers/${providerId}`, { data: { type: 'cloudflare', - name: 'Update-Credentials-DNS-Updated', + name: updatedName, credentials: { api_token: 'updated-token', }, @@ -303,13 +303,11 @@ test.describe('Proxy + DNS Provider Integration', () => { }); await test.step('Navigate to DNS providers', async () => { - await page.goto('/dns-providers'); - await waitForLoadingComplete(page); + await navigateToDnsProviders(page); }); await test.step('Verify updated provider', async () => { - const content = page.locator('main, table').first(); - await expect(content).toBeVisible(); + await waitForResourceInUI(page, updatedName); }); }); @@ -327,19 +325,22 @@ test.describe('Proxy + DNS Provider Integration', () => { }); await test.step('Navigate to DNS providers', async () => { - await page.goto('/dns-providers'); - await waitForLoadingComplete(page); + await navigateToDnsProviders(page); }); await test.step('Verify provider exists before deletion', async () => { - const content = page.locator('main, table').first(); - await expect(content).toBeVisible(); + await waitForResourceInUI(page, /Delete-Test-DNS/i); }); await test.step('Delete provider via API', async () => { const response = await page.request.delete(`/api/v1/dns-providers/${providerId}`); expect(response.ok()).toBeTruthy(); }); + + await test.step('Verify provider removed from list', async () => { + await navigateToDnsProviders(page); + await expect(page.getByText(/Delete-Test-DNS/i)).toHaveCount(0); + }); }); test('should list all configured DNS providers', async ({ @@ -363,13 +364,12 @@ test.describe('Proxy + DNS Provider Integration', () => { }); await test.step('Navigate to DNS providers', async () => { - await page.goto('/dns-providers'); - await waitForLoadingComplete(page); + await navigateToDnsProviders(page); }); await test.step('Verify providers list', async () => { - const content = page.locator('main, table').first(); - await expect(content).toBeVisible(); + await waitForResourceInUI(page, /List-Test-DNS-1/i); + await waitForResourceInUI(page, /List-Test-DNS-2/i); }); await test.step('Verify API returns providers', async () => {