mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-07-13 22:37:14 +10:00
test: stabilize e2e suite
Co-authored-by: Amruth Pillai <im.amruth@gmail.com>
This commit is contained in:
@@ -13,7 +13,8 @@ env:
|
||||
APP_URL: http://localhost:3000
|
||||
PORT: "3000"
|
||||
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/postgres
|
||||
AUTH_SECRET: e2e-test-secret
|
||||
AUTH_SECRET: 3f95d9f2687e4d1f9571a7adf0b2e89a7cc98f5b1fb72ad8c9d4b67a42fdf613
|
||||
ENCRYPTION_SECRET: 2f724ef46009b17ea8c5f88e9ea28fd93d12529e7ff71731a8d2875566551d91
|
||||
FLAG_DISABLE_SIGNUPS: "false"
|
||||
FLAG_DISABLE_EMAIL_AUTH: "false"
|
||||
FLAG_DISABLE_API_RATE_LIMIT: "true"
|
||||
@@ -61,6 +62,9 @@ jobs:
|
||||
- name: Prepare Storage
|
||||
run: mkdir -p "$LOCAL_STORAGE_PATH"
|
||||
|
||||
- name: Run Database Migrations
|
||||
run: pnpm db:migrate
|
||||
|
||||
- name: Build
|
||||
run: pnpm build
|
||||
|
||||
|
||||
+4
-2
@@ -10,11 +10,13 @@ Start PostgreSQL:
|
||||
|
||||
Build the production app:
|
||||
|
||||
`APP_URL=http://localhost:3000 PORT=3000 DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres AUTH_SECRET=e2e-test-secret FLAG_DISABLE_SIGNUPS=false FLAG_DISABLE_EMAIL_AUTH=false FLAG_DISABLE_API_RATE_LIMIT=true LOCAL_STORAGE_PATH=/workspace/data/e2e pnpm build`
|
||||
`APP_URL=http://localhost:3000 PORT=3000 DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres AUTH_SECRET=3f95d9f2687e4d1f9571a7adf0b2e89a7cc98f5b1fb72ad8c9d4b67a42fdf613 ENCRYPTION_SECRET=2f724ef46009b17ea8c5f88e9ea28fd93d12529e7ff71731a8d2875566551d91 FLAG_DISABLE_SIGNUPS=false FLAG_DISABLE_EMAIL_AUTH=false FLAG_DISABLE_API_RATE_LIMIT=true LOCAL_STORAGE_PATH=/workspace/data/e2e pnpm db:migrate`
|
||||
|
||||
`APP_URL=http://localhost:3000 PORT=3000 DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres AUTH_SECRET=3f95d9f2687e4d1f9571a7adf0b2e89a7cc98f5b1fb72ad8c9d4b67a42fdf613 ENCRYPTION_SECRET=2f724ef46009b17ea8c5f88e9ea28fd93d12529e7ff71731a8d2875566551d91 FLAG_DISABLE_SIGNUPS=false FLAG_DISABLE_EMAIL_AUTH=false FLAG_DISABLE_API_RATE_LIMIT=true LOCAL_STORAGE_PATH=/workspace/data/e2e pnpm build`
|
||||
|
||||
Run tests:
|
||||
|
||||
`APP_URL=http://localhost:3000 PORT=3000 DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres AUTH_SECRET=e2e-test-secret FLAG_DISABLE_SIGNUPS=false FLAG_DISABLE_EMAIL_AUTH=false FLAG_DISABLE_API_RATE_LIMIT=true LOCAL_STORAGE_PATH=/workspace/data/e2e pnpm test:e2e`
|
||||
`APP_URL=http://localhost:3000 PORT=3000 DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres AUTH_SECRET=3f95d9f2687e4d1f9571a7adf0b2e89a7cc98f5b1fb72ad8c9d4b67a42fdf613 ENCRYPTION_SECRET=2f724ef46009b17ea8c5f88e9ea28fd93d12529e7ff71731a8d2875566551d91 FLAG_DISABLE_SIGNUPS=false FLAG_DISABLE_EMAIL_AUTH=false FLAG_DISABLE_API_RATE_LIMIT=true LOCAL_STORAGE_PATH=/workspace/data/e2e pnpm test:e2e`
|
||||
|
||||
## Coverage
|
||||
|
||||
|
||||
@@ -9,19 +9,19 @@ async function assertAuthResponse(response: Awaited<ReturnType<APIRequestContext
|
||||
|
||||
export async function registerViaUi(page: Page, account: E2EAccount) {
|
||||
await page.goto("/auth/register");
|
||||
await page.getByLabel("Name").fill(account.name);
|
||||
await page.getByRole("textbox", { name: "Name", exact: true }).fill(account.name);
|
||||
await page.getByLabel("Username").fill(account.username);
|
||||
await page.getByLabel("Email Address").fill(account.email);
|
||||
await page.getByLabel("Password").fill(account.password);
|
||||
await page.getByLabel("Email Address", { exact: true }).fill(account.email);
|
||||
await page.getByLabel("Password", { exact: true }).fill(account.password);
|
||||
await page.getByRole("button", { name: "Sign up" }).click();
|
||||
await page.getByRole("link", { name: "Continue" }).click();
|
||||
await page.getByRole("button", { name: "Continue" }).click();
|
||||
await page.waitForURL(/\/dashboard/);
|
||||
}
|
||||
|
||||
export async function loginViaUi(page: Page, account: E2EAccount) {
|
||||
await page.goto("/auth/login");
|
||||
await page.getByLabel("Email Address").fill(account.email);
|
||||
await page.getByLabel("Password").fill(account.password);
|
||||
await page.getByLabel("Email Address", { exact: true }).fill(account.email);
|
||||
await page.getByLabel("Password", { exact: true }).fill(account.password);
|
||||
await page.getByRole("button", { name: "Sign in" }).click();
|
||||
await page.waitForURL(/\/dashboard/);
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ export async function createSampleResumeFromDashboard(page: Page, testInfo: Test
|
||||
return resumeName;
|
||||
}
|
||||
|
||||
export async function openSidebarSection(page: Page, title: string) {
|
||||
export async function openSidebarSection(page: Page, title: string, side: "left" | "right" = "left") {
|
||||
await page.getByTitle(title, { exact: true }).click();
|
||||
await expect(page.getByRole("heading", { name: title })).toBeVisible();
|
||||
await expect(page.getByTestId(side).getByRole("heading", { name: title })).toBeVisible();
|
||||
}
|
||||
|
||||
@@ -1,28 +1,30 @@
|
||||
import { readFile } from "node:fs/promises";
|
||||
import { createSampleResumeFromDashboard, openSidebarSection } from "../fixtures/resume";
|
||||
import { expect, test } from "../fixtures/test";
|
||||
|
||||
test("exports and imports a resume JSON backup", async ({ authPage: page }, testInfo) => {
|
||||
const resumeName = await createSampleResumeFromDashboard(page, testInfo);
|
||||
await createSampleResumeFromDashboard(page, testInfo);
|
||||
|
||||
await openSidebarSection(page, "Export");
|
||||
await openSidebarSection(page, "Export", "right");
|
||||
|
||||
const downloadPromise = page.waitForEvent("download");
|
||||
await page.getByRole("button", { name: /^JSON/ }).click();
|
||||
const download = await downloadPromise;
|
||||
expect(download.suggestedFilename()).toMatch(/\.json$/);
|
||||
|
||||
const downloadPath = await download.path();
|
||||
if (!downloadPath) throw new Error("Expected Playwright to provide a downloaded JSON path.");
|
||||
const downloadPath = testInfo.outputPath(download.suggestedFilename());
|
||||
await download.saveAs(downloadPath);
|
||||
const exportedData = JSON.parse(await readFile(downloadPath, "utf-8")) as { basics: { name: string } };
|
||||
|
||||
await page.goto("/dashboard/resumes");
|
||||
await page.getByText("Import an existing resume").click();
|
||||
await page.getByRole("combobox").click();
|
||||
const dialog = page.getByRole("dialog", { name: "Import an existing resume" });
|
||||
await dialog.getByRole("combobox").click();
|
||||
await page.getByRole("option", { name: "Reactive Resume (JSON)" }).click();
|
||||
await page.locator('input[type="file"]').setInputFiles(downloadPath);
|
||||
await page.getByRole("button", { name: "Import" }).click();
|
||||
await dialog.locator('input[type="file"]').setInputFiles(downloadPath);
|
||||
await dialog.getByRole("button", { name: "Import", exact: true }).click();
|
||||
|
||||
await page.waitForURL(/\/builder\/.+/);
|
||||
await openSidebarSection(page, "Basics");
|
||||
await expect(page.getByLabel("Name")).toHaveValue(/.+/);
|
||||
await expect(page.getByText(resumeName)).toBeVisible();
|
||||
await expect(page.getByLabel("Name")).toHaveValue(exportedData.basics.name);
|
||||
});
|
||||
|
||||
@@ -3,10 +3,10 @@ import { expect, test } from "../fixtures/test";
|
||||
|
||||
test("publishes a resume and renders it for an anonymous visitor", async ({ browser, authPage: page }, testInfo) => {
|
||||
await createSampleResumeFromDashboard(page, testInfo);
|
||||
await openSidebarSection(page, "Sharing");
|
||||
await openSidebarSection(page, "Sharing", "right");
|
||||
|
||||
await page.getByLabel("Allow Public Access").click();
|
||||
const publicUrl = await page.getByLabel("URL").inputValue();
|
||||
await page.getByRole("switch", { name: /Allow Public Access/ }).click();
|
||||
const publicUrl = await page.locator("#sharing-url").inputValue();
|
||||
expect(publicUrl).toMatch(/\/e2e_/);
|
||||
|
||||
const anonymous = await browser.newPage();
|
||||
|
||||
@@ -6,7 +6,11 @@ test("creates a sample resume and persists a basics edit", async ({ authPage: pa
|
||||
|
||||
const updatedName = `E2E Edited ${Date.now()}`;
|
||||
await openSidebarSection(page, "Basics");
|
||||
const savePromise = page.waitForResponse(
|
||||
(response) => response.url().includes("/api/rpc") && response.request().method() === "POST" && response.ok(),
|
||||
);
|
||||
await page.getByLabel("Name").fill(updatedName);
|
||||
await savePromise;
|
||||
|
||||
await page.reload();
|
||||
await openSidebarSection(page, "Basics");
|
||||
|
||||
Reference in New Issue
Block a user