mirror of
https://github.com/documenso/documenso.git
synced 2026-07-25 01:15:49 +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.
102 lines
3.2 KiB
TypeScript
102 lines
3.2 KiB
TypeScript
import { FIELD_SIGNATURE_META_DEFAULT_VALUES } from '@documenso/lib/types/field-meta';
|
|
import { prisma } from '@documenso/prisma';
|
|
import { seedTemplate } from '@documenso/prisma/seed/templates';
|
|
import { seedUser } from '@documenso/prisma/seed/users';
|
|
import { expect, test } from '@playwright/test';
|
|
import { DocumentStatus, FieldType } from '@prisma/client';
|
|
|
|
import { apiSignin } from '../fixtures/authentication';
|
|
import { expectToastTextToBeVisible } from '../fixtures/generic';
|
|
|
|
const seedSignatureFieldForRecipient = async (options: { envelopeId: string; recipientId: number }) => {
|
|
const envelopeItem = await prisma.envelopeItem.findFirstOrThrow({
|
|
where: { envelopeId: options.envelopeId },
|
|
});
|
|
|
|
return await prisma.field.create({
|
|
data: {
|
|
envelopeId: options.envelopeId,
|
|
envelopeItemId: envelopeItem.id,
|
|
recipientId: options.recipientId,
|
|
type: FieldType.SIGNATURE,
|
|
page: 1,
|
|
positionX: 5,
|
|
positionY: 10,
|
|
width: 20,
|
|
height: 5,
|
|
customText: '',
|
|
inserted: false,
|
|
fieldMeta: FIELD_SIGNATURE_META_DEFAULT_VALUES,
|
|
},
|
|
});
|
|
};
|
|
|
|
test('[TEMPLATE_USE]: shows missing signature fields error when sending a template without signature fields', async ({
|
|
page,
|
|
}) => {
|
|
const { user, team } = await seedUser();
|
|
|
|
// seedTemplate creates one SIGNER recipient and no fields.
|
|
await seedTemplate({
|
|
title: 'Template missing signature fields',
|
|
userId: user.id,
|
|
teamId: team.id,
|
|
});
|
|
|
|
await apiSignin({
|
|
page,
|
|
email: user.email,
|
|
redirectPath: `/t/${team.url}/templates`,
|
|
});
|
|
|
|
await page.getByRole('button', { name: 'Use Template' }).click();
|
|
await expect(page.getByRole('heading', { name: 'Create document from template' })).toBeVisible();
|
|
|
|
// Enable distribution so the document is sent on creation.
|
|
await page.locator('#distributeDocument').click();
|
|
await page.getByRole('button', { name: 'Create and send' }).click();
|
|
|
|
await expectToastTextToBeVisible(page, 'Missing signature fields');
|
|
await expectToastTextToBeVisible(
|
|
page,
|
|
'The document could not be sent because some signers do not have a signature field',
|
|
);
|
|
});
|
|
|
|
test('[TEMPLATE_USE]: creates and sends a document when signers have signature fields', async ({ page }) => {
|
|
const { user, team } = await seedUser();
|
|
|
|
const template = await seedTemplate({
|
|
title: 'Template with signature fields',
|
|
userId: user.id,
|
|
teamId: team.id,
|
|
});
|
|
|
|
await seedSignatureFieldForRecipient({
|
|
envelopeId: template.id,
|
|
recipientId: template.recipients[0].id,
|
|
});
|
|
|
|
await apiSignin({
|
|
page,
|
|
email: user.email,
|
|
redirectPath: `/t/${team.url}/templates`,
|
|
});
|
|
|
|
await page.getByRole('button', { name: 'Use Template' }).click();
|
|
await expect(page.getByRole('heading', { name: 'Create document from template' })).toBeVisible();
|
|
|
|
await page.locator('#distributeDocument').click();
|
|
await page.getByRole('button', { name: 'Create and send' }).click();
|
|
|
|
await page.waitForURL(new RegExp(`/t/${team.url}/documents/envelope_.*`));
|
|
|
|
const envelopeId = page.url().split('/').pop()?.split('?')[0];
|
|
|
|
const envelope = await prisma.envelope.findFirstOrThrow({
|
|
where: { id: envelopeId },
|
|
});
|
|
|
|
expect(envelope.status).toBe(DocumentStatus.PENDING);
|
|
});
|