From 2a9946f788458fd1dd23230811a48a484c4c1360 Mon Sep 17 00:00:00 2001 From: James Date: Fri, 15 Sep 2023 16:29:16 -0400 Subject: [PATCH] chore: resolves some of the testing suite issues --- package.json | 8 ++ packages/payload/package.json | 1 - .../src/collections/config/sanitize.ts | 10 ++- packages/payload/src/config/sanitize.ts | 3 +- .../src/fields/config/sanitize.spec.ts | 86 +++++++++++++++---- .../payload/src/fields/config/sanitize.ts | 36 ++++++-- .../payload/src/globals/config/sanitize.ts | 21 +++-- pnpm-lock.yaml | 28 ++++-- test/access-control/int.spec.ts | 7 +- test/auth/int.spec.ts | 3 +- test/collections-rest/int.spec.ts | 1 - test/helpers/configHelpers.ts | 1 + 12 files changed, 154 insertions(+), 51 deletions(-) diff --git a/package.json b/package.json index 234577270..52975c637 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "test:e2e": "ts-node -T ./test/runE2E.ts", "test:e2e:debug": "cross-env PWDEBUG=1 DISABLE_LOGGING=true playwright test", "test:e2e:headed": "cross-env DISABLE_LOGGING=true playwright test --headed", + "test:int:postgres": "cross-env PAYLOAD_DATABASE=postgres DISABLE_LOGGING=true jest --forceExit --detectOpenHandles", "test:int": "cross-env DISABLE_LOGGING=true jest --forceExit --detectOpenHandles", "translateNewKeys": "pnpm --filter payload run translateNewKeys" }, @@ -49,9 +50,16 @@ "cross-env": "7.0.3", "express": "4.18.2", "get-port": "5.1.1", + "graphql-request": "3.7.0", + "isomorphic-fetch": "3.0.0", "jest": "29.6.4", "jest-environment-jsdom": "29.6.4", + "jwt-decode": "3.1.2", + "mongodb-memory-server": "8.13.0", + "node-fetch": "2.6.12", "prettier": "^3.0.3", + "qs": "6.11.2", + "react": "18.2.0", "shelljs": "0.8.5", "ts-node": "10.9.1", "typescript": "5.2.2", diff --git a/packages/payload/package.json b/packages/payload/package.json index 5c3d2babb..1fa327bac 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -213,7 +213,6 @@ "get-port": "5.1.1", "glob": "8.1.0", "graphql-request": "3.7.0", - "mongodb-memory-server": "8.13.0", "node-fetch": "2.6.12", "nodemon": "3.0.1", "object.assign": "4.1.4", diff --git a/packages/payload/src/collections/config/sanitize.ts b/packages/payload/src/collections/config/sanitize.ts index faf45a04c..2b43fb587 100644 --- a/packages/payload/src/collections/config/sanitize.ts +++ b/packages/payload/src/collections/config/sanitize.ts @@ -45,23 +45,23 @@ const sanitizeCollection = ( }) if (!hasUpdatedAt) { sanitized.fields.push({ + name: 'updatedAt', admin: { disableBulkEdit: true, hidden: true, }, label: translations['general:updatedAt'], - name: 'updatedAt', type: 'date', }) } if (!hasCreatedAt) { sanitized.fields.push({ + name: 'createdAt', admin: { disableBulkEdit: true, hidden: true, }, label: translations['general:createdAt'], - name: 'createdAt', type: 'date', }) } @@ -143,7 +143,11 @@ const sanitizeCollection = ( // ///////////////////////////////// const validRelationships = config.collections.map((c) => c.slug) - sanitized.fields = sanitizeFields(sanitized.fields, validRelationships) + sanitized.fields = sanitizeFields({ + config, + fields: sanitized.fields, + validRelationships, + }) return sanitized as SanitizedCollectionConfig } diff --git a/packages/payload/src/config/sanitize.ts b/packages/payload/src/config/sanitize.ts index 6a99d90fc..792ed2b98 100644 --- a/packages/payload/src/config/sanitize.ts +++ b/packages/payload/src/config/sanitize.ts @@ -6,7 +6,6 @@ import type { LocalizationConfigWithLabels, LocalizationConfigWithNoLabels, SanitizedConfig, - SanitizedLocalizationConfig, } from './types' import { defaultUserCollection } from '../auth/defaultUser' @@ -96,7 +95,7 @@ export const sanitizeConfig = (incomingConfig: Config): SanitizedConfig => { checkDuplicateCollections(config.collections) if (config.globals.length > 0) { - config.globals = sanitizeGlobals(config.collections, config.globals) + config.globals = sanitizeGlobals(config as SanitizedConfig) } if (typeof config.serverURL === 'undefined') { diff --git a/packages/payload/src/fields/config/sanitize.spec.ts b/packages/payload/src/fields/config/sanitize.spec.ts index 9bf8b083e..439c3a308 100644 --- a/packages/payload/src/fields/config/sanitize.spec.ts +++ b/packages/payload/src/fields/config/sanitize.spec.ts @@ -7,9 +7,15 @@ import type { NumberField, TextField, } from './types' - +import { Config } from '../../config/types' import { InvalidFieldName, InvalidFieldRelationship, MissingFieldType } from '../../errors' import sanitizeFields from './sanitize' +import { DatabaseAdapter } from '../..' + +const dummyConfig: Config = { + collections: [], + db: () => ({}) as DatabaseAdapter, +} describe('sanitizeFields', () => { it('should throw on missing type field', () => { @@ -24,7 +30,11 @@ describe('sanitizeFields', () => { expect(() => { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - sanitizeFields(fields, []) + sanitizeFields({ + config: dummyConfig, + fields, + validRelationships: [], + }) }).toThrow(MissingFieldType) }) it('should throw on invalid field name', () => { @@ -36,7 +46,11 @@ describe('sanitizeFields', () => { }, ] expect(() => { - sanitizeFields(fields, []) + sanitizeFields({ + config: dummyConfig, + fields, + validRelationships: [], + }) }).toThrow(InvalidFieldName) }) @@ -48,7 +62,11 @@ describe('sanitizeFields', () => { type: 'text', }, ] - const sanitizedField = sanitizeFields(fields, [])[0] as TextField + const sanitizedField = sanitizeFields({ + config: dummyConfig, + fields, + validRelationships: [], + })[0] as TextField expect(sanitizedField.name).toStrictEqual('someField') expect(sanitizedField.label).toStrictEqual('Some Field') expect(sanitizedField.type).toStrictEqual('text') @@ -61,7 +79,11 @@ describe('sanitizeFields', () => { type: 'text', }, ] - const sanitizedField = sanitizeFields(fields, [])[0] as TextField + const sanitizedField = sanitizeFields({ + config: dummyConfig, + fields, + validRelationships: [], + })[0] as TextField expect(sanitizedField.name).toStrictEqual('someField') expect(sanitizedField.label).toStrictEqual('Do not label') expect(sanitizedField.type).toStrictEqual('text') @@ -76,7 +98,11 @@ describe('sanitizeFields', () => { type: 'text', }, ] - const sanitizedField = sanitizeFields(fields, [])[0] as TextField + const sanitizedField = sanitizeFields({ + config: dummyConfig, + fields, + validRelationships: [], + })[0] as TextField expect(sanitizedField.name).toStrictEqual('someField') expect(sanitizedField.label).toStrictEqual(false) expect(sanitizedField.type).toStrictEqual('text') @@ -94,7 +120,11 @@ describe('sanitizeFields', () => { name: 'items', type: 'array', } - const sanitizedField = sanitizeFields([arrayField], [])[0] as ArrayField + const sanitizedField = sanitizeFields({ + config: dummyConfig, + fields: [arrayField], + validRelationships: [], + })[0] as ArrayField expect(sanitizedField.name).toStrictEqual('items') expect(sanitizedField.label).toStrictEqual(false) expect(sanitizedField.type).toStrictEqual('array') @@ -119,7 +149,11 @@ describe('sanitizeFields', () => { type: 'blocks', }, ] - const sanitizedField = sanitizeFields(fields, [])[0] as BlockField + const sanitizedField = sanitizeFields({ + config: dummyConfig, + fields, + validRelationships: [], + })[0] as BlockField expect(sanitizedField.name).toStrictEqual('noLabelBlock') expect(sanitizedField.label).toStrictEqual(false) expect(sanitizedField.type).toStrictEqual('blocks') @@ -140,7 +174,11 @@ describe('sanitizeFields', () => { type: 'array', }, ] - const sanitizedField = sanitizeFields(fields, [])[0] as ArrayField + const sanitizedField = sanitizeFields({ + config: dummyConfig, + fields, + validRelationships: [], + })[0] as ArrayField expect(sanitizedField.name).toStrictEqual('items') expect(sanitizedField.label).toStrictEqual('Items') expect(sanitizedField.type).toStrictEqual('array') @@ -160,7 +198,11 @@ describe('sanitizeFields', () => { type: 'blocks', }, ] - const sanitizedField = sanitizeFields(fields, [])[0] as BlockField + const sanitizedField = sanitizeFields({ + config: dummyConfig, + fields, + validRelationships: [], + })[0] as BlockField expect(sanitizedField.name).toStrictEqual('specialBlock') expect(sanitizedField.label).toStrictEqual('Special Block') expect(sanitizedField.type).toStrictEqual('blocks') @@ -184,7 +226,7 @@ describe('sanitizeFields', () => { }, ] expect(() => { - sanitizeFields(fields, validRelationships) + sanitizeFields({ config: dummyConfig, fields, validRelationships }) }).not.toThrow() }) @@ -199,7 +241,7 @@ describe('sanitizeFields', () => { }, ] expect(() => { - sanitizeFields(fields, validRelationships) + sanitizeFields({ config: dummyConfig, fields, validRelationships }) }).not.toThrow() }) @@ -225,7 +267,7 @@ describe('sanitizeFields', () => { }, ] expect(() => { - sanitizeFields(fields, validRelationships) + sanitizeFields({ config: dummyConfig, fields, validRelationships }) }).not.toThrow() }) @@ -240,7 +282,7 @@ describe('sanitizeFields', () => { }, ] expect(() => { - sanitizeFields(fields, validRelationships) + sanitizeFields({ config: dummyConfig, fields, validRelationships }) }).toThrow(InvalidFieldRelationship) }) @@ -255,7 +297,7 @@ describe('sanitizeFields', () => { }, ] expect(() => { - sanitizeFields(fields, validRelationships) + sanitizeFields({ config: dummyConfig, fields, validRelationships }) }).toThrow(InvalidFieldRelationship) }) @@ -281,7 +323,7 @@ describe('sanitizeFields', () => { }, ] expect(() => { - sanitizeFields(fields, validRelationships) + sanitizeFields({ config: dummyConfig, fields, validRelationships }) }).toThrow(InvalidFieldRelationship) }) @@ -294,12 +336,20 @@ describe('sanitizeFields', () => { }, ] - const sanitizedField = sanitizeFields(fields, [])[0] as CheckboxField + const sanitizedField = sanitizeFields({ + config: dummyConfig, + fields, + validRelationships: [], + })[0] as CheckboxField expect(sanitizedField.defaultValue).toStrictEqual(false) }) it('should return empty field array if no fields', () => { - const sanitizedFields = sanitizeFields([], []) + const sanitizedFields = sanitizeFields({ + config: dummyConfig, + fields: [], + validRelationships: [], + }) expect(sanitizedFields).toStrictEqual([]) }) }) diff --git a/packages/payload/src/fields/config/sanitize.ts b/packages/payload/src/fields/config/sanitize.ts index fd6669ada..1cc77506d 100644 --- a/packages/payload/src/fields/config/sanitize.ts +++ b/packages/payload/src/fields/config/sanitize.ts @@ -1,3 +1,4 @@ +import type { Config } from '../../config/types' import type { Field } from './types' import withCondition from '../../admin/components/forms/withCondition' @@ -8,7 +9,13 @@ import { baseIDField } from '../baseFields/baseIDField' import validations from '../validations' import { fieldAffectsData, tabHasName } from './types' -const sanitizeFields = (fields: Field[], validRelationships: string[]): Field[] => { +type Args = { + config: Config + fields: Field[] + validRelationships: string[] +} + +const sanitizeFields = ({ config, fields, validRelationships }: Args): Field[] => { if (!fields) return [] return fields.map((unsanitizedField) => { @@ -80,6 +87,8 @@ const sanitizeFields = (fields: Field[], validRelationships: string[]): Field[] } if (fieldAffectsData(field)) { + if (field.localized && !config.localization) delete field.localized + if (typeof field.validate === 'undefined') { const defaultValidate = validations[field.type] if (defaultValidate) { @@ -101,8 +110,13 @@ const sanitizeFields = (fields: Field[], validRelationships: string[]): Field[] field.admin = {} } - if ('fields' in field && field.fields) - field.fields = sanitizeFields(field.fields, validRelationships) + if ('fields' in field && field.fields) { + field.fields = sanitizeFields({ + config, + fields: field.fields, + validRelationships, + }) + } if (field.type === 'tabs') { field.tabs = field.tabs.map((tab) => { @@ -110,7 +124,13 @@ const sanitizeFields = (fields: Field[], validRelationships: string[]): Field[] if (tabHasName(tab) && typeof tab.label === 'undefined') { unsanitizedTab.label = toWords(tab.name) } - unsanitizedTab.fields = sanitizeFields(tab.fields, validRelationships) + + unsanitizedTab.fields = sanitizeFields({ + config, + fields: tab.fields, + validRelationships, + }) + return unsanitizedTab }) } @@ -121,7 +141,13 @@ const sanitizeFields = (fields: Field[], validRelationships: string[]): Field[] unsanitizedBlock.labels = !unsanitizedBlock.labels ? formatLabels(unsanitizedBlock.slug) : unsanitizedBlock.labels - unsanitizedBlock.fields = sanitizeFields(block.fields, validRelationships) + + unsanitizedBlock.fields = sanitizeFields({ + config, + fields: block.fields, + validRelationships, + }) + return unsanitizedBlock }) } diff --git a/packages/payload/src/globals/config/sanitize.ts b/packages/payload/src/globals/config/sanitize.ts index 6eaab3a73..2ae538940 100644 --- a/packages/payload/src/globals/config/sanitize.ts +++ b/packages/payload/src/globals/config/sanitize.ts @@ -1,5 +1,5 @@ -import type { CollectionConfig } from '../../collections/config/types' -import type { GlobalConfig, SanitizedGlobalConfig } from './types' +import type { Config } from '../../config/types' +import type { SanitizedGlobalConfig } from './types' import defaultAccess from '../../auth/defaultAccess' import sanitizeFields from '../../fields/config/sanitize' @@ -9,10 +9,9 @@ import translations from '../../translations' import { toWords } from '../../utilities/formatLabels' import baseVersionFields from '../../versions/baseFields' -const sanitizeGlobals = ( - collections: CollectionConfig[], - globals: GlobalConfig[], -): SanitizedGlobalConfig[] => { +const sanitizeGlobals = (config: Config): SanitizedGlobalConfig[] => { + const { collections, globals } = config + const sanitizedGlobals = globals.map((global) => { const sanitizedGlobal = { ...global } @@ -72,29 +71,33 @@ const sanitizeGlobals = ( }) if (!hasUpdatedAt) { sanitizedGlobal.fields.push({ + name: 'updatedAt', admin: { disableBulkEdit: true, hidden: true, }, label: translations['general:updatedAt'], - name: 'updatedAt', type: 'date', }) } if (!hasCreatedAt) { sanitizedGlobal.fields.push({ + name: 'createdAt', admin: { disableBulkEdit: true, hidden: true, }, label: translations['general:createdAt'], - name: 'createdAt', type: 'date', }) } const validRelationships = collections.map((c) => c.slug) - sanitizedGlobal.fields = sanitizeFields(sanitizedGlobal.fields, validRelationships) + sanitizedGlobal.fields = sanitizeFields({ + config, + fields: sanitizedGlobal.fields, + validRelationships, + }) return sanitizedGlobal as SanitizedGlobalConfig }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f51e2a2c3..ed152200d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -54,15 +54,36 @@ importers: get-port: specifier: 5.1.1 version: 5.1.1 + graphql-request: + specifier: 3.7.0 + version: 3.7.0(graphql@16.7.1) + isomorphic-fetch: + specifier: 3.0.0 + version: 3.0.0 jest: specifier: 29.6.4 version: 29.6.4(@types/node@20.5.7)(ts-node@10.9.1) jest-environment-jsdom: specifier: 29.6.4 version: 29.6.4 + jwt-decode: + specifier: 3.1.2 + version: 3.1.2 + mongodb-memory-server: + specifier: 8.13.0 + version: 8.13.0 + node-fetch: + specifier: 2.6.12 + version: 2.6.12 prettier: specifier: ^3.0.3 version: 3.0.3 + qs: + specifier: 6.11.2 + version: 6.11.2 + react: + specifier: 18.2.0 + version: 18.2.0 shelljs: specifier: 0.8.5 version: 0.8.5 @@ -696,9 +717,6 @@ importers: graphql-request: specifier: 3.7.0 version: 3.7.0(graphql@16.7.1) - mongodb-memory-server: - specifier: 8.13.0 - version: 8.13.0 node-fetch: specifier: 2.6.12 version: 2.6.12 @@ -9131,7 +9149,6 @@ packages: whatwg-fetch: 3.6.17 transitivePeerDependencies: - encoding - dev: false /issue-parser@6.0.0: resolution: {integrity: sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==} @@ -9853,7 +9870,6 @@ packages: /jwt-decode@3.1.2: resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} - dev: false /kareem@2.5.1: resolution: {integrity: sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==} @@ -12253,7 +12269,6 @@ packages: engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 - dev: false /qs@6.4.1: resolution: {integrity: sha512-LQy1Q1fcva/UsnP/6Iaa4lVeM49WiOitu2T4hZCyA/elLKu37L99qcBJk4VCCk+rdLvnMzfKyiN3SZTqdAZGSQ==} @@ -14547,7 +14562,6 @@ packages: /whatwg-fetch@3.6.17: resolution: {integrity: sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==} - dev: false /whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} diff --git a/test/access-control/int.spec.ts b/test/access-control/int.spec.ts index f2e0231fe..c9b7c58a3 100644 --- a/test/access-control/int.spec.ts +++ b/test/access-control/int.spec.ts @@ -4,17 +4,18 @@ import type { Post, RelyOnRequestHeader, Restricted } from './payload-types' import payload from '../../packages/payload/src' import { Forbidden } from '../../packages/payload/src/errors' import { initPayloadTest } from '../helpers/configHelpers' +import { requestHeaders } from './config' import { + firstArrayText, hiddenAccessSlug, hiddenFieldsSlug, relyOnRequestHeadersSlug, - requestHeaders, restrictedSlug, restrictedVersionsSlug, + secondArrayText, siblingDataSlug, slug, -} from './config' -import { firstArrayText, secondArrayText } from './shared' +} from './shared' describe('Access Control', () => { let post1: Post diff --git a/test/auth/int.spec.ts b/test/auth/int.spec.ts index 22597be61..031b18e4c 100644 --- a/test/auth/int.spec.ts +++ b/test/auth/int.spec.ts @@ -1,6 +1,5 @@ import { GraphQLClient } from 'graphql-request' import jwtDecode from 'jwt-decode' -import mongoose from 'mongoose' import type { User } from '../../packages/payload/src/auth' @@ -8,7 +7,7 @@ import payload from '../../packages/payload/src' import configPromise from '../collections-graphql/config' import { devUser } from '../credentials' import { initPayloadTest } from '../helpers/configHelpers' -import { namedSaveToJWTValue, saveToJWTKey, slug } from './config' +import { namedSaveToJWTValue, saveToJWTKey, slug } from './shared' require('isomorphic-fetch') diff --git a/test/collections-rest/int.spec.ts b/test/collections-rest/int.spec.ts index a713505ab..fbb4dadee 100644 --- a/test/collections-rest/int.spec.ts +++ b/test/collections-rest/int.spec.ts @@ -1,5 +1,4 @@ import { randomBytes } from 'crypto' -import mongoose from 'mongoose' import type { Relation } from './config' import type { ErrorOnHook, Post } from './payload-types' diff --git a/test/helpers/configHelpers.ts b/test/helpers/configHelpers.ts index cf01f0f12..2607cd090 100644 --- a/test/helpers/configHelpers.ts +++ b/test/helpers/configHelpers.ts @@ -34,6 +34,7 @@ export async function initPayloadTest(options: Options): Promise<{ serverURL: st ...(options.init || {}), } + process.env.PAYLOAD_DROP_DATABASE = 'true' process.env.NODE_ENV = 'test' process.env.PAYLOAD_CONFIG_PATH = path.resolve(options.__dirname, './config.ts')