mirror of
https://github.com/documenso/documenso.git
synced 2026-07-25 09:25:08 +10:00
ba0dead96f
Currently direct templates can be created without the required signatures fields for signers. This means that the document can be fully signed by everyone but will ultimately fail the sealing step which leaves the document in an unrecoverable state.
77 lines
3.1 KiB
TypeScript
77 lines
3.1 KiB
TypeScript
import { seedDirectTemplate } from '@documenso/prisma/seed/templates';
|
|
import { seedUser } from '@documenso/prisma/seed/users';
|
|
import { expect, type Page, test } from '@playwright/test';
|
|
|
|
import { apiSignin } from '../fixtures/authentication';
|
|
import { clickEnvelopeEditorStep } from '../fixtures/envelope-editor';
|
|
|
|
const INVALID_DIRECT_TEMPLATE_ALERT_TITLE = 'Invalid direct link template';
|
|
|
|
/**
|
|
* Place a field on the PDF canvas in the envelope editor.
|
|
*/
|
|
const placeFieldOnPdf = async (root: Page, fieldName: 'Signature' | 'Text', position: { x: number; y: number }) => {
|
|
await root.getByRole('button', { name: fieldName, exact: true }).click();
|
|
|
|
const canvas = root.locator('.konva-container canvas').first();
|
|
await expect(canvas).toBeVisible();
|
|
await canvas.click({ position });
|
|
};
|
|
|
|
/**
|
|
* Seed a V2 direct template and open it in the native template editor.
|
|
*
|
|
* Only the native template editor is covered here: direct links only exist
|
|
* for templates and are not part of the embedded editor surfaces.
|
|
*/
|
|
const openDirectTemplateEditor = async (page: Page, options: { createDirectRecipientSignatureField: boolean }) => {
|
|
const { user, team } = await seedUser();
|
|
|
|
const template = await seedDirectTemplate({
|
|
title: `E2E Direct Template Validation ${Date.now()}`,
|
|
userId: user.id,
|
|
teamId: team.id,
|
|
internalVersion: 2,
|
|
createDirectRecipientSignatureField: options.createDirectRecipientSignatureField,
|
|
});
|
|
|
|
await apiSignin({
|
|
page,
|
|
email: user.email,
|
|
redirectPath: `/t/${team.url}/templates/${template.id}/edit`,
|
|
});
|
|
|
|
return { user, team, template };
|
|
};
|
|
|
|
test.describe('template editor', () => {
|
|
test('shows invalid direct template warning when a signer has no signature field', async ({ page }) => {
|
|
await openDirectTemplateEditor(page, { createDirectRecipientSignatureField: false });
|
|
|
|
await expect(page.getByText(INVALID_DIRECT_TEMPLATE_ALERT_TITLE)).toBeVisible();
|
|
await expect(page.getByText('are missing a signature field')).toBeVisible();
|
|
});
|
|
|
|
test('does not show the warning when all signers have signature fields', async ({ page }) => {
|
|
await openDirectTemplateEditor(page, { createDirectRecipientSignatureField: true });
|
|
|
|
// Wait for the editor to render before asserting the banner is absent.
|
|
await expect(page.getByTestId('envelope-editor-step-upload')).toBeVisible();
|
|
await expect(page.getByText(INVALID_DIRECT_TEMPLATE_ALERT_TITLE)).not.toBeVisible();
|
|
});
|
|
|
|
test('warning disappears after placing a signature field', async ({ page }) => {
|
|
await openDirectTemplateEditor(page, { createDirectRecipientSignatureField: false });
|
|
|
|
await expect(page.getByText(INVALID_DIRECT_TEMPLATE_ALERT_TITLE)).toBeVisible();
|
|
|
|
// Place a signature field for the direct recipient (auto-selected single recipient).
|
|
await clickEnvelopeEditorStep(page, 'addFields');
|
|
await expect(page.locator('.konva-container canvas').first()).toBeVisible();
|
|
await placeFieldOnPdf(page, 'Signature', { x: 120, y: 140 });
|
|
|
|
// The banner clears once the field is autosaved and the envelope state updates.
|
|
await expect(page.getByText(INVALID_DIRECT_TEMPLATE_ALERT_TITLE)).not.toBeVisible({ timeout: 15_000 });
|
|
});
|
|
});
|