chore: work to add consistency to fields e2e

This commit is contained in:
James
2024-04-04 14:41:58 -04:00
parent faef0784ee
commit 5d57572694
9 changed files with 488 additions and 469 deletions

View File

@@ -26,7 +26,7 @@ import Uploads from './collections/Upload/index.js'
import Uploads2 from './collections/Upload2/index.js'
import Uploads3 from './collections/Uploads3/index.js'
import TabsWithRichText from './globals/TabsWithRichText.js'
import { clearAndSeedEverything } from './seed.js'
import { seed } from './seed.js'
export const collectionSlugs: CollectionConfig[] = [
LexicalFields,
@@ -79,7 +79,7 @@ export default buildConfigWithDefaults({
},
onInit: async (payload) => {
if (process.env.SEED_IN_CONFIG_ONINIT !== 'false') {
await clearAndSeedEverything(payload)
await seed(payload)
}
},
})

View File

@@ -1,12 +1,12 @@
import type { Page } from '@playwright/test'
import type { Payload } from 'payload'
import { expect, test } from '@playwright/test'
import path from 'path'
import { wait } from 'payload/utilities'
import { fileURLToPath } from 'url'
import type { RelationshipField, TextField } from './payload-types.js'
import type { PayloadTestSDK } from '../helpers/sdk/index.js'
import type { Config, RelationshipField, TextField } from './payload-types.js'
import {
exactText,
@@ -15,13 +15,13 @@ import {
saveDocHotkeyAndAssert,
} from '../helpers.js'
import { AdminUrlUtil } from '../helpers/adminUrlUtil.js'
import { initPayloadE2E } from '../helpers/initPayloadE2E.js'
import { initPayloadE2ENoConfig } from '../helpers/initPayloadE2ENoConfig.js'
import { reInitializeDB } from '../helpers/reInit.js'
import { RESTClient } from '../helpers/rest.js'
import { POLL_TOPASS_TIMEOUT } from '../playwright.config.js'
import { jsonDoc } from './collections/JSON/shared.js'
import { numberDoc } from './collections/Number/shared.js'
import { textDoc } from './collections/Text/shared.js'
import { clearAndSeedEverything } from './seed.js'
import {
collapsibleFieldsSlug,
pointFieldsSlug,
@@ -34,7 +34,7 @@ const dirname = path.dirname(filename)
const { beforeAll, beforeEach, describe } = test
let payload: Payload
let payload: PayloadTestSDK<Config>
let client: RESTClient
let page: Page
let serverURL: string
@@ -43,14 +43,19 @@ let serverURL: string
describe('fields', () => {
beforeAll(async ({ browser }) => {
process.env.SEED_IN_CONFIG_ONINIT = 'false' // Makes it so the payload config onInit seed is not run. Otherwise, the seed would be run unnecessarily twice for the initial test run - once for beforeEach and once for onInit
;({ payload, serverURL } = await initPayloadE2E({ dirname }))
;({ payload, serverURL } = await initPayloadE2ENoConfig({ dirname }))
const context = await browser.newContext()
page = await context.newPage()
initPageConsoleErrorCatch(page)
})
beforeEach(async () => {
await clearAndSeedEverything(payload)
await reInitializeDB({
serverURL,
snapshotKey: 'fieldsTest',
uploadsDir: path.resolve(dirname, './collections/Upload/uploads'),
})
if (client) {
await client.logout()
}
@@ -262,7 +267,7 @@ describe('fields', () => {
})
await page.goto(url.create)
await page.waitForURL(`**/${url.create}`)
await page.waitForURL(url.create)
await page.locator('#field-text').fill('test')
await page.locator('#field-uniqueText').fill(uniqueText)
@@ -952,6 +957,8 @@ describe('fields', () => {
await page.goto(url.create)
await wait(300)
await page.locator('.tabs-field__tab-button:has-text("Tab with Row")').click()
await page.locator('#field-textInRow').fill(textInRowValue)
await page.locator('#field-numberInRow').fill(numberInRowValue)
@@ -1020,6 +1027,7 @@ describe('fields', () => {
async function navigateToRichTextFields() {
const url: AdminUrlUtil = new AdminUrlUtil(serverURL, 'rich-text-fields')
await page.goto(url.list)
await page.waitForURL(url.list)
await page.locator('.row-1 .cell-title a').click()
}
@@ -1057,6 +1065,7 @@ describe('fields', () => {
await editLinkModal.locator('#field-url').fill('')
await wait(200)
await editLinkModal.locator('button[type="submit"]').click()
await wait(400)
const errorField = page.locator(
'[id^=drawer_1_rich-text-link-] .render-fields > :nth-child(3)',
)
@@ -1075,11 +1084,12 @@ describe('fields', () => {
await expect(editLinkModal).toBeVisible()
// Fill values and click Confirm
await editLinkModal.locator('#field-text').fill('link text')
await editLinkModal.locator('.drawer__content #field-text').fill('link text')
await editLinkModal.locator('label[for="field-linkType-custom"]').click()
await editLinkModal.locator('#field-url').fill('https://payloadcms.com')
await wait(200)
await wait(2000)
await editLinkModal.locator('button[type="submit"]').click()
await wait(400)
await saveDocAndAssert(page)
// Remove link from editor body

View File

@@ -1,11 +1,8 @@
import path from 'path'
import { type Payload } from 'payload'
import { getFileByPath } from 'payload/uploads'
import { fileURLToPath } from 'url'
import { devUser } from '../credentials.js'
import { executePromises } from '../helpers/executePromises.js'
import { seedDB } from '../helpers/seed.js'
import { anotherArrayDoc, arrayDoc } from './collections/Array/shared.js'
import { blocksDoc } from './collections/Blocks/shared.js'
import { codeDoc } from './collections/Code/shared.js'
@@ -29,7 +26,6 @@ import {
blockFieldsSlug,
codeFieldsSlug,
collapsibleFieldsSlug,
collectionSlugs,
conditionalLogicSlug,
dateFieldsSlug,
groupFieldsSlug,
@@ -49,274 +45,256 @@ import {
const filename = fileURLToPath(import.meta.url)
const dirname = path.dirname(filename)
export async function clearAndSeedEverything(_payload: Payload, parallel: boolean = false) {
return await seedDB({
_payload,
collectionSlugs,
seedFunction: async (_payload) => {
const jpgPath = path.resolve(dirname, './collections/Upload/payload.jpg')
const pngPath = path.resolve(dirname, './uploads/payload.png')
export const seed = async (_payload) => {
if (_payload.db.name === 'mongoose') {
await Promise.all(
_payload.config.collections.map(async (coll) => {
await new Promise((resolve, reject) => {
_payload.db?.collections[coll.slug]?.ensureIndexes(function (err) {
if (err) reject(err)
resolve(true)
})
})
}),
)
}
// Get both files in parallel
const [jpgFile, pngFile] = await Promise.all([getFileByPath(jpgPath), getFileByPath(pngPath)])
const jpgPath = path.resolve(dirname, './collections/Upload/payload.jpg')
const pngPath = path.resolve(dirname, './uploads/payload.png')
const [
createdArrayDoc,
createdAnotherArrayDoc,
createdTextDoc,
createdAnotherTextDoc,
createdPNGDoc,
] = await executePromises(
[
() =>
_payload.create({
collection: arrayFieldsSlug,
data: arrayDoc,
depth: 0,
overrideAccess: true,
}),
() =>
_payload.create({
collection: arrayFieldsSlug,
data: anotherArrayDoc,
depth: 0,
overrideAccess: true,
}),
() =>
_payload.create({
collection: textFieldsSlug,
data: textDoc,
depth: 0,
overrideAccess: true,
}),
() =>
_payload.create({
collection: textFieldsSlug,
data: anotherTextDoc,
depth: 0,
overrideAccess: true,
}),
() =>
_payload.create({
collection: uploadsSlug,
data: {},
file: pngFile,
depth: 0,
overrideAccess: true,
}),
],
parallel,
)
// Get both files in parallel
const [jpgFile, pngFile] = await Promise.all([getFileByPath(jpgPath), getFileByPath(pngPath)])
const createdJPGDoc = await _payload.create({
collection: uploadsSlug,
data: {
...uploadsDoc,
media: createdPNGDoc.id,
},
file: jpgFile,
depth: 0,
overrideAccess: true,
})
const createdArrayDoc = await _payload.create({
collection: arrayFieldsSlug,
data: arrayDoc,
depth: 0,
overrideAccess: true,
})
const formattedID =
_payload.db.defaultIDType === 'number' ? createdArrayDoc.id : `"${createdArrayDoc.id}"`
const createdAnotherArrayDoc = await _payload.create({
collection: arrayFieldsSlug,
data: anotherArrayDoc,
depth: 0,
overrideAccess: true,
})
const formattedJPGID =
_payload.db.defaultIDType === 'number' ? createdJPGDoc.id : `"${createdJPGDoc.id}"`
const createdTextDoc = await _payload.create({
collection: textFieldsSlug,
data: textDoc,
depth: 0,
overrideAccess: true,
})
const formattedTextID =
_payload.db.defaultIDType === 'number' ? createdTextDoc.id : `"${createdTextDoc.id}"`
const createdAnotherTextDoc = await _payload.create({
collection: textFieldsSlug,
data: anotherTextDoc,
depth: 0,
overrideAccess: true,
})
const richTextDocWithRelId = JSON.parse(
JSON.stringify(richTextDocData)
.replace(/"\{\{ARRAY_DOC_ID\}\}"/g, `${formattedID}`)
.replace(/"\{\{UPLOAD_DOC_ID\}\}"/g, `${formattedJPGID}`)
.replace(/"\{\{TEXT_DOC_ID\}\}"/g, `${formattedTextID}`),
)
const richTextBulletsDocWithRelId = JSON.parse(
JSON.stringify(richTextBulletsDocData)
.replace(/"\{\{ARRAY_DOC_ID\}\}"/g, `${formattedID}`)
.replace(/"\{\{UPLOAD_DOC_ID\}\}"/g, `${formattedJPGID}`)
.replace(/"\{\{TEXT_DOC_ID\}\}"/g, `${formattedTextID}`),
)
const createdPNGDoc = await _payload.create({
collection: uploadsSlug,
data: {},
file: pngFile,
depth: 0,
overrideAccess: true,
})
const richTextDocWithRelationship = { ...richTextDocWithRelId }
const blocksDocWithRichText = {
...(blocksDoc as any),
}
blocksDocWithRichText.blocks[0].richText = richTextDocWithRelationship.richText
blocksDocWithRichText.localizedBlocks[0].richText = richTextDocWithRelationship.richText
await _payload.create({
collection: richTextFieldsSlug,
data: richTextBulletsDocWithRelId,
depth: 0,
overrideAccess: true,
})
const createdRichTextDoc = await _payload.create({
collection: richTextFieldsSlug,
data: richTextDocWithRelationship,
depth: 0,
overrideAccess: true,
})
const formattedRichTextDocID =
_payload.db.defaultIDType === 'number'
? createdRichTextDoc.id
: `"${createdRichTextDoc.id}"`
const lexicalDocWithRelId = JSON.parse(
JSON.stringify(lexicalDocData)
.replace(/"\{\{ARRAY_DOC_ID\}\}"/g, `${formattedID}`)
.replace(/"\{\{UPLOAD_DOC_ID\}\}"/g, `${formattedJPGID}`)
.replace(/"\{\{TEXT_DOC_ID\}\}"/g, `${formattedTextID}`)
.replace(/"\{\{RICH_TEXT_DOC_ID\}\}"/g, `${formattedRichTextDocID}`),
)
const lexicalMigrateDocWithRelId = JSON.parse(
JSON.stringify(lexicalMigrateDocData)
.replace(/"\{\{ARRAY_DOC_ID\}\}"/g, `${formattedID}`)
.replace(/"\{\{UPLOAD_DOC_ID\}\}"/g, `${formattedJPGID}`)
.replace(/"\{\{TEXT_DOC_ID\}\}"/g, `${formattedTextID}`)
.replace(/"\{\{RICH_TEXT_DOC_ID\}\}"/g, `${formattedRichTextDocID}`),
)
await executePromises(
[
() =>
_payload.create({
collection: usersSlug,
depth: 0,
data: {
email: devUser.email,
password: devUser.password,
},
overrideAccess: true,
}),
() =>
_payload.create({
collection: collapsibleFieldsSlug,
data: collapsibleDoc,
depth: 0,
overrideAccess: true,
}),
() =>
_payload.create({
collection: conditionalLogicSlug,
data: conditionalLogicDoc,
depth: 0,
overrideAccess: true,
}),
() =>
_payload.create({
collection: groupFieldsSlug,
data: groupDoc,
depth: 0,
overrideAccess: true,
}),
() =>
_payload.create({
collection: selectFieldsSlug,
data: selectsDoc,
depth: 0,
overrideAccess: true,
}),
() =>
_payload.create({
collection: radioFieldsSlug,
data: radiosDoc,
depth: 0,
overrideAccess: true,
}),
() =>
_payload.create({
collection: tabsFieldsSlug,
data: tabsDoc,
depth: 0,
overrideAccess: true,
}),
() =>
_payload.create({
collection: pointFieldsSlug,
data: pointDoc,
depth: 0,
overrideAccess: true,
}),
() =>
_payload.create({
collection: dateFieldsSlug,
data: dateDoc,
depth: 0,
overrideAccess: true,
}),
() =>
_payload.create({
collection: codeFieldsSlug,
data: codeDoc,
depth: 0,
overrideAccess: true,
}),
() =>
_payload.create({
collection: jsonFieldsSlug,
data: jsonDoc,
depth: 0,
overrideAccess: true,
}),
() =>
_payload.create({
collection: blockFieldsSlug,
data: blocksDocWithRichText,
depth: 0,
overrideAccess: true,
}),
() =>
_payload.create({
collection: lexicalFieldsSlug,
data: lexicalDocWithRelId,
depth: 0,
overrideAccess: true,
}),
() =>
_payload.create({
collection: lexicalMigrateFieldsSlug,
data: lexicalMigrateDocWithRelId,
depth: 0,
overrideAccess: true,
}),
() =>
_payload.create({
collection: numberFieldsSlug,
data: { number: 2 },
depth: 0,
overrideAccess: true,
}),
() =>
_payload.create({
collection: numberFieldsSlug,
data: { number: 3 },
depth: 0,
overrideAccess: true,
}),
() =>
_payload.create({
collection: numberFieldsSlug,
data: numberDoc,
depth: 0,
overrideAccess: true,
}),
],
parallel,
)
const createdJPGDoc = await _payload.create({
collection: uploadsSlug,
data: {
...uploadsDoc,
media: createdPNGDoc.id,
},
snapshotKey: 'fieldsTest',
uploadsDir: path.resolve(dirname, './collections/Upload/uploads'),
file: jpgFile,
depth: 0,
overrideAccess: true,
})
const formattedID =
_payload.db.defaultIDType === 'number' ? createdArrayDoc.id : `"${createdArrayDoc.id}"`
const formattedJPGID =
_payload.db.defaultIDType === 'number' ? createdJPGDoc.id : `"${createdJPGDoc.id}"`
const formattedTextID =
_payload.db.defaultIDType === 'number' ? createdTextDoc.id : `"${createdTextDoc.id}"`
const richTextDocWithRelId = JSON.parse(
JSON.stringify(richTextDocData)
.replace(/"\{\{ARRAY_DOC_ID\}\}"/g, `${formattedID}`)
.replace(/"\{\{UPLOAD_DOC_ID\}\}"/g, `${formattedJPGID}`)
.replace(/"\{\{TEXT_DOC_ID\}\}"/g, `${formattedTextID}`),
)
const richTextBulletsDocWithRelId = JSON.parse(
JSON.stringify(richTextBulletsDocData)
.replace(/"\{\{ARRAY_DOC_ID\}\}"/g, `${formattedID}`)
.replace(/"\{\{UPLOAD_DOC_ID\}\}"/g, `${formattedJPGID}`)
.replace(/"\{\{TEXT_DOC_ID\}\}"/g, `${formattedTextID}`),
)
const richTextDocWithRelationship = { ...richTextDocWithRelId }
const blocksDocWithRichText = {
...(blocksDoc as any),
}
blocksDocWithRichText.blocks[0].richText = richTextDocWithRelationship.richText
blocksDocWithRichText.localizedBlocks[0].richText = richTextDocWithRelationship.richText
await _payload.create({
collection: richTextFieldsSlug,
data: richTextBulletsDocWithRelId,
depth: 0,
overrideAccess: true,
})
const createdRichTextDoc = await _payload.create({
collection: richTextFieldsSlug,
data: richTextDocWithRelationship,
depth: 0,
overrideAccess: true,
})
const formattedRichTextDocID =
_payload.db.defaultIDType === 'number' ? createdRichTextDoc.id : `"${createdRichTextDoc.id}"`
const lexicalDocWithRelId = JSON.parse(
JSON.stringify(lexicalDocData)
.replace(/"\{\{ARRAY_DOC_ID\}\}"/g, `${formattedID}`)
.replace(/"\{\{UPLOAD_DOC_ID\}\}"/g, `${formattedJPGID}`)
.replace(/"\{\{TEXT_DOC_ID\}\}"/g, `${formattedTextID}`)
.replace(/"\{\{RICH_TEXT_DOC_ID\}\}"/g, `${formattedRichTextDocID}`),
)
const lexicalMigrateDocWithRelId = JSON.parse(
JSON.stringify(lexicalMigrateDocData)
.replace(/"\{\{ARRAY_DOC_ID\}\}"/g, `${formattedID}`)
.replace(/"\{\{UPLOAD_DOC_ID\}\}"/g, `${formattedJPGID}`)
.replace(/"\{\{TEXT_DOC_ID\}\}"/g, `${formattedTextID}`)
.replace(/"\{\{RICH_TEXT_DOC_ID\}\}"/g, `${formattedRichTextDocID}`),
)
await _payload.create({
collection: usersSlug,
depth: 0,
data: {
email: devUser.email,
password: devUser.password,
},
overrideAccess: true,
})
await _payload.create({
collection: collapsibleFieldsSlug,
data: collapsibleDoc,
depth: 0,
overrideAccess: true,
})
await _payload.create({
collection: conditionalLogicSlug,
data: conditionalLogicDoc,
depth: 0,
overrideAccess: true,
})
await _payload.create({
collection: groupFieldsSlug,
data: groupDoc,
depth: 0,
overrideAccess: true,
})
await _payload.create({
collection: selectFieldsSlug,
data: selectsDoc,
depth: 0,
overrideAccess: true,
})
await _payload.create({
collection: radioFieldsSlug,
data: radiosDoc,
depth: 0,
overrideAccess: true,
})
await _payload.create({
collection: tabsFieldsSlug,
data: tabsDoc,
depth: 0,
overrideAccess: true,
})
await _payload.create({
collection: pointFieldsSlug,
data: pointDoc,
depth: 0,
overrideAccess: true,
})
await _payload.create({
collection: dateFieldsSlug,
data: dateDoc,
depth: 0,
overrideAccess: true,
})
await _payload.create({
collection: codeFieldsSlug,
data: codeDoc,
depth: 0,
overrideAccess: true,
})
await _payload.create({
collection: jsonFieldsSlug,
data: jsonDoc,
depth: 0,
overrideAccess: true,
})
await _payload.create({
collection: blockFieldsSlug,
data: blocksDocWithRichText,
depth: 0,
overrideAccess: true,
})
await _payload.create({
collection: lexicalFieldsSlug,
data: lexicalDocWithRelId,
depth: 0,
overrideAccess: true,
})
await _payload.create({
collection: lexicalMigrateFieldsSlug,
data: lexicalMigrateDocWithRelId,
depth: 0,
overrideAccess: true,
})
await _payload.create({
collection: numberFieldsSlug,
data: { number: 2 },
depth: 0,
overrideAccess: true,
})
await _payload.create({
collection: numberFieldsSlug,
data: { number: 3 },
depth: 0,
overrideAccess: true,
})
await _payload.create({
collection: numberFieldsSlug,
data: numberDoc,
depth: 0,
overrideAccess: true,
})
}