mirror of https://github.com/docusealco/docuseal
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
4.7 KiB
117 lines
4.7 KiB
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');
|
|
});
|
|
});
|