diff --git a/package.json b/package.json index 113bd8032..da1f5daeb 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "clean:cache": "rimraf node_modules/.cache && rimraf packages/payload/node_modules/.cache && rimraf .next", "clean:build": "find . \\( -type d \\( -name dist -o -name .cache -o -name .next -o -name .turbo \\) -o -type f -name tsconfig.tsbuildinfo \\) -not -path '*/node_modules/*' -exec rm -rf {} +", "clean:all": "find . \\( -type d \\( -name node_modules -o -name dist -o -name .cache -o -name .next -o -name .turbo \\) -o -type f -name tsconfig.tsbuildinfo \\) -exec rm -rf {} +", - "dev": "cross-env node --no-deprecation ./test/dev.js", + "dev": "tsx ./test/dev.ts", "devsafe": "rm -rf .next && cross-env node --no-deprecation ./test/dev.js", "dev:generate-graphql-schema": "cross-env NODE_OPTIONS=--no-deprecation tsx ./test/generateGraphQLSchema.ts", "dev:generate-types": "cross-env NODE_OPTIONS=--no-deprecation tsx ./test/generateTypes.ts", diff --git a/test/beforeTest.js b/test/beforeTest.js deleted file mode 100644 index be3fe3a40..000000000 --- a/test/beforeTest.js +++ /dev/null @@ -1,35 +0,0 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -import { promises as __promises, promises as _promises, existsSync, promises } from 'fs' -import json5 from 'json5' -import { dirname, resolve } from 'path' -import { fileURLToPath } from 'url' - -const { readFile } = promises -const { writeFile } = _promises -const { rm } = __promises -const { parse } = json5 - -export const beforeTest = async (testSuiteName) => { - const __filename = fileURLToPath(import.meta.url) - const __dirname = dirname(__filename) - - const testSuite = testSuiteName || '_community' - - console.log('\nUsing config:', testSuite, '\n') - - // Delete next webpack cache - const nextWebpackCache = resolve(__dirname, '..', '.next/cache/webpack') - if (existsSync(nextWebpackCache)) { - await rm(nextWebpackCache, { recursive: true }) - } - - // Set path.'payload-config' in tsconfig.json - const tsConfigPath = resolve(__dirname, '..', 'tsconfig.json') - const tsConfig = await parse(await readFile(tsConfigPath, 'utf8')) - tsConfig.compilerOptions.paths['@payload-config'] = [`./test/${testSuite}/config.ts`] - - await writeFile(tsConfigPath, JSON.stringify(tsConfig, null, 2)) - - const PAYLOAD_CONFIG_PATH = resolve(testSuite, 'config') - process.env.PAYLOAD_CONFIG_PATH = PAYLOAD_CONFIG_PATH -} diff --git a/test/dev.js b/test/dev.js deleted file mode 100644 index 2d8d6687b..000000000 --- a/test/dev.js +++ /dev/null @@ -1,30 +0,0 @@ -import minimist from 'minimist' -import { nextDev } from 'next/dist/cli/next-dev.js' -import { dirname, resolve } from 'path' -import { fileURLToPath } from 'url' - -import { beforeTest } from './beforeTest.js' - -const _filename = fileURLToPath(import.meta.url) -const _dirname = dirname(_filename) - -main() - -process.env.PAYLOAD_DROP_DATABASE = true - -async function main() { - const { - _: [testSuiteArg], - ...args - } = minimist(process.argv.slice(2)) - - if (args.turbo === true) { - process.env.TURBOPACK = '1' - } - - process.env.PAYLOAD_DROP_DATABASE = 'true' - - beforeTest(testSuiteArg) - - nextDev({ _: [resolve(_dirname, '..')], port: process.env.PORT || 3000 }) -} diff --git a/test/dev.ts b/test/dev.ts new file mode 100644 index 000000000..8af524b9d --- /dev/null +++ b/test/dev.ts @@ -0,0 +1,34 @@ +import minimist from 'minimist' +import { nextDev } from 'next/dist/cli/next-dev.js' +import { dirname, resolve } from 'path' +import { fileURLToPath } from 'url' + +import { createTestHooks } from './testHooks.js' + +const _filename = fileURLToPath(import.meta.url) +const _dirname = dirname(_filename) + +process.env.PAYLOAD_DROP_DATABASE = 'true' + +const { + _: [testSuiteArg], + ...args +} = minimist(process.argv.slice(2)) + +if (args.turbo === true) { + process.env.TURBOPACK = '1' +} + +process.env.PAYLOAD_DROP_DATABASE = 'true' + +const { afterTest, beforeTest } = await createTestHooks(testSuiteArg) +await beforeTest() + +// @ts-expect-error +await nextDev({ _: [resolve(_dirname, '..')], port: process.env.PORT || 3000 }) + +// On cmd+c, clean up +process.on('SIGINT', async () => { + await afterTest() + process.exit(0) +}) diff --git a/test/helpers/configHelpers.ts b/test/helpers/configHelpers.ts index 096260c85..d242757a7 100644 --- a/test/helpers/configHelpers.ts +++ b/test/helpers/configHelpers.ts @@ -1,6 +1,7 @@ import { promises as _promises } from 'fs' import { createServer } from 'http' import nextImport from 'next' +import { startMemoryDB } from 'test/startMemoryDB.js' import { parse } from 'url' import type { SanitizedConfig } from '../../packages/payload/src/config/types.js' @@ -8,7 +9,7 @@ import type { Payload } from '../../packages/payload/src/index.js' import { getPayloadHMR } from '../../packages/next/src/utilities/getPayloadHMR.js' import wait from '../../packages/payload/src/utilities/wait.js' -import { beforeTest } from '../beforeTest.js' +import { createTestHooks } from '../testHooks.js' type Args = { config: Promise @@ -22,16 +23,18 @@ type Result = { export async function initPayloadE2E({ config, dirname }: Args): Promise { const testSuiteName = dirname.split('/').pop() - await beforeTest(testSuiteName) + const { beforeTest } = await createTestHooks(testSuiteName) + await beforeTest() process.env.NODE_OPTIONS = '--no-deprecation' process.env.PAYLOAD_DROP_DATABASE = 'true' // @ts-expect-error process.env.NODE_ENV = 'test' - const payload = await getPayloadHMR({ config }) - // const port = await getPort() + const configWithMemoryDB = await startMemoryDB(config) + const payload = await getPayloadHMR({ config: configWithMemoryDB }) + const port = 3000 process.env.PORT = String(port) const serverURL = `http://localhost:${port}` @@ -59,7 +62,7 @@ export async function initPayloadE2E({ config, dirname }: Args): Promise await serverPromise - await wait(3000) + await wait(port) return { payload, serverURL } } diff --git a/test/startMemoryDB.ts b/test/startMemoryDB.ts index fd9485c6a..b84111dec 100644 --- a/test/startMemoryDB.ts +++ b/test/startMemoryDB.ts @@ -3,6 +3,7 @@ import { MongoMemoryReplSet } from 'mongodb-memory-server' import type { SanitizedConfig } from '../packages/payload/src/config/types.js' import { mongooseAdapter } from '../packages/db-mongodb/src/index.js' +import Logger from '../packages/payload/src/utilities/logger.js' export const startMemoryDB = async ( configPromise: Promise, @@ -11,7 +12,8 @@ export const startMemoryDB = async ( process.env.NODE_OPTIONS = '--no-deprecation' - console.log('---- CONNECTING TO MEMORY DB ----') + const logger = Logger() + logger.info('---- CONNECTING TO MEMORY DB ----') switch (process.env.PAYLOAD_DATABASE) { case 'postgres': diff --git a/test/testHooks.ts b/test/testHooks.ts new file mode 100644 index 000000000..70ad8ad14 --- /dev/null +++ b/test/testHooks.ts @@ -0,0 +1,53 @@ +import { existsSync, promises } from 'fs' +import json5 from 'json5' +import { dirname, resolve } from 'path' +import { fileURLToPath } from 'url' + +const { readFile, writeFile, rm } = promises +const { parse } = json5 + +type TestHooks = { + afterTest: () => Promise + beforeTest: () => Promise +} + +export const createTestHooks = async (testSuiteName = '_community'): Promise => { + const __filename = fileURLToPath(import.meta.url) + const __dirname = dirname(__filename) + + console.log('\nUsing config:', testSuiteName, '\n') + + const tsConfigPath = resolve(__dirname, '..', 'tsconfig.json') + const tsConfig = await parse(await readFile(tsConfigPath, 'utf8')) + const originalPayloadConfigTsValue = + tsConfig.compilerOptions.paths['@payload-config'] ?? './test/_community/config.ts' + + return { + /** + * Clear next webpack cache and set '@payload-config' path in tsconfig.json + */ + beforeTest: async () => { + // Delete next webpack cache + const nextWebpackCache = resolve(__dirname, '..', '.next/cache/webpack') + if (existsSync(nextWebpackCache)) { + await rm(nextWebpackCache, { recursive: true }) + } + + // Set '@payload-config' in tsconfig.json + tsConfig.compilerOptions.paths['@payload-config'] = [`./test/${testSuiteName}/config.ts`] + await writeFile(tsConfigPath, JSON.stringify(tsConfig, null, 2)) + + const PAYLOAD_CONFIG_PATH = resolve(testSuiteName, 'config') + process.env.PAYLOAD_CONFIG_PATH = PAYLOAD_CONFIG_PATH + }, + /** + * Reset the changes made to tsconfig.json + */ + afterTest: async () => { + // Revert the changes made to tsconfig.json + tsConfig.compilerOptions.paths['@payload-config'] = originalPayloadConfigTsValue + + await writeFile(tsConfigPath, JSON.stringify(tsConfig, null, 2) + '\n') + }, + } +}