# Payload Testing Example This example demonstrates how to get started with testing Payload using [Jest](https://jestjs.io/). You can clone this down and use it as a starting point for your own Payload projects, or you can follow the steps below to add testing to your existing Payload project. ## Add testing to your existing Payload project 1. Initial setup: ```bash # install dependencies yarn add --dev jest mongodb-memory-server @swc/jest @swc/core isomorphic-fetch @types/jest ``` ```bash # create a .env file cp .env.example .env ``` 2. This example uses the following folder structure: ``` root └─ /src └─ payload.config.ts └─ /tests ``` 3. Add test credentials to your project. Create a file at `src/tests/credentials.ts` with the following contents: ```ts export default { email: 'test@test.com', password: 'test', }; ``` 4. Add the global setup file to your project. This file will be run before any tests are run. It will start a MongoDB server and create a Payload instance for you to use in your tests. Create a file at `src/tests/globalSetup.ts` with the following contents: ```ts import { resolve } from 'path'; import payload from 'payload'; import express from 'express'; import testCredentials from './credentials'; require('dotenv').config({ path: resolve(__dirname, '../../.env'), }); const app = express(); const globalSetup = async () => { await payload.init({ secret: process.env.PAYLOAD_SECRET_KEY, mongoURL: process.env.MONGO_URL, express: app, }); app.listen(process.env.PORT, async () => { console.log(`Express is now listening for incoming connections on port ${process.env.PORT}.`); }); const response = await fetch(`${process.env.PAYLOAD_PUBLIC_SERVER_URL}/api/users/first-register`, { body: JSON.stringify({ email: testCredentials.email, password: testCredentials.password, }), headers: { 'Content-Type': 'application/json', }, method: 'post', }); const data = await response.json(); if (!data.user || !data.user.token) { throw new Error('Failed to register first user'); } }; export default globalSetup; ``` 5. Add a `jest.config.ts` file to the root of your project: ```ts module.exports = { verbose: true, globalSetup: '/src/tests/globalSetup.ts', roots: ['/src/'], extensionsToTreatAsEsm: ['.ts', '.tsx'], transform: { '^.+\\.(t|j)sx?$': [ '@swc/jest', { jsc: { target: 'es2021', }, }, ], }, }; ``` 6. Write your first test. Create a file at `src/tests/login.spec.ts` with the following contents: ```ts import { User } from '../payload-types'; import testCredentials from './credentials'; describe('Users', () => { it('should allow a user to log in', async () => { const result: { token: string user: User } = await fetch(`${process.env.PAYLOAD_PUBLIC_SERVER_URL}/api/users/login`, { method: 'post', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email: testCredentials.email, password: testCredentials.password, }), }).then((res) => res.json()); expect(result.token).toBeDefined(); }); }); ``` 7. Add a script to run tests via the command line. Add the following to your `package.json` scripts: ```json "scripts": { "test": "NODE_OPTIONS=--experimental-vm-modules jest --forceExit --detectOpenHandles" } ``` 8. Run your tests: ```bash yarn test ```