import { test, expect } from '@playwright/test'; import { loginAsAdmin } from './helpers/auth'; import * as path from 'path'; // Phase 1.1 — Custom Logo Support. // Upload a PNG logo, verify it appears in the navbar, // delete it and verify the default SVG returns, // then check CUSTOM_LOGO_URL env override behaviour. const FIXTURE_LOGO = path.resolve(__dirname, 'fixtures', 'test-logo.png'); test.describe('Custom logo', () => { test('upload a PNG logo and verify it appears in the navbar', async ({ page }) => { await loginAsAdmin(page); await page.goto('/settings/personalization'); const fileInput = page.locator('#account_logo_input'); await expect(fileInput).toBeVisible(); await fileInput.setInputFiles(FIXTURE_LOGO); await page.getByRole('button', { name: /upload logo/i }).click(); await page.waitForLoadState('networkidle'); // Verify success flash await expect(page.locator('body')).toContainText(/logo has been saved/i); // Verify the logo preview appears on the personalization page const preview = page.locator('img[data-logo-preview="true"]'); await expect(preview).toBeVisible(); // Navigate to home and verify the custom logo is in the navbar await page.goto('/'); const navbarLogo = page.locator('img[data-custom-logo="true"]'); await expect(navbarLogo).toBeVisible(); // Ensure the default SVG is NOT rendered const defaultSvg = page.locator('a[href="/"] svg'); await expect(defaultSvg).toHaveCount(0); }); test('delete the logo and verify the default DocuSeal logo returns', async ({ page }) => { await loginAsAdmin(page); // First upload a logo so we can delete it await page.goto('/settings/personalization'); const fileInput = page.locator('#account_logo_input'); await fileInput.setInputFiles(FIXTURE_LOGO); await page.getByRole('button', { name: /upload logo/i }).click(); await page.waitForLoadState('networkidle'); // Confirm it was uploaded await expect(page.locator('img[data-logo-preview="true"]')).toBeVisible(); // Click Remove and accept the confirmation dialog page.on('dialog', (dialog) => dialog.accept()); await page.getByRole('button', { name: /remove/i }).click(); await page.waitForLoadState('networkidle'); // Verify success flash await expect(page.locator('body')).toContainText(/logo has been removed/i); // Navigate to home and verify the default SVG logo is back await page.goto('/'); const defaultSvg = page.locator('a[href="/"] svg'); await expect(defaultSvg.first()).toBeVisible(); // Ensure no custom logo img tag is present const customLogo = page.locator('img[data-custom-logo="true"]'); await expect(customLogo).toHaveCount(0); }); test('CUSTOM_LOGO_URL env wins over default but per-account upload wins over env', async ({ page }) => { // This test validates the fallback chain conceptually. // Since we cannot easily set env vars on the running server, we verify: // 1. When no logo is uploaded and no env var is set, the default SVG renders. // 2. When a logo is uploaded, the custom img renders (already tested above). // // The env var behaviour is verified by checking the shared/_logo.html.erb // template logic, but we can at least verify the default state. await loginAsAdmin(page); // Ensure no logo is attached (delete if present) await page.goto('/settings/personalization'); const removeBtn = page.getByRole('button', { name: /remove/i }); if (await removeBtn.isVisible()) { page.on('dialog', (dialog) => dialog.accept()); await removeBtn.click(); await page.waitForLoadState('networkidle'); } // Verify default SVG renders on home page await page.goto('/'); const defaultSvg = page.locator('a[href="/"] svg'); await expect(defaultSvg.first()).toBeVisible(); // Upload a logo — it should override any default await page.goto('/settings/personalization'); const fileInput = page.locator('#account_logo_input'); await fileInput.setInputFiles(FIXTURE_LOGO); await page.getByRole('button', { name: /upload logo/i }).click(); await page.waitForLoadState('networkidle'); // Verify custom logo renders in navbar (would also win over env var) await page.goto('/'); const customLogo = page.locator('img[data-custom-logo="true"]'); await expect(customLogo).toBeVisible(); await expect(page.locator('a[href="/"] svg')).toHaveCount(0); // Clean up: remove the uploaded logo await page.goto('/settings/personalization'); page.on('dialog', (dialog) => dialog.accept()); await page.getByRole('button', { name: /remove/i }).click(); await page.waitForLoadState('networkidle'); }); });