chore: better pattern for memory db

This commit is contained in:
James
2024-04-01 14:36:08 -04:00
parent f230d55031
commit a0f6018469
7 changed files with 41 additions and 56 deletions

1
.gitignore vendored
View File

@@ -15,6 +15,7 @@ test-results
# Ignore test directory media folder/files # Ignore test directory media folder/files
/media /media
test/media
/versions /versions
# Created by https://www.toptal.com/developers/gitignore/api/node,macos,windows,webstorm,sublimetext,visualstudiocode # Created by https://www.toptal.com/developers/gitignore/api/node,macos,windows,webstorm,sublimetext,visualstudiocode

View File

@@ -58,7 +58,17 @@ const databaseAdapters = {
}, },
}), }),
} }
export function buildConfigWithDefaults(testConfig?: Partial<Config>): Promise<SanitizedConfig> {
export async function buildConfigWithDefaults(
testConfig?: Partial<Config>,
): Promise<SanitizedConfig> {
if (process.env.NODE_ENV === 'test') {
databaseAdapters.mongoose = mongooseAdapter({
mongoMemoryServer: global._mongoMemoryServer,
url: process.env.MONGODB_MEMORY_SERVER_URI,
})
}
const config: Config = { const config: Config = {
db: databaseAdapters[process.env.PAYLOAD_DATABASE || 'mongoose'], db: databaseAdapters[process.env.PAYLOAD_DATABASE || 'mongoose'],
secret: 'TEST_SECRET', secret: 'TEST_SECRET',

View File

@@ -8,8 +8,8 @@ import { type Payload } from 'payload'
import { wait } from 'payload/utilities' import { wait } from 'payload/utilities'
import { parse } from 'url' import { parse } from 'url'
import { startMemoryDB } from '../startMemoryDB.js'
import { createTestHooks } from '../testHooks.js' import { createTestHooks } from '../testHooks.js'
import { startMemoryDB } from './startMemoryDB.js'
type Args = { type Args = {
config: Promise<SanitizedConfig> config: Promise<SanitizedConfig>
@@ -22,18 +22,12 @@ type Result = {
} }
export async function initPayloadE2E({ config, dirname }: Args): Promise<Result> { export async function initPayloadE2E({ config, dirname }: Args): Promise<Result> {
process.env.NODE_OPTIONS = '--no-deprecation'
const testSuiteName = dirname.split('/').pop() const testSuiteName = dirname.split('/').pop()
const { beforeTest } = await createTestHooks(testSuiteName) const { beforeTest } = await createTestHooks(testSuiteName)
await beforeTest() await beforeTest()
await startMemoryDB()
process.env.PAYLOAD_DROP_DATABASE = 'true' const payload = await getPayloadHMR({ config })
// @ts-expect-error
process.env.NODE_ENV = 'test'
const configWithMemoryDB = await startMemoryDB(config)
const payload = await getPayloadHMR({ config: configWithMemoryDB })
const port = 3000 const port = 3000
process.env.PORT = String(port) process.env.PORT = String(port)

View File

@@ -2,18 +2,18 @@ import type { SanitizedConfig } from 'payload/config'
import { type Payload, getPayload } from 'payload' import { type Payload, getPayload } from 'payload'
import { startMemoryDB } from '../startMemoryDB.js'
import { NextRESTClient } from './NextRESTClient.js' import { NextRESTClient } from './NextRESTClient.js'
import { startMemoryDB } from './startMemoryDB.js'
/** /**
* Initialize Payload configured for integration tests * Initialize Payload configured for integration tests
*/ */
export async function initPayloadInt( export async function initPayloadInt(
configPromise: Promise<SanitizedConfig>, config: Promise<SanitizedConfig>,
): Promise<{ config: SanitizedConfig; payload: Payload; restClient: NextRESTClient }> { ): Promise<{ config: SanitizedConfig; payload: Payload; restClient: NextRESTClient }> {
const config = await startMemoryDB(configPromise) await startMemoryDB()
const payload = await getPayload({ config }) const payload = await getPayload({ config })
const restClient = new NextRESTClient(payload.config) const restClient = new NextRESTClient(payload.config)
return { config, payload, restClient } return { config: payload.config, payload, restClient }
} }

View File

@@ -0,0 +1,21 @@
import { MongoMemoryReplSet } from 'mongodb-memory-server'
export const startMemoryDB = async () => {
process.env.NODE_ENV = 'test'
process.env.PAYLOAD_DROP_DATABASE = 'true'
process.env.NODE_OPTIONS = '--no-deprecation'
if (
(!process.env.PAYLOAD_DATABASE || process.env.PAYLOAD_DATABASE === 'mongoose') &&
!global._mongoMemoryServer
) {
global._mongoMemoryServer = await MongoMemoryReplSet.create({
replSet: {
count: 3,
dbName: 'payloadmemory',
},
})
process.env.MONGODB_MEMORY_SERVER_URI = global._mongoMemoryServer.getUri()
}
}

View File

@@ -1,41 +0,0 @@
import type { SanitizedConfig } from 'payload/config'
import { mongooseAdapter } from '@payloadcms/db-mongodb'
import { MongoMemoryReplSet } from 'mongodb-memory-server'
import Logger from '../packages/payload/src/utilities/logger.js'
export const startMemoryDB = async (
configPromise: Promise<SanitizedConfig>,
): Promise<SanitizedConfig> => {
const config = await configPromise
process.env.NODE_OPTIONS = '--no-deprecation'
const logger = Logger()
switch (process.env.PAYLOAD_DATABASE) {
case 'postgres':
case 'supabase':
case 'postgres-uuid': {
return config
}
default: {
if (!process.env.CI) logger.info('---- CONNECTING TO MEMORY DB ----')
const db = await MongoMemoryReplSet.create({
replSet: {
count: 3,
dbName: 'payloadmemory',
},
})
config.db = mongooseAdapter({
mongoMemoryServer: db,
url: db.getUri(),
})
return config
}
}
}