Adds a new date field to take submission values for.
It can help form serialisers render the right input for this kind of
field as the submissions themselves don't do any validation right now.
Disabled by default as to not cause any conflicts with existing projects
potentially inserting their own date blocks.
Can be enabled like this
```ts
formBuilderPlugin({
fields: {
date: true
}
})
```
191 lines
5.6 KiB
TypeScript
191 lines
5.6 KiB
TypeScript
import type { Page } from '@playwright/test'
|
|
|
|
import { expect, test } from '@playwright/test'
|
|
import * as path from 'path'
|
|
import { fileURLToPath } from 'url'
|
|
|
|
import type { PayloadTestSDK } from '../helpers/sdk/index.js'
|
|
import type { Config } from './payload-types.js'
|
|
|
|
import { ensureCompilationIsDone, initPageConsoleErrorCatch } from '../helpers.js'
|
|
import { AdminUrlUtil } from '../helpers/adminUrlUtil.js'
|
|
import { initPayloadE2ENoConfig } from '../helpers/initPayloadE2ENoConfig.js'
|
|
import { POLL_TOPASS_TIMEOUT, TEST_TIMEOUT_LONG } from '../playwright.config.js'
|
|
|
|
const filename = fileURLToPath(import.meta.url)
|
|
const dirname = path.dirname(filename)
|
|
|
|
test.describe('Form Builder Plugin', () => {
|
|
let page: Page
|
|
let formsUrl: AdminUrlUtil
|
|
let submissionsUrl: AdminUrlUtil
|
|
let payload: PayloadTestSDK<Config>
|
|
|
|
test.beforeAll(async ({ browser }, testInfo) => {
|
|
testInfo.setTimeout(TEST_TIMEOUT_LONG)
|
|
const { payload: payloadFromInit, serverURL } = await initPayloadE2ENoConfig<Config>({
|
|
dirname,
|
|
})
|
|
formsUrl = new AdminUrlUtil(serverURL, 'forms')
|
|
submissionsUrl = new AdminUrlUtil(serverURL, 'form-submissions')
|
|
|
|
payload = payloadFromInit
|
|
|
|
const context = await browser.newContext()
|
|
page = await context.newPage()
|
|
initPageConsoleErrorCatch(page)
|
|
|
|
await ensureCompilationIsDone({ page, serverURL })
|
|
})
|
|
|
|
test.describe('Forms collection', () => {
|
|
test('has contact form', async () => {
|
|
await page.goto(formsUrl.list)
|
|
|
|
await expect(() => expect(page.url()).toContain('forms')).toPass({
|
|
timeout: POLL_TOPASS_TIMEOUT,
|
|
})
|
|
|
|
const titleCell = page.locator('.row-2 .cell-title a')
|
|
await expect(titleCell).toHaveText('Contact Form')
|
|
const href = await titleCell.getAttribute('href')
|
|
|
|
await titleCell.click()
|
|
await expect(() => expect(page.url()).toContain(href)).toPass({
|
|
timeout: POLL_TOPASS_TIMEOUT,
|
|
})
|
|
|
|
const nameField = page.locator('#field-fields__0__name')
|
|
await expect(nameField).toHaveValue('name')
|
|
|
|
const addFieldsButton = page.locator('.blocks-field__drawer-toggler')
|
|
|
|
await addFieldsButton.click()
|
|
|
|
await expect(() => expect(page.locator('.drawer__header__title')).toBeVisible()).toPass({
|
|
timeout: POLL_TOPASS_TIMEOUT,
|
|
})
|
|
|
|
await page
|
|
.locator('button.thumbnail-card', {
|
|
hasText: 'Text Area',
|
|
})
|
|
.click()
|
|
|
|
await expect(() =>
|
|
expect(
|
|
page.locator('.pill__label', {
|
|
hasText: 'Text Area',
|
|
}),
|
|
).toBeVisible(),
|
|
).toPass({
|
|
timeout: POLL_TOPASS_TIMEOUT,
|
|
})
|
|
})
|
|
})
|
|
|
|
test.describe('Form submissions collection', () => {
|
|
test('has form submissions', async () => {
|
|
await page.goto(submissionsUrl.list)
|
|
|
|
await expect(() => expect(page.url()).toContain('form-submissions')).toPass({
|
|
timeout: POLL_TOPASS_TIMEOUT,
|
|
})
|
|
|
|
const firstSubmissionCell = page.locator('.table .cell-id a').last()
|
|
const href = await firstSubmissionCell.getAttribute('href')
|
|
|
|
await firstSubmissionCell.click()
|
|
await expect(() => expect(page.url()).toContain(href)).toPass({
|
|
timeout: POLL_TOPASS_TIMEOUT,
|
|
})
|
|
|
|
await expect(page.locator('#field-submissionData__0__value')).toHaveValue('Test Submission')
|
|
await expect(page.locator('#field-submissionData__1__value')).toHaveValue(
|
|
'tester@example.com',
|
|
)
|
|
})
|
|
|
|
test('can create form submission', async () => {
|
|
const { docs } = await payload.find({
|
|
collection: 'forms',
|
|
where: {
|
|
title: {
|
|
contains: 'Contact',
|
|
},
|
|
},
|
|
})
|
|
|
|
const createdSubmission = await payload.create({
|
|
collection: 'form-submissions',
|
|
data: {
|
|
form: docs[0].id,
|
|
submissionData: [
|
|
{
|
|
field: 'name',
|
|
value: 'New tester',
|
|
},
|
|
{
|
|
field: 'email',
|
|
value: 'new@example.com',
|
|
},
|
|
],
|
|
},
|
|
})
|
|
|
|
await page.goto(submissionsUrl.edit(createdSubmission.id))
|
|
|
|
await expect(() => expect(page.url()).toContain(createdSubmission.id)).toPass({
|
|
timeout: POLL_TOPASS_TIMEOUT,
|
|
})
|
|
|
|
await expect(page.locator('#field-submissionData__0__value')).toHaveValue('New tester')
|
|
await expect(page.locator('#field-submissionData__1__value')).toHaveValue('new@example.com')
|
|
})
|
|
|
|
test('can create form submission - with date field', async () => {
|
|
const { docs } = await payload.find({
|
|
collection: 'forms',
|
|
where: {
|
|
title: {
|
|
contains: 'Booking',
|
|
},
|
|
},
|
|
})
|
|
|
|
const createdSubmission = await payload.create({
|
|
collection: 'form-submissions',
|
|
data: {
|
|
form: docs[0].id,
|
|
submissionData: [
|
|
{
|
|
field: 'name',
|
|
value: 'New tester',
|
|
},
|
|
{
|
|
field: 'email',
|
|
value: 'new@example.com',
|
|
},
|
|
{
|
|
field: 'date',
|
|
value: '2025-10-01T00:00:00.000Z',
|
|
},
|
|
],
|
|
},
|
|
})
|
|
|
|
await page.goto(submissionsUrl.edit(createdSubmission.id))
|
|
|
|
await expect(() => expect(page.url()).toContain(createdSubmission.id)).toPass({
|
|
timeout: POLL_TOPASS_TIMEOUT,
|
|
})
|
|
|
|
await expect(page.locator('#field-submissionData__0__value')).toHaveValue('New tester')
|
|
await expect(page.locator('#field-submissionData__1__value')).toHaveValue('new@example.com')
|
|
await expect(page.locator('#field-submissionData__2__value')).toHaveValue(
|
|
'2025-10-01T00:00:00.000Z',
|
|
)
|
|
})
|
|
})
|
|
})
|