chore: resolves some of the testing suite issues

This commit is contained in:
James
2023-09-15 16:29:16 -04:00
parent 1fa636417f
commit 2a9946f788
12 changed files with 154 additions and 51 deletions

View File

@@ -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",

View File

@@ -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",

View File

@@ -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
}

View File

@@ -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') {

View File

@@ -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([])
})
})

View File

@@ -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
})
}

View File

@@ -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
})

28
pnpm-lock.yaml generated
View File

@@ -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==}

View File

@@ -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

View File

@@ -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')

View File

@@ -1,5 +1,4 @@
import { randomBytes } from 'crypto'
import mongoose from 'mongoose'
import type { Relation } from './config'
import type { ErrorOnHook, Post } from './payload-types'

View File

@@ -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')