From 2ed7e325b848f50a78bb81102f3ae1fb8544e352 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch <30633324+JarrodMFlesch@users.noreply.github.com> Date: Tue, 21 Mar 2023 22:34:01 -0400 Subject: [PATCH] Issue template improvements (#2231) --- .github/ISSUE_TEMPLATE/BUG_REPORT.md | 18 +++++ ISSUE_GUIDE.md | 64 ++++++++++++++++ contributing.md | 2 - src/admin/assets/images/github/e2e-debug.png | Bin 0 -> 16189 bytes src/admin/assets/images/github/int-debug.png | Bin 0 -> 26796 bytes test/_community/collections/Posts/index.ts | 13 ++++ test/_community/config.ts | 33 +++++++++ test/_community/e2e.spec.ts | 32 ++++++++ test/_community/globals/Menu/index.ts | 13 ++++ test/_community/int.spec.ts | 73 +++++++++++++++++++ test/_community/payload-types.ts | 37 ++++++++++ test/_community/tsconfig.json | 9 +++ test/versions/payload-types.ts | 9 +++ 13 files changed, 301 insertions(+), 2 deletions(-) create mode 100644 ISSUE_GUIDE.md create mode 100644 src/admin/assets/images/github/e2e-debug.png create mode 100644 src/admin/assets/images/github/int-debug.png create mode 100644 test/_community/collections/Posts/index.ts create mode 100644 test/_community/config.ts create mode 100644 test/_community/e2e.spec.ts create mode 100644 test/_community/globals/Menu/index.ts create mode 100644 test/_community/int.spec.ts create mode 100644 test/_community/payload-types.ts create mode 100644 test/_community/tsconfig.json diff --git a/.github/ISSUE_TEMPLATE/BUG_REPORT.md b/.github/ISSUE_TEMPLATE/BUG_REPORT.md index da5e94528..acd296327 100644 --- a/.github/ISSUE_TEMPLATE/BUG_REPORT.md +++ b/.github/ISSUE_TEMPLATE/BUG_REPORT.md @@ -8,6 +8,24 @@ labels: 'possible-bug' +## Expected Behavior + + + +## Current Behavior + + + +## Reproduction Fork + + + ## Steps to Reproduce diff --git a/ISSUE_GUIDE.md b/ISSUE_GUIDE.md new file mode 100644 index 000000000..9f5df6607 --- /dev/null +++ b/ISSUE_GUIDE.md @@ -0,0 +1,64 @@ +# Reporting an issue + +To report an issue, please follow the steps below: + +1. Fork this repository +2. Add necessary collections/globals/fields to the `test/_community` directory to recreate the issue you are experiencing +3. Create an issue and add a link to your forked repo + +**The goal is to isolate the problem by reducing the number of fields/collections you add to the test/_community folder. This folder is not meant for you to copy your project into, but to recreate the issue you are experiencing with minimal config.** + +## Test directory file tree explanation +```text +. +├── config.ts +├── int.spec.ts +├── e2e.spec.ts +└── payload-types.ts +``` + +- `config.ts` - This is the _granular_ Payload config for testing. It should be as lightweight as possible. Reference existing configs for an example +- `int.spec.ts` [Optional] - This is the test file run by jest. Any test file must have a `*int.spec.ts` suffix. +- `e2e.spec.ts` [Optional] - This is the end-to-end test file that will load up the admin UI using the above config and run Playwright tests. +- `payload-types.ts` - Generated types from `config.ts`. Generate this file by running `yarn dev:generate-types _community`. + +The directory split up in this way specifically to reduce friction when creating tests and to add the ability to boot up Payload with that specific config. You should modify the files in `test/_community` to get started. + +## How to start test collection admin UI +To start the admin panel so you can manually recreate your issue, you can run the following command: + + ```bash + # This command will start up Payload using your config + # NOTE: it will wipe the test database on restart + yarn dev _community + ``` + + +## Testing is optional but encouraged +An issue does not need to have failing tests — reproduction steps with your forked repo are enough at this point. Some people like to dive deeper and we want to give you the guidance/tools to do so. Read more below. + +### How to run integration tests (Payload API tests) +There are a couple ways to do this: + +- **Granularly** - you can run individual tests in vscode by installing the Jest Runner plugin and using that to run individual tests. Clicking the `debug` button will run the test in debug mode allowing you to set break points. + + + +- **Manually** - you can run all int tests in the `/test/_community/int.spec.ts` file by running the following command: + + ```bash + yarn test:int _community + ``` + +### How to run E2E tests (Admin Panel UI tests) +The easiest way to run E2E tests is to install +- [Playwright Test for VSCode](https://marketplace.visualstudio.com/items?itemName=ms-playwright.playwright) +- [Playwright Runner](https://marketplace.visualstudio.com/items?itemName=ortoni.ortoni) + +Once they are installed you can open the `testing` tab in vscode sidebar and drill down to the test you want to run, i.e. `/test/_community/e2e.spec.ts` + + + + +#### Notes +- It is recommended to add the test credentials (located in `test/credentials.ts`) to your autofill for `localhost:3000/admin` as this will be required on every nodemon restart. The default credentials are `dev@payloadcms.com` as email and `test` as password. diff --git a/contributing.md b/contributing.md index 80d98fb39..05b381c28 100644 --- a/contributing.md +++ b/contributing.md @@ -49,8 +49,6 @@ The directory split up in this way specifically to reduce friction when creating The following command will start Payload with your config: `yarn dev my-test-dir`. This command will start up Payload using your config and refresh a test database on every restart. -When switching between test directories, you will want to remove your `node_modules/.cache ` manually or by running `yarn clean:cache`. - NOTE: It is recommended to add the test credentials (located in `test/credentials.ts`) to your autofill for `localhost:3000/admin` as this will be required on every nodemon restart. The default credentials are `dev@payloadcms.com` as E-Mail and `test` as password. ## Pull Requests diff --git a/src/admin/assets/images/github/e2e-debug.png b/src/admin/assets/images/github/e2e-debug.png new file mode 100644 index 0000000000000000000000000000000000000000..78586e2d4723041b004cd63dc58e601133f63d15 GIT binary patch literal 16189 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

O^5L=U#85lrTy)4K+ca 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 literal 0 HcmV?d00001 diff --git a/src/admin/assets/images/github/int-debug.png b/src/admin/assets/images/github/int-debug.png new file mode 100644 index 0000000000000000000000000000000000000000..5dfeb4b30ff17cf247751ecb165239dc7ce4d52d GIT binary patch literal 26796 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 { + await payload.create({ + collection: 'users', + data: { + email: devUser.email, + password: devUser.password, + }, + }); + + await payload.create({ + collection: postsSlug, + data: { + text: 'example post', + }, + }); + }, +}); diff --git a/test/_community/e2e.spec.ts b/test/_community/e2e.spec.ts new file mode 100644 index 000000000..d2795ca2c --- /dev/null +++ b/test/_community/e2e.spec.ts @@ -0,0 +1,32 @@ +import type { Page } from '@playwright/test'; +import { expect, test } from '@playwright/test'; +import { AdminUrlUtil } from '../helpers/adminUrlUtil'; +import { initPayloadE2E } from '../helpers/configHelpers'; +import { login } from '../helpers'; + +const { beforeAll, describe } = test; +let url: AdminUrlUtil; + +describe('Admin Panel', () => { + let page: Page; + + beforeAll(async ({ browser }) => { + const { serverURL } = await initPayloadE2E(__dirname); + url = new AdminUrlUtil(serverURL, 'posts'); + + const context = await browser.newContext(); + page = await context.newPage(); + + await login({ + page, + serverURL, + }); + }); + + test('example test', async () => { + await page.goto(url.list); + + const textCell = page.locator('.row-1 .cell-text'); + await expect(textCell).toHaveText('example post'); + }); +}); diff --git a/test/_community/globals/Menu/index.ts b/test/_community/globals/Menu/index.ts new file mode 100644 index 000000000..ee9d1def7 --- /dev/null +++ b/test/_community/globals/Menu/index.ts @@ -0,0 +1,13 @@ +import { GlobalConfig } from '../../../../src/globals/config/types'; + +export const menuSlug = 'menu'; + +export const MenuGlobal: GlobalConfig = { + slug: menuSlug, + fields: [ + { + name: 'globalText', + type: 'text', + }, + ], +}; diff --git a/test/_community/int.spec.ts b/test/_community/int.spec.ts new file mode 100644 index 000000000..02d4de240 --- /dev/null +++ b/test/_community/int.spec.ts @@ -0,0 +1,73 @@ +import mongoose from 'mongoose'; +import payload from '../../src'; +import { initPayloadTest } from '../helpers/configHelpers'; +import { devUser } from '../credentials'; +import { postsSlug } from './collections/Posts'; + +require('isomorphic-fetch'); + +let apiUrl; +let jwt; + +const headers = { + 'Content-Type': 'application/json', +}; +const { email, password } = devUser; +describe('_Community Tests', () => { + // --__--__--__--__--__--__--__--__--__ + // Boilerplate test setup/teardown + // --__--__--__--__--__--__--__--__--__ + beforeAll(async () => { + const { serverURL } = await initPayloadTest({ __dirname, init: { local: false } }); + apiUrl = `${serverURL}/api`; + + const response = await fetch(`${apiUrl}/users/login`, { + body: JSON.stringify({ + email, + password, + }), + headers, + method: 'post', + }); + + const data = await response.json(); + jwt = data.token; + }); + + afterAll(async () => { + await mongoose.connection.dropDatabase(); + await mongoose.connection.close(); + await payload.mongoMemoryServer.stop(); + }); + + // --__--__--__--__--__--__--__--__--__ + // You can run tests against the local API or the REST API + // use the tests below as a guide + // --__--__--__--__--__--__--__--__--__ + + it('local API example', async () => { + const newPost = await payload.create({ + collection: postsSlug, + data: { + text: 'LOCAL API EXAMPLE', + }, + }); + + expect(newPost.text).toEqual('LOCAL API EXAMPLE'); + }); + + it('rest API example', async () => { + const newPost = await fetch(`${apiUrl}/${postsSlug}`, { + method: 'POST', + headers: { + ...headers, + Authorization: `JWT ${jwt}`, + }, + body: JSON.stringify({ + text: 'REST API EXAMPLE', + }), + }).then((res) => res.json()); + + expect(newPost.doc.text).toEqual('REST API EXAMPLE'); + }); +}); diff --git a/test/_community/payload-types.ts b/test/_community/payload-types.ts new file mode 100644 index 000000000..6a97a19bc --- /dev/null +++ b/test/_community/payload-types.ts @@ -0,0 +1,37 @@ +/* tslint:disable */ +/** + * This file was automatically generated by Payload CMS. + * DO NOT MODIFY IT BY HAND. Instead, modify your source Payload config, + * and re-run `payload generate:types` to regenerate this file. + */ + +export interface Config { + collections: { + posts: Post; + users: User; + }; + globals: { + menu: Menu; + }; +} +export interface Post { + id: string; + text?: string; + createdAt: string; + updatedAt: string; +} +export interface User { + id: string; + email?: string; + resetPasswordToken?: string; + resetPasswordExpiration?: string; + loginAttempts?: number; + lockUntil?: string; + createdAt: string; + updatedAt: string; + password?: string; +} +export interface Menu { + id: string; + globalText?: string; +} diff --git a/test/_community/tsconfig.json b/test/_community/tsconfig.json new file mode 100644 index 000000000..f920e99ec --- /dev/null +++ b/test/_community/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "paths": { + "payload/generated-types": [ + "./payload-types.ts" + ] + } + } +} \ No newline at end of file diff --git a/test/versions/payload-types.ts b/test/versions/payload-types.ts index 3b725acdc..685365deb 100644 --- a/test/versions/payload-types.ts +++ b/test/versions/payload-types.ts @@ -9,6 +9,7 @@ export interface Config { collections: { 'autosave-posts': AutosavePost; 'draft-posts': DraftPost; + 'version-posts': VersionPost; users: User; }; globals: { @@ -34,6 +35,13 @@ export interface DraftPost { createdAt: string; updatedAt: string; } +export interface VersionPost { + id: string; + title: string; + description: string; + createdAt: string; + updatedAt: string; +} export interface User { id: string; email?: string; @@ -43,6 +51,7 @@ export interface User { lockUntil?: string; createdAt: string; updatedAt: string; + password?: string; } export interface AutosaveGlobal { id: string;