Some checks failed
ci / changes (push) Has been cancelled
ci / lint (push) Has been cancelled
ci / build (push) Has been cancelled
ci / tests-unit (push) Has been cancelled
ci / tests-types (push) Has been cancelled
ci / int-cosmosdb (push) Has been cancelled
ci / int-documentdb (push) Has been cancelled
ci / int-firestore (push) Has been cancelled
ci / int-mongodb (push) Has been cancelled
ci / int-postgres (push) Has been cancelled
ci / int-postgres-custom-schema (push) Has been cancelled
ci / int-postgres-uuid (push) Has been cancelled
ci / int-sqlite (push) Has been cancelled
ci / int-sqlite-uuid (push) Has been cancelled
ci / int-supabase (push) Has been cancelled
ci / e2e-_community (push) Has been cancelled
ci / e2e-access-control (push) Has been cancelled
ci / e2e-admin-bar (push) Has been cancelled
ci / e2e-admin-root (push) Has been cancelled
ci / e2e-admin__e2e__document-view (push) Has been cancelled
ci / e2e-admin__e2e__general (push) Has been cancelled
ci / e2e-admin__e2e__list-view (push) Has been cancelled
ci / e2e-auth (push) Has been cancelled
ci / e2e-auth-basic (push) Has been cancelled
ci / e2e-bulk-edit (push) Has been cancelled
ci / e2e-field-error-states (push) Has been cancelled
ci / e2e-fields-relationship (push) Has been cancelled
ci / e2e-fields__collections__Array (push) Has been cancelled
ci / e2e-fields__collections__Blocks#config.blockreferences.ts (push) Has been cancelled
ci / e2e-fields__collections__Blocks (push) Has been cancelled
ci / e2e-fields__collections__Checkbox (push) Has been cancelled
ci / e2e-fields__collections__Collapsible (push) Has been cancelled
ci / e2e-fields__collections__ConditionalLogic (push) Has been cancelled
ci / e2e-fields__collections__CustomID (push) Has been cancelled
ci / e2e-fields__collections__Date (push) Has been cancelled
ci / e2e-fields__collections__Email (push) Has been cancelled
ci / e2e-fields__collections__Indexed (push) Has been cancelled
ci / e2e-fields__collections__JSON (push) Has been cancelled
ci / e2e-fields__collections__Number (push) Has been cancelled
ci / e2e-fields__collections__Point (push) Has been cancelled
ci / e2e-fields__collections__Radio (push) Has been cancelled
ci / e2e-fields__collections__Relationship (push) Has been cancelled
ci / e2e-fields__collections__Row (push) Has been cancelled
ci / e2e-fields__collections__Select (push) Has been cancelled
ci / e2e-fields__collections__Tabs (push) Has been cancelled
ci / e2e-fields__collections__Tabs2 (push) Has been cancelled
ci / e2e-fields__collections__Text (push) Has been cancelled
ci / e2e-fields__collections__UI (push) Has been cancelled
ci / e2e-fields__collections__Upload (push) Has been cancelled
ci / e2e-folders (push) Has been cancelled
ci / e2e-form-state (push) Has been cancelled
ci / e2e-group-by (push) Has been cancelled
ci / e2e-hooks (push) Has been cancelled
ci / e2e-i18n (push) Has been cancelled
ci / e2e-joins (push) Has been cancelled
ci / e2e-lexical__collections__LexicalHeadingFeature (push) Has been cancelled
ci / e2e-lexical__collections__LexicalJSXConverter (push) Has been cancelled
ci / e2e-lexical__collections__LexicalLinkFeature (push) Has been cancelled
ci / e2e-lexical__collections__Lexical__e2e__blocks#config.blockreferences.ts (push) Has been cancelled
ci / e2e-lexical__collections__Lexical__e2e__blocks (push) Has been cancelled
ci / e2e-lexical__collections__Lexical__e2e__main (push) Has been cancelled
ci / e2e-lexical__collections__OnDemandForm (push) Has been cancelled
ci / e2e-lexical__collections__RichText (push) Has been cancelled
ci / e2e-lexical__collections___LexicalFullyFeatured (push) Has been cancelled
ci / e2e-lexical__collections___LexicalFullyFeatured__db (push) Has been cancelled
ci / e2e-live-preview (push) Has been cancelled
ci / e2e-localization (push) Has been cancelled
ci / e2e-locked-documents (push) Has been cancelled
ci / e2e-plugin-cloud-storage (push) Has been cancelled
ci / e2e-plugin-form-builder (push) Has been cancelled
ci / e2e-plugin-import-export (push) Has been cancelled
ci / e2e-plugin-multi-tenant (push) Has been cancelled
ci / e2e-plugin-nested-docs (push) Has been cancelled
ci / e2e-plugin-seo (push) Has been cancelled
ci / e2e-query-presets (push) Has been cancelled
ci / e2e-sort (push) Has been cancelled
ci / e2e-trash (push) Has been cancelled
ci / e2e-uploads (push) Has been cancelled
ci / e2e-versions (push) Has been cancelled
ci / e2e-turbo-_community (push) Has been cancelled
ci / e2e-turbo-access-control (push) Has been cancelled
ci / e2e-turbo-admin-bar (push) Has been cancelled
ci / e2e-turbo-admin-root (push) Has been cancelled
ci / e2e-turbo-admin__e2e__document-view (push) Has been cancelled
ci / e2e-turbo-admin__e2e__general (push) Has been cancelled
ci / e2e-turbo-admin__e2e__list-view (push) Has been cancelled
ci / e2e-turbo-auth (push) Has been cancelled
ci / e2e-turbo-auth-basic (push) Has been cancelled
ci / e2e-turbo-bulk-edit (push) Has been cancelled
ci / e2e-turbo-field-error-states (push) Has been cancelled
ci / e2e-turbo-fields-relationship (push) Has been cancelled
ci / e2e-turbo-fields__collections__Array (push) Has been cancelled
ci / e2e-turbo-fields__collections__Blocks#config.blockreferences.ts (push) Has been cancelled
ci / e2e-turbo-fields__collections__Blocks (push) Has been cancelled
ci / e2e-turbo-fields__collections__Checkbox (push) Has been cancelled
ci / e2e-turbo-fields__collections__Collapsible (push) Has been cancelled
ci / e2e-turbo-fields__collections__ConditionalLogic (push) Has been cancelled
ci / e2e-turbo-fields__collections__CustomID (push) Has been cancelled
ci / e2e-turbo-fields__collections__Date (push) Has been cancelled
ci / e2e-turbo-fields__collections__Email (push) Has been cancelled
ci / e2e-turbo-fields__collections__Indexed (push) Has been cancelled
ci / e2e-turbo-fields__collections__JSON (push) Has been cancelled
ci / e2e-turbo-fields__collections__Number (push) Has been cancelled
ci / e2e-turbo-fields__collections__Point (push) Has been cancelled
ci / e2e-turbo-fields__collections__Radio (push) Has been cancelled
ci / e2e-turbo-fields__collections__Relationship (push) Has been cancelled
ci / e2e-turbo-fields__collections__Row (push) Has been cancelled
ci / e2e-turbo-fields__collections__Select (push) Has been cancelled
ci / e2e-turbo-fields__collections__Tabs (push) Has been cancelled
ci / e2e-turbo-fields__collections__Tabs2 (push) Has been cancelled
ci / e2e-turbo-fields__collections__Text (push) Has been cancelled
ci / e2e-turbo-fields__collections__UI (push) Has been cancelled
ci / e2e-turbo-fields__collections__Upload (push) Has been cancelled
ci / e2e-turbo-folders (push) Has been cancelled
ci / e2e-turbo-form-state (push) Has been cancelled
ci / e2e-turbo-group-by (push) Has been cancelled
ci / e2e-turbo-hooks (push) Has been cancelled
ci / e2e-turbo-i18n (push) Has been cancelled
ci / e2e-turbo-joins (push) Has been cancelled
ci / e2e-turbo-lexical__collections__LexicalHeadingFeature (push) Has been cancelled
ci / e2e-turbo-lexical__collections__LexicalJSXConverter (push) Has been cancelled
ci / e2e-turbo-lexical__collections__LexicalLinkFeature (push) Has been cancelled
ci / e2e-turbo-lexical__collections__Lexical__e2e__blocks#config.blockreferences.ts (push) Has been cancelled
ci / e2e-turbo-lexical__collections__Lexical__e2e__blocks (push) Has been cancelled
ci / e2e-turbo-lexical__collections__Lexical__e2e__main (push) Has been cancelled
ci / e2e-turbo-lexical__collections__OnDemandForm (push) Has been cancelled
ci / e2e-turbo-lexical__collections__RichText (push) Has been cancelled
ci / e2e-turbo-lexical__collections___LexicalFullyFeatured (push) Has been cancelled
ci / e2e-turbo-lexical__collections___LexicalFullyFeatured__db (push) Has been cancelled
ci / e2e-turbo-live-preview (push) Has been cancelled
ci / e2e-turbo-localization (push) Has been cancelled
ci / e2e-turbo-locked-documents (push) Has been cancelled
ci / e2e-turbo-plugin-cloud-storage (push) Has been cancelled
ci / e2e-turbo-plugin-form-builder (push) Has been cancelled
ci / e2e-turbo-plugin-import-export (push) Has been cancelled
ci / e2e-turbo-plugin-multi-tenant (push) Has been cancelled
ci / e2e-turbo-plugin-nested-docs (push) Has been cancelled
ci / e2e-turbo-plugin-seo (push) Has been cancelled
ci / e2e-turbo-query-presets (push) Has been cancelled
ci / e2e-turbo-sort (push) Has been cancelled
ci / e2e-turbo-trash (push) Has been cancelled
ci / e2e-turbo-uploads (push) Has been cancelled
ci / e2e-turbo-versions (push) Has been cancelled
ci / build-template-blank-mongodb (push) Has been cancelled
ci / build-template-website-mongodb (push) Has been cancelled
ci / build-template-with-payload-cloud-mongodb (push) Has been cancelled
ci / build-template-with-vercel-mongodb-mongodb (push) Has been cancelled
ci / build-template-plugin- (push) Has been cancelled
ci / build-template-with-postgres-postgres (push) Has been cancelled
ci / build-template-with-vercel-postgres-postgres (push) Has been cancelled
ci / tests-type-generation (push) Has been cancelled
ci / All Green (push) Has been cancelled
ci / Publish Canary (push) Has been cancelled
ci / analyze (push) Has been cancelled
publish-prerelease / publish-prerelease-${{ github.ref_name }}-${{ github.sha }} (push) Has been cancelled
lock-issues / lock_issues (push) Has been cancelled
stale / stale (push) Has been cancelled
audit-dependencies / audit (push) Has been cancelled
activity-notifications / run (push) Has been cancelled
444 lines
13 KiB
TypeScript
444 lines
13 KiB
TypeScript
import type { Payload } from 'tbsh-cms'
|
|
|
|
import path from 'path'
|
|
import { ValidationError } from 'tbsh-cms'
|
|
import { fileURLToPath } from 'url'
|
|
|
|
import type { Form } from './payload-types.js'
|
|
|
|
import { serializeLexical } from '../../packages/plugin-form-builder/src/utilities/lexical/serializeLexical.js'
|
|
import { serializeSlate } from '../../packages/plugin-form-builder/src/utilities/slate/serializeSlate.js'
|
|
import { initPayloadInt } from '../helpers/initPayloadInt.js'
|
|
import { formsSlug, formSubmissionsSlug } from './shared.js'
|
|
|
|
let payload: Payload
|
|
let form: Form
|
|
|
|
const filename = fileURLToPath(import.meta.url)
|
|
const dirname = path.dirname(filename)
|
|
|
|
describe('@payloadcms/plugin-form-builder', () => {
|
|
beforeAll(async () => {
|
|
;({ payload } = await initPayloadInt(dirname))
|
|
|
|
const formConfig: Omit<Form, 'createdAt' | 'id' | 'updatedAt'> = {
|
|
confirmationType: 'message',
|
|
confirmationMessage: {
|
|
root: {
|
|
children: [
|
|
{
|
|
children: [
|
|
{
|
|
detail: 0,
|
|
format: 0,
|
|
mode: 'normal',
|
|
style: '',
|
|
text: 'Confirmed.',
|
|
type: 'text',
|
|
version: 1,
|
|
},
|
|
],
|
|
direction: 'ltr',
|
|
format: '',
|
|
indent: 0,
|
|
type: 'paragraph',
|
|
version: 1,
|
|
textFormat: 0,
|
|
textStyle: '',
|
|
},
|
|
],
|
|
direction: 'ltr',
|
|
format: '',
|
|
indent: 0,
|
|
type: 'root',
|
|
version: 1,
|
|
},
|
|
},
|
|
fields: [
|
|
{
|
|
name: 'name',
|
|
blockType: 'text',
|
|
},
|
|
],
|
|
title: 'Test Form',
|
|
}
|
|
|
|
form = (await payload.create({
|
|
collection: formsSlug,
|
|
data: formConfig,
|
|
})) as unknown as Form
|
|
})
|
|
|
|
afterAll(async () => {
|
|
await payload.destroy()
|
|
})
|
|
|
|
describe('plugin collections', () => {
|
|
it('adds forms collection', async () => {
|
|
const { docs: forms } = await payload.find({ collection: formsSlug })
|
|
expect(forms.length).toBeGreaterThan(0)
|
|
})
|
|
|
|
it('adds form submissions collection', async () => {
|
|
const { docs: formSubmissions } = await payload.find({ collection: formSubmissionsSlug })
|
|
expect(formSubmissions).toHaveLength(1)
|
|
})
|
|
})
|
|
|
|
describe('form building', () => {
|
|
it('can create a simple form', async () => {
|
|
const formConfig: Omit<Form, 'createdAt' | 'id' | 'updatedAt'> = {
|
|
confirmationType: 'message',
|
|
confirmationMessage: {
|
|
root: {
|
|
children: [
|
|
{
|
|
children: [
|
|
{
|
|
detail: 0,
|
|
format: 0,
|
|
mode: 'normal',
|
|
style: '',
|
|
text: 'Confirmed.',
|
|
type: 'text',
|
|
version: 1,
|
|
},
|
|
],
|
|
direction: 'ltr',
|
|
format: '',
|
|
indent: 0,
|
|
type: 'paragraph',
|
|
version: 1,
|
|
textFormat: 0,
|
|
textStyle: '',
|
|
},
|
|
],
|
|
direction: 'ltr',
|
|
format: '',
|
|
indent: 0,
|
|
type: 'root',
|
|
version: 1,
|
|
},
|
|
},
|
|
fields: [
|
|
{
|
|
name: 'name',
|
|
blockType: 'text',
|
|
},
|
|
],
|
|
title: 'Test Form',
|
|
}
|
|
|
|
const testForm = await payload.create({
|
|
collection: formsSlug,
|
|
data: formConfig,
|
|
})
|
|
|
|
expect(testForm).toHaveProperty('fields')
|
|
expect(testForm.fields).toHaveLength(1)
|
|
expect(testForm.fields[0]).toHaveProperty('name', 'name')
|
|
})
|
|
|
|
it('can use form overrides', async () => {
|
|
const formConfig: Omit<Form, 'createdAt' | 'id' | 'updatedAt'> = {
|
|
confirmationType: 'message',
|
|
confirmationMessage: {
|
|
root: {
|
|
children: [
|
|
{
|
|
children: [
|
|
{
|
|
detail: 0,
|
|
format: 0,
|
|
mode: 'normal',
|
|
style: '',
|
|
text: 'Confirmed.',
|
|
type: 'text',
|
|
version: 1,
|
|
},
|
|
],
|
|
direction: 'ltr',
|
|
format: '',
|
|
indent: 0,
|
|
type: 'paragraph',
|
|
version: 1,
|
|
textFormat: 0,
|
|
textStyle: '',
|
|
},
|
|
],
|
|
direction: 'ltr',
|
|
format: '',
|
|
indent: 0,
|
|
type: 'root',
|
|
version: 1,
|
|
},
|
|
},
|
|
custom: 'custom',
|
|
title: 'Test Form',
|
|
}
|
|
|
|
const testForm = await payload.create({
|
|
collection: formsSlug,
|
|
data: formConfig,
|
|
})
|
|
|
|
expect(testForm).toHaveProperty('custom', 'custom')
|
|
})
|
|
})
|
|
|
|
describe('form submissions and validations', () => {
|
|
it('can create a form submission', async () => {
|
|
const formSubmission = await payload.create({
|
|
collection: formSubmissionsSlug,
|
|
data: {
|
|
form: form.id,
|
|
submissionData: [
|
|
{
|
|
field: 'name',
|
|
value: 'Test Submission',
|
|
},
|
|
],
|
|
},
|
|
depth: 0,
|
|
})
|
|
|
|
expect(formSubmission).toHaveProperty('form', form.id)
|
|
expect(formSubmission).toHaveProperty('submissionData')
|
|
expect(formSubmission.submissionData).toHaveLength(1)
|
|
expect(formSubmission.submissionData[0]).toHaveProperty('field', 'name')
|
|
expect(formSubmission.submissionData[0]).toHaveProperty('value', 'Test Submission')
|
|
})
|
|
|
|
it('does not create a form submission for a non-existing form', async () => {
|
|
const req = async () =>
|
|
payload.create({
|
|
collection: formSubmissionsSlug,
|
|
data: {
|
|
form: '659c7c2f98ffb5d83df9dadb',
|
|
submissionData: [
|
|
{
|
|
field: 'name',
|
|
value: 'Test Submission',
|
|
},
|
|
],
|
|
},
|
|
depth: 0,
|
|
})
|
|
|
|
await expect(req).rejects.toThrow(ValidationError)
|
|
})
|
|
|
|
describe('replaces curly braces', () => {
|
|
describe('slate serializer', () => {
|
|
it('specific field names', () => {
|
|
const mockName = 'Test Submission'
|
|
const mockEmail = 'dev@payloadcms.com'
|
|
|
|
const serializedEmail = serializeSlate(
|
|
[
|
|
{ text: 'Welcome {{name}}. Here is a dynamic ' },
|
|
{
|
|
type: 'link',
|
|
children: [
|
|
{
|
|
text: 'link',
|
|
},
|
|
],
|
|
url: 'www.test.com?email={{email}}',
|
|
},
|
|
],
|
|
[
|
|
{ field: 'name', value: mockName },
|
|
{ field: 'email', value: mockEmail },
|
|
],
|
|
)
|
|
|
|
expect(serializedEmail).toContain(mockName)
|
|
expect(serializedEmail).toContain(mockEmail)
|
|
})
|
|
|
|
it('wildcard "{{*}}"', () => {
|
|
const mockName = 'Test Submission'
|
|
const mockEmail = 'dev@payloadcms.com'
|
|
|
|
const serializedEmail = serializeSlate(
|
|
[{ text: '{{*}}' }],
|
|
[
|
|
{ field: 'name', value: mockName },
|
|
{ field: 'email', value: mockEmail },
|
|
],
|
|
)
|
|
|
|
expect(serializedEmail).toContain(`name : ${mockName}`)
|
|
expect(serializedEmail).toContain(`email : ${mockEmail}`)
|
|
})
|
|
|
|
it('wildcard with table formatting "{{*:table}}"', () => {
|
|
const mockName = 'Test Submission'
|
|
const mockEmail = 'dev@payloadcms.com'
|
|
|
|
const serializedEmail = serializeSlate(
|
|
[{ text: '{{*:table}}' }],
|
|
[
|
|
{ field: 'name', value: mockName },
|
|
{ field: 'email', value: mockEmail },
|
|
],
|
|
)
|
|
|
|
expect(serializedEmail).toContain(`<table>`)
|
|
expect(serializedEmail).toContain(`<tr><td>name</td><td>${mockName}</td></tr>`)
|
|
expect(serializedEmail).toContain(`<tr><td>email</td><td>${mockEmail}</td></tr>`)
|
|
})
|
|
})
|
|
|
|
describe('lexical serializer', () => {
|
|
it('specific field names', async () => {
|
|
const mockName = 'Test Submission'
|
|
const mockEmail = 'dev@payloadcms.com'
|
|
|
|
const serializedEmail = await serializeLexical(
|
|
{
|
|
root: {
|
|
type: 'root',
|
|
children: [
|
|
{
|
|
type: 'paragraph',
|
|
children: [
|
|
{
|
|
type: 'text',
|
|
detail: 0,
|
|
format: 0,
|
|
mode: 'normal',
|
|
style: '',
|
|
text: 'Name: {{name}}',
|
|
version: 1,
|
|
},
|
|
{
|
|
type: 'linebreak',
|
|
version: 1,
|
|
},
|
|
{
|
|
type: 'text',
|
|
detail: 0,
|
|
format: 0,
|
|
mode: 'normal',
|
|
style: '',
|
|
text: 'Email: {{email}}',
|
|
version: 1,
|
|
},
|
|
],
|
|
direction: 'ltr',
|
|
format: '',
|
|
indent: 0,
|
|
version: 1,
|
|
},
|
|
],
|
|
direction: 'ltr',
|
|
format: '',
|
|
indent: 0,
|
|
version: 1,
|
|
},
|
|
},
|
|
[
|
|
{ field: 'name', value: mockName },
|
|
{ field: 'email', value: mockEmail },
|
|
],
|
|
)
|
|
|
|
expect(serializedEmail).toContain(`Name: ${mockName}`)
|
|
expect(serializedEmail).toContain(`Email: ${mockEmail}`)
|
|
})
|
|
|
|
it('wildcard "{{*}}"', async () => {
|
|
const mockName = 'Test Submission'
|
|
const mockEmail = 'dev@payloadcms.com'
|
|
|
|
const serializedEmail = await serializeLexical(
|
|
{
|
|
root: {
|
|
type: 'root',
|
|
children: [
|
|
{
|
|
type: 'paragraph',
|
|
children: [
|
|
{
|
|
type: 'text',
|
|
detail: 0,
|
|
format: 0,
|
|
mode: 'normal',
|
|
style: '',
|
|
text: '{{*}}',
|
|
version: 1,
|
|
},
|
|
],
|
|
direction: 'ltr',
|
|
format: '',
|
|
indent: 0,
|
|
version: 1,
|
|
},
|
|
],
|
|
direction: 'ltr',
|
|
format: '',
|
|
indent: 0,
|
|
version: 1,
|
|
},
|
|
},
|
|
[
|
|
{ field: 'name', value: mockName },
|
|
{ field: 'email', value: mockEmail },
|
|
],
|
|
)
|
|
|
|
expect(serializedEmail).toContain(`name : ${mockName}`)
|
|
expect(serializedEmail).toContain(`email : ${mockEmail}`)
|
|
})
|
|
|
|
it('wildcard with table formatting "{{*:table}}"', async () => {
|
|
const mockName = 'Test Submission'
|
|
const mockEmail = 'dev@payloadcms.com'
|
|
|
|
const serializedEmail = await serializeLexical(
|
|
{
|
|
root: {
|
|
type: 'root',
|
|
children: [
|
|
{
|
|
type: 'paragraph',
|
|
children: [
|
|
{
|
|
type: 'text',
|
|
detail: 0,
|
|
format: 0,
|
|
mode: 'normal',
|
|
style: '',
|
|
text: '{{*:table}}',
|
|
version: 1,
|
|
},
|
|
],
|
|
direction: 'ltr',
|
|
format: '',
|
|
indent: 0,
|
|
version: 1,
|
|
},
|
|
],
|
|
direction: 'ltr',
|
|
format: '',
|
|
indent: 0,
|
|
version: 1,
|
|
},
|
|
},
|
|
[
|
|
{ field: 'name', value: mockName },
|
|
{ field: 'email', value: mockEmail },
|
|
],
|
|
)
|
|
|
|
expect(serializedEmail).toContain(`<table>`)
|
|
expect(serializedEmail).toContain(`<tr><td>name</td><td>${mockName}</td></tr>`)
|
|
expect(serializedEmail).toContain(`<tr><td>email</td><td>${mockEmail}</td></tr>`)
|
|
})
|
|
})
|
|
})
|
|
})
|
|
})
|