mirror of https://github.com/usememos/memos
feat: add e2e test (#1486)
* add i18n * add base e2e test * add multiple test for e2e * extract the funciton of write memo * change test sturct * deteled unused dir * use fixture * add fixture * restruced the project * feat: add workflow * feat: change playwright test position * feat: change playwright test position * using yarn intead of npm * change install method * only enable sign in test * adjust the order of test * change report pos * fix style of e2e workflow * add review test * unify locale * randome write content * change report pos * reduce unused wait time * reduce unused folder * stash * merge upstream locale * change test name * add test item * change action name * add lanuage setting * add shotscreen * change name of test * fix the error of import dep * fix the error of import dep * fix the error of filename * fix the format of workflow * fix the name error of test case * feat: change the describe of test case * feat: remove unused test * feat: change the fixtures name * feat: remove unused config * feat: change docker action * feat: change the generate method * feat: extrace screenshot * feat: change extra path * feat: change extra path * feat: screenshot and upload * feat: change upload filename * feat: change login method * feat: change e2e method * feat: change e2e test * feat: add wait for login --------- Co-authored-by: CorrectRoadH <a778917369@gmail.comå>pull/1526/head
parent
b5c665cb7e
commit
81d4f01b7f
@ -0,0 +1,62 @@
|
||||
name: "E2E Test"
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
branches: [main]
|
||||
jobs:
|
||||
build:
|
||||
name: Build and Run Memos With E2E Test
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Build Docker image
|
||||
id: docker_build
|
||||
uses: docker/build-push-action@v3
|
||||
with:
|
||||
context: ./
|
||||
file: ./Dockerfile
|
||||
platforms: linux/amd64
|
||||
push: false
|
||||
tags: neosmemo/memos:e2e
|
||||
labels: neosmemo/memos:e2e
|
||||
|
||||
- name: Run Docker container
|
||||
run: docker run -d -p 5230:5230 neosmemo/memos:e2e
|
||||
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 18
|
||||
cache: 'yarn'
|
||||
cache-dependency-path: ./web/yarn.lock
|
||||
|
||||
- name: Install dependencies
|
||||
working-directory: web
|
||||
run: yarn
|
||||
|
||||
- name: Install Playwright Browsers
|
||||
working-directory: web
|
||||
run: npx playwright install --with-deps
|
||||
|
||||
- name: Run Playwright tests
|
||||
working-directory: web
|
||||
run: npx playwright test
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
if: always()
|
||||
with:
|
||||
name: playwright-report
|
||||
path: web/playwright-report/
|
||||
retention-days: 30
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
if: always()
|
||||
with:
|
||||
name: playwright-screenshot
|
||||
path: web/playwright-screenshot/
|
||||
retention-days: 30
|
||||
|
||||
- name: Stop Docker container
|
||||
run: docker stop $(docker ps -q)
|
@ -0,0 +1,13 @@
|
||||
import { test } from "@playwright/test";
|
||||
import { signUp } from "./utils";
|
||||
|
||||
test.use({
|
||||
locale: "en-US",
|
||||
timezoneId: "Europe/Berlin",
|
||||
});
|
||||
|
||||
test.describe("Sign up a host account", async () => {
|
||||
test("Sign Up", async ({ page }) => {
|
||||
await signUp(page, "admin", "admin");
|
||||
});
|
||||
});
|
@ -0,0 +1,37 @@
|
||||
import { test, expect } from "@playwright/test";
|
||||
import { review, login, writeMemo } from "./utils";
|
||||
import randomstring from "randomstring";
|
||||
|
||||
test.use({
|
||||
locale: "en-US",
|
||||
timezoneId: "Europe/Berlin",
|
||||
});
|
||||
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await login(page, "admin", "admin");
|
||||
});
|
||||
|
||||
test.describe("Write some memos", async () => {
|
||||
test("Write memos", async ({ page }) => {
|
||||
const content = `${randomstring.generate()} from Write memos`;
|
||||
await writeMemo(page, content);
|
||||
await expect(page.getByText(content)).toBeVisible();
|
||||
});
|
||||
|
||||
test("Write memos with Tag", async ({ page }) => {
|
||||
const tag = randomstring.generate(5);
|
||||
const content = `#${tag} ${randomstring.generate()} from Write memos with Tag`;
|
||||
await writeMemo(page, content);
|
||||
// 1.memo contentg 2.tags list of memos editor 3.tags list
|
||||
await expect(page.getByText(tag)).toHaveCount(3);
|
||||
});
|
||||
});
|
||||
|
||||
test.describe("Daily Review", async () => {
|
||||
test("Daily Review", async ({ page }) => {
|
||||
const content = randomstring.generate();
|
||||
await writeMemo(page, content);
|
||||
await review(page);
|
||||
await expect(page.getByText(content)).toBeVisible();
|
||||
});
|
||||
});
|
@ -0,0 +1,2 @@
|
||||
const baseHost = "http://localhost:5230";
|
||||
export { baseHost };
|
@ -0,0 +1,52 @@
|
||||
import { expect, Page } from "@playwright/test";
|
||||
import locale from "../src/locales/en.json";
|
||||
import { baseHost } from "./fixtures";
|
||||
|
||||
async function screenshot(page: Page, name: string) {
|
||||
await page.screenshot({ path: `playwright-screenshot/${name}.png`, fullPage: true });
|
||||
}
|
||||
|
||||
async function writeMemo(page: Page, content: string) {
|
||||
await expect(page.getByRole("button", { name: locale.editor.save })).toBeDisabled();
|
||||
await page.getByPlaceholder("Any thoughts...").fill(content);
|
||||
await expect(page.getByRole("button", { name: locale.editor.save })).toBeEnabled();
|
||||
await page.getByRole("button", { name: locale.editor.save }).click();
|
||||
}
|
||||
|
||||
async function login(page: Page, username: string, password: string) {
|
||||
page.goto(`${baseHost}/`);
|
||||
await screenshot(page, "explore-page");
|
||||
await page.waitForURL("**/explore");
|
||||
await screenshot(page, "explore-page-after-wait");
|
||||
await page.getByRole("link", { name: locale.common["sign-in"] }).click();
|
||||
await screenshot(page, "auth-page");
|
||||
await page.waitForURL("**/auth");
|
||||
await page.locator('input[type="text"]').click();
|
||||
await page.locator('input[type="text"]').fill(username);
|
||||
await page.locator('input[type="password"]').click();
|
||||
await page.locator('input[type="password"]').fill(password);
|
||||
await page.getByRole("button", { name: locale.common["sign-in"] }).click();
|
||||
await page.waitForTimeout(1000);
|
||||
await screenshot(page, "home-page-login-success");
|
||||
}
|
||||
|
||||
async function signUp(page: Page, username: string, password: string) {
|
||||
await page.goto(`${baseHost}/`);
|
||||
await page.waitForURL("**/auth");
|
||||
await screenshot(page, "sign-up-page");
|
||||
await page.locator('input[type="text"]').click();
|
||||
await page.locator('input[type="text"]').fill(username);
|
||||
await page.locator('input[type="password"]').click();
|
||||
await page.locator('input[type="password"]').fill(password);
|
||||
await page.getByRole("button", { name: locale.auth["signup-as-host"] }).click();
|
||||
await page.waitForTimeout(1000);
|
||||
await screenshot(page, "home-page-sign-up-success");
|
||||
}
|
||||
|
||||
async function review(page: Page) {
|
||||
await page.goto(`${baseHost}/`);
|
||||
await page.getByRole("link", { name: locale["daily-review"]["title"] }).click();
|
||||
await screenshot(page, "review");
|
||||
}
|
||||
|
||||
export { writeMemo, login, signUp, review };
|
@ -0,0 +1,19 @@
|
||||
import { defineConfig, devices } from "@playwright/test";
|
||||
|
||||
export default defineConfig({
|
||||
testDir: "./e2e-tests",
|
||||
fullyParallel: true,
|
||||
forbidOnly: !!process.env.CI,
|
||||
retries: process.env.CI ? 2 : 0,
|
||||
workers: 1,
|
||||
reporter: [["html", { outputFolder: "playwright-report", open: "never" }]],
|
||||
use: {
|
||||
trace: "on-first-retry",
|
||||
},
|
||||
projects: [
|
||||
{
|
||||
name: "chromium",
|
||||
use: { ...devices["Desktop Chrome"] },
|
||||
},
|
||||
],
|
||||
});
|
Loading…
Reference in New Issue