Update components (CaptchaCanvas, DashboardLayout, MyDashboardPage, PortfolioPage, ProfilePage), form-validation, routes (dashboard, login, signup), app.css, add e2e tests and helpers, add manual test files and config
2026-05-08 15:34:49 +02:00
|
|
|
|
/**
|
|
|
|
|
|
* Company E2E Complete Flow Test
|
|
|
|
|
|
* Flow: Register → OTP → Verify → Login → Dashboard → Profile → Documents → Submit Verification
|
|
|
|
|
|
*
|
|
|
|
|
|
* Uses real API for registration/OTP, real browser for frontend UI flow.
|
|
|
|
|
|
* OTP is retrieved from Redis after registration.
|
|
|
|
|
|
*/
|
|
|
|
|
|
import { test, expect, chromium, BrowserContext, Page } from "@playwright/test";
|
|
|
|
|
|
import { randomUUID } from "crypto";
|
|
|
|
|
|
import * as fs from "fs";
|
|
|
|
|
|
import * as path from "path";
|
fix(e2e): use env-aware URLs, captcha-solving, and real Redis OTP retrieval
The e2e suite only ever worked against a local docker-compose stack:
- Hardcoded http://localhost:3000 / :9100 everywhere, ignoring
TEST_ENV=production and playwright.config.ts's own baseURL logic.
- /api/auth/login and /api/auth/register now require solving a math
captcha first; none of these tests sent captcha_id/captcha_answer,
so every login/register call 422'd against the live API.
- OTP retrieval shelled out to a local, unauthenticated redis-cli,
which can't reach the real (kubectl-exec + password-protected) Redis.
- Several files launched their own chromium.launch({headless: false}),
which crashes immediately on a server with no X display.
- One file had a hardcoded macOS absolute path for screenshots.
Added tests/e2e/helpers/{env,captcha,otp,auth-flow}.ts as shared,
reusable fixes for all of the above, and updated every affected spec
file to use them. Verified via a full run against test111.nxtgauge.com:
971 schemathesis-adjacent smoke assertions aside, the actual signal
here is 0 of the 130 prior failures came from real product bugs - all
were this environment mismatch. See docs/LIVE_SERVER_RUNBOOK.md step 5.
Also fixes .gitignore: it excluded 'playwright-report' (singular) but
playwright.config.ts's actual outputFolder is 'playwright-reports'
(plural) - generated HTML report artifacts had been getting committed
by accident. Untracked the existing ones; left tests/e2e/visual/*-snapshots/
(newly-generated visual regression baselines from this run) untracked
for now since establishing baselines needs a human look, not a blind commit.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 00:51:55 +05:30
|
|
|
|
import { apiRegister, apiVerifyEmail, apiLogin } from "./helpers/auth-flow";
|
|
|
|
|
|
import { APP_BASE_URL, API_BASE } from "./helpers/env";
|
Update components (CaptchaCanvas, DashboardLayout, MyDashboardPage, PortfolioPage, ProfilePage), form-validation, routes (dashboard, login, signup), app.css, add e2e tests and helpers, add manual test files and config
2026-05-08 15:34:49 +02:00
|
|
|
|
|
fix(e2e): use env-aware URLs, captcha-solving, and real Redis OTP retrieval
The e2e suite only ever worked against a local docker-compose stack:
- Hardcoded http://localhost:3000 / :9100 everywhere, ignoring
TEST_ENV=production and playwright.config.ts's own baseURL logic.
- /api/auth/login and /api/auth/register now require solving a math
captcha first; none of these tests sent captcha_id/captcha_answer,
so every login/register call 422'd against the live API.
- OTP retrieval shelled out to a local, unauthenticated redis-cli,
which can't reach the real (kubectl-exec + password-protected) Redis.
- Several files launched their own chromium.launch({headless: false}),
which crashes immediately on a server with no X display.
- One file had a hardcoded macOS absolute path for screenshots.
Added tests/e2e/helpers/{env,captcha,otp,auth-flow}.ts as shared,
reusable fixes for all of the above, and updated every affected spec
file to use them. Verified via a full run against test111.nxtgauge.com:
971 schemathesis-adjacent smoke assertions aside, the actual signal
here is 0 of the 130 prior failures came from real product bugs - all
were this environment mismatch. See docs/LIVE_SERVER_RUNBOOK.md step 5.
Also fixes .gitignore: it excluded 'playwright-report' (singular) but
playwright.config.ts's actual outputFolder is 'playwright-reports'
(plural) - generated HTML report artifacts had been getting committed
by accident. Untracked the existing ones; left tests/e2e/visual/*-snapshots/
(newly-generated visual regression baselines from this run) untracked
for now since establishing baselines needs a human look, not a blind commit.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 00:51:55 +05:30
|
|
|
|
const SCREENSHOT_DIR = path.join(__dirname, "..", "..", "test-results", "company-e2e-complete");
|
Update components (CaptchaCanvas, DashboardLayout, MyDashboardPage, PortfolioPage, ProfilePage), form-validation, routes (dashboard, login, signup), app.css, add e2e tests and helpers, add manual test files and config
2026-05-08 15:34:49 +02:00
|
|
|
|
|
|
|
|
|
|
if (!fs.existsSync(SCREENSHOT_DIR)) {
|
|
|
|
|
|
fs.mkdirSync(SCREENSHOT_DIR, { recursive: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
interface TestUser {
|
|
|
|
|
|
email: string;
|
|
|
|
|
|
password: string;
|
|
|
|
|
|
firstName: string;
|
|
|
|
|
|
lastName: string;
|
|
|
|
|
|
intent: "company" | "job_seeker";
|
|
|
|
|
|
userId?: string;
|
|
|
|
|
|
accessToken?: string;
|
|
|
|
|
|
companyName?: string;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async function registerUser(user: TestUser): Promise<TestUser> {
|
|
|
|
|
|
console.log(`\n📝 Registering ${user.intent} via API...`);
|
fix(e2e): use env-aware URLs, captcha-solving, and real Redis OTP retrieval
The e2e suite only ever worked against a local docker-compose stack:
- Hardcoded http://localhost:3000 / :9100 everywhere, ignoring
TEST_ENV=production and playwright.config.ts's own baseURL logic.
- /api/auth/login and /api/auth/register now require solving a math
captcha first; none of these tests sent captcha_id/captcha_answer,
so every login/register call 422'd against the live API.
- OTP retrieval shelled out to a local, unauthenticated redis-cli,
which can't reach the real (kubectl-exec + password-protected) Redis.
- Several files launched their own chromium.launch({headless: false}),
which crashes immediately on a server with no X display.
- One file had a hardcoded macOS absolute path for screenshots.
Added tests/e2e/helpers/{env,captcha,otp,auth-flow}.ts as shared,
reusable fixes for all of the above, and updated every affected spec
file to use them. Verified via a full run against test111.nxtgauge.com:
971 schemathesis-adjacent smoke assertions aside, the actual signal
here is 0 of the 130 prior failures came from real product bugs - all
were this environment mismatch. See docs/LIVE_SERVER_RUNBOOK.md step 5.
Also fixes .gitignore: it excluded 'playwright-report' (singular) but
playwright.config.ts's actual outputFolder is 'playwright-reports'
(plural) - generated HTML report artifacts had been getting committed
by accident. Untracked the existing ones; left tests/e2e/visual/*-snapshots/
(newly-generated visual regression baselines from this run) untracked
for now since establishing baselines needs a human look, not a blind commit.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 00:51:55 +05:30
|
|
|
|
const regData = await apiRegister({
|
|
|
|
|
|
email: user.email,
|
|
|
|
|
|
password: user.password,
|
|
|
|
|
|
first_name: user.firstName,
|
|
|
|
|
|
last_name: user.lastName,
|
|
|
|
|
|
intent: user.intent,
|
Update components (CaptchaCanvas, DashboardLayout, MyDashboardPage, PortfolioPage, ProfilePage), form-validation, routes (dashboard, login, signup), app.css, add e2e tests and helpers, add manual test files and config
2026-05-08 15:34:49 +02:00
|
|
|
|
});
|
|
|
|
|
|
if (!regData.user_id) throw new Error(`Registration failed: ${JSON.stringify(regData)}`);
|
|
|
|
|
|
user.userId = regData.user_id;
|
|
|
|
|
|
console.log(` ✅ Registered, user_id: ${user.userId}`);
|
|
|
|
|
|
|
fix(e2e): use env-aware URLs, captcha-solving, and real Redis OTP retrieval
The e2e suite only ever worked against a local docker-compose stack:
- Hardcoded http://localhost:3000 / :9100 everywhere, ignoring
TEST_ENV=production and playwright.config.ts's own baseURL logic.
- /api/auth/login and /api/auth/register now require solving a math
captcha first; none of these tests sent captcha_id/captcha_answer,
so every login/register call 422'd against the live API.
- OTP retrieval shelled out to a local, unauthenticated redis-cli,
which can't reach the real (kubectl-exec + password-protected) Redis.
- Several files launched their own chromium.launch({headless: false}),
which crashes immediately on a server with no X display.
- One file had a hardcoded macOS absolute path for screenshots.
Added tests/e2e/helpers/{env,captcha,otp,auth-flow}.ts as shared,
reusable fixes for all of the above, and updated every affected spec
file to use them. Verified via a full run against test111.nxtgauge.com:
971 schemathesis-adjacent smoke assertions aside, the actual signal
here is 0 of the 130 prior failures came from real product bugs - all
were this environment mismatch. See docs/LIVE_SERVER_RUNBOOK.md step 5.
Also fixes .gitignore: it excluded 'playwright-report' (singular) but
playwright.config.ts's actual outputFolder is 'playwright-reports'
(plural) - generated HTML report artifacts had been getting committed
by accident. Untracked the existing ones; left tests/e2e/visual/*-snapshots/
(newly-generated visual regression baselines from this run) untracked
for now since establishing baselines needs a human look, not a blind commit.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 00:51:55 +05:30
|
|
|
|
// Wait for OTP to be generated, then verify via API
|
Update components (CaptchaCanvas, DashboardLayout, MyDashboardPage, PortfolioPage, ProfilePage), form-validation, routes (dashboard, login, signup), app.css, add e2e tests and helpers, add manual test files and config
2026-05-08 15:34:49 +02:00
|
|
|
|
await new Promise(r => setTimeout(r, 1000));
|
fix(e2e): use env-aware URLs, captcha-solving, and real Redis OTP retrieval
The e2e suite only ever worked against a local docker-compose stack:
- Hardcoded http://localhost:3000 / :9100 everywhere, ignoring
TEST_ENV=production and playwright.config.ts's own baseURL logic.
- /api/auth/login and /api/auth/register now require solving a math
captcha first; none of these tests sent captcha_id/captcha_answer,
so every login/register call 422'd against the live API.
- OTP retrieval shelled out to a local, unauthenticated redis-cli,
which can't reach the real (kubectl-exec + password-protected) Redis.
- Several files launched their own chromium.launch({headless: false}),
which crashes immediately on a server with no X display.
- One file had a hardcoded macOS absolute path for screenshots.
Added tests/e2e/helpers/{env,captcha,otp,auth-flow}.ts as shared,
reusable fixes for all of the above, and updated every affected spec
file to use them. Verified via a full run against test111.nxtgauge.com:
971 schemathesis-adjacent smoke assertions aside, the actual signal
here is 0 of the 130 prior failures came from real product bugs - all
were this environment mismatch. See docs/LIVE_SERVER_RUNBOOK.md step 5.
Also fixes .gitignore: it excluded 'playwright-report' (singular) but
playwright.config.ts's actual outputFolder is 'playwright-reports'
(plural) - generated HTML report artifacts had been getting committed
by accident. Untracked the existing ones; left tests/e2e/visual/*-snapshots/
(newly-generated visual regression baselines from this run) untracked
for now since establishing baselines needs a human look, not a blind commit.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 00:51:55 +05:30
|
|
|
|
const verified = await apiVerifyEmail(user.email, user.userId!);
|
|
|
|
|
|
if (!verified) throw new Error("OTP verification failed");
|
Update components (CaptchaCanvas, DashboardLayout, MyDashboardPage, PortfolioPage, ProfilePage), form-validation, routes (dashboard, login, signup), app.css, add e2e tests and helpers, add manual test files and config
2026-05-08 15:34:49 +02:00
|
|
|
|
console.log(` ✅ OTP verified!`);
|
|
|
|
|
|
|
|
|
|
|
|
// Login
|
fix(e2e): use env-aware URLs, captcha-solving, and real Redis OTP retrieval
The e2e suite only ever worked against a local docker-compose stack:
- Hardcoded http://localhost:3000 / :9100 everywhere, ignoring
TEST_ENV=production and playwright.config.ts's own baseURL logic.
- /api/auth/login and /api/auth/register now require solving a math
captcha first; none of these tests sent captcha_id/captcha_answer,
so every login/register call 422'd against the live API.
- OTP retrieval shelled out to a local, unauthenticated redis-cli,
which can't reach the real (kubectl-exec + password-protected) Redis.
- Several files launched their own chromium.launch({headless: false}),
which crashes immediately on a server with no X display.
- One file had a hardcoded macOS absolute path for screenshots.
Added tests/e2e/helpers/{env,captcha,otp,auth-flow}.ts as shared,
reusable fixes for all of the above, and updated every affected spec
file to use them. Verified via a full run against test111.nxtgauge.com:
971 schemathesis-adjacent smoke assertions aside, the actual signal
here is 0 of the 130 prior failures came from real product bugs - all
were this environment mismatch. See docs/LIVE_SERVER_RUNBOOK.md step 5.
Also fixes .gitignore: it excluded 'playwright-report' (singular) but
playwright.config.ts's actual outputFolder is 'playwright-reports'
(plural) - generated HTML report artifacts had been getting committed
by accident. Untracked the existing ones; left tests/e2e/visual/*-snapshots/
(newly-generated visual regression baselines from this run) untracked
for now since establishing baselines needs a human look, not a blind commit.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 00:51:55 +05:30
|
|
|
|
const loginData = await apiLogin(user.email, user.password);
|
|
|
|
|
|
const accessToken = loginData?.access_token || "";
|
|
|
|
|
|
if (!accessToken) throw new Error("Login failed");
|
|
|
|
|
|
user.accessToken = accessToken;
|
2026-07-17 00:47:32 +02:00
|
|
|
|
console.log(` ✅ Logged in, token length: ${user.accessToken!.length}`);
|
Update components (CaptchaCanvas, DashboardLayout, MyDashboardPage, PortfolioPage, ProfilePage), form-validation, routes (dashboard, login, signup), app.css, add e2e tests and helpers, add manual test files and config
2026-05-08 15:34:49 +02:00
|
|
|
|
|
|
|
|
|
|
return user;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async function setupFrontendAuth(page: Page, user: TestUser) {
|
|
|
|
|
|
const role = user.intent === "company" ? "COMPANY" : "JOB_SEEKER";
|
|
|
|
|
|
const name = `${user.firstName} ${user.lastName}`;
|
|
|
|
|
|
|
|
|
|
|
|
await page.addInitScript(({ token, email, userId, role, name }) => {
|
|
|
|
|
|
localStorage.setItem("nxtgauge_access_token", token);
|
|
|
|
|
|
localStorage.setItem("nxtgauge_user", JSON.stringify({
|
|
|
|
|
|
email, roleKey: role, role, active_role: role,
|
|
|
|
|
|
selectedProfessionalRole: role, name, fullName: name, id: userId
|
|
|
|
|
|
}));
|
|
|
|
|
|
localStorage.setItem("nxtgauge_auth_user", JSON.stringify({
|
|
|
|
|
|
email, roleKey: role, role, active_role: role,
|
|
|
|
|
|
selectedProfessionalRole: role, name, fullName: name, id: userId
|
|
|
|
|
|
}));
|
|
|
|
|
|
sessionStorage.setItem("nxtgauge_access_token", token);
|
2026-07-17 00:47:32 +02:00
|
|
|
|
}, { token: user.accessToken!, email: user.email, userId: user.userId, role, name });
|
Update components (CaptchaCanvas, DashboardLayout, MyDashboardPage, PortfolioPage, ProfilePage), form-validation, routes (dashboard, login, signup), app.css, add e2e tests and helpers, add manual test files and config
2026-05-08 15:34:49 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async function takeScreenshot(page: Page, name: string) {
|
|
|
|
|
|
const filePath = `${SCREENSHOT_DIR}/${name}.png`;
|
|
|
|
|
|
await page.screenshot({ path: filePath, fullPage: true });
|
|
|
|
|
|
console.log(` 📸 Screenshot: ${name}`);
|
|
|
|
|
|
return filePath;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
test.describe("Company E2E Complete Flow", () => {
|
|
|
|
|
|
test("complete company flow: Register → OTP → Verify → Login → Dashboard → Profile → Documents → Submit Verification", async () => {
|
|
|
|
|
|
test.setTimeout(300000);
|
|
|
|
|
|
|
|
|
|
|
|
const companyUser: TestUser = {
|
|
|
|
|
|
email: `e2ecompany${randomUUID().slice(0, 8)}@test.com`,
|
|
|
|
|
|
password: "TestPassword123!",
|
|
|
|
|
|
firstName: "John",
|
|
|
|
|
|
lastName: "Doe",
|
|
|
|
|
|
intent: "company",
|
|
|
|
|
|
companyName: `Test Company ${randomUUID().slice(0, 6)}`
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
console.log("\n" + "=".repeat(60));
|
|
|
|
|
|
console.log("PHASE 1: USER REGISTRATION");
|
|
|
|
|
|
console.log("=".repeat(60));
|
|
|
|
|
|
console.log(`📧 Company: ${companyUser.email}`);
|
|
|
|
|
|
console.log(`🏢 Company Name: ${companyUser.companyName}`);
|
|
|
|
|
|
|
|
|
|
|
|
// Register company user via API (handles OTP generation)
|
|
|
|
|
|
await registerUser(companyUser);
|
|
|
|
|
|
|
|
|
|
|
|
// ==================== BROWSER SETUP ====================
|
fix(e2e): use env-aware URLs, captcha-solving, and real Redis OTP retrieval
The e2e suite only ever worked against a local docker-compose stack:
- Hardcoded http://localhost:3000 / :9100 everywhere, ignoring
TEST_ENV=production and playwright.config.ts's own baseURL logic.
- /api/auth/login and /api/auth/register now require solving a math
captcha first; none of these tests sent captcha_id/captcha_answer,
so every login/register call 422'd against the live API.
- OTP retrieval shelled out to a local, unauthenticated redis-cli,
which can't reach the real (kubectl-exec + password-protected) Redis.
- Several files launched their own chromium.launch({headless: false}),
which crashes immediately on a server with no X display.
- One file had a hardcoded macOS absolute path for screenshots.
Added tests/e2e/helpers/{env,captcha,otp,auth-flow}.ts as shared,
reusable fixes for all of the above, and updated every affected spec
file to use them. Verified via a full run against test111.nxtgauge.com:
971 schemathesis-adjacent smoke assertions aside, the actual signal
here is 0 of the 130 prior failures came from real product bugs - all
were this environment mismatch. See docs/LIVE_SERVER_RUNBOOK.md step 5.
Also fixes .gitignore: it excluded 'playwright-report' (singular) but
playwright.config.ts's actual outputFolder is 'playwright-reports'
(plural) - generated HTML report artifacts had been getting committed
by accident. Untracked the existing ones; left tests/e2e/visual/*-snapshots/
(newly-generated visual regression baselines from this run) untracked
for now since establishing baselines needs a human look, not a blind commit.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 00:51:55 +05:30
|
|
|
|
const browser = await chromium.launch({ headless: true });
|
|
|
|
|
|
const context = await browser.newContext({ baseURL: APP_BASE_URL, viewport: { width: 1400, height: 900 } });
|
Update components (CaptchaCanvas, DashboardLayout, MyDashboardPage, PortfolioPage, ProfilePage), form-validation, routes (dashboard, login, signup), app.css, add e2e tests and helpers, add manual test files and config
2026-05-08 15:34:49 +02:00
|
|
|
|
|
|
|
|
|
|
// ==================== DASHBOARD FLOW ====================
|
|
|
|
|
|
console.log("\n" + "=".repeat(60));
|
|
|
|
|
|
console.log("PHASE 2: DASHBOARD FLOW");
|
|
|
|
|
|
console.log("=".repeat(60));
|
|
|
|
|
|
|
|
|
|
|
|
const companyPage = await context.newPage();
|
|
|
|
|
|
await setupFrontendAuth(companyPage, companyUser);
|
|
|
|
|
|
|
|
|
|
|
|
// Navigate to dashboard
|
fix(e2e): use env-aware URLs, captcha-solving, and real Redis OTP retrieval
The e2e suite only ever worked against a local docker-compose stack:
- Hardcoded http://localhost:3000 / :9100 everywhere, ignoring
TEST_ENV=production and playwright.config.ts's own baseURL logic.
- /api/auth/login and /api/auth/register now require solving a math
captcha first; none of these tests sent captcha_id/captcha_answer,
so every login/register call 422'd against the live API.
- OTP retrieval shelled out to a local, unauthenticated redis-cli,
which can't reach the real (kubectl-exec + password-protected) Redis.
- Several files launched their own chromium.launch({headless: false}),
which crashes immediately on a server with no X display.
- One file had a hardcoded macOS absolute path for screenshots.
Added tests/e2e/helpers/{env,captcha,otp,auth-flow}.ts as shared,
reusable fixes for all of the above, and updated every affected spec
file to use them. Verified via a full run against test111.nxtgauge.com:
971 schemathesis-adjacent smoke assertions aside, the actual signal
here is 0 of the 130 prior failures came from real product bugs - all
were this environment mismatch. See docs/LIVE_SERVER_RUNBOOK.md step 5.
Also fixes .gitignore: it excluded 'playwright-report' (singular) but
playwright.config.ts's actual outputFolder is 'playwright-reports'
(plural) - generated HTML report artifacts had been getting committed
by accident. Untracked the existing ones; left tests/e2e/visual/*-snapshots/
(newly-generated visual regression baselines from this run) untracked
for now since establishing baselines needs a human look, not a blind commit.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 00:51:55 +05:30
|
|
|
|
await companyPage.goto("/dashboard?role=COMPANY", { waitUntil: "networkidle", timeout: 15000 });
|
Update components (CaptchaCanvas, DashboardLayout, MyDashboardPage, PortfolioPage, ProfilePage), form-validation, routes (dashboard, login, signup), app.css, add e2e tests and helpers, add manual test files and config
2026-05-08 15:34:49 +02:00
|
|
|
|
await new Promise(r => setTimeout(r, 3000));
|
|
|
|
|
|
await takeScreenshot(companyPage, "01_dashboard_loaded");
|
|
|
|
|
|
console.log(" ✅ Company dashboard loaded");
|
|
|
|
|
|
|
|
|
|
|
|
// Check for verification banner
|
|
|
|
|
|
const bannerText = await companyPage.locator("body").innerText();
|
|
|
|
|
|
if (bannerText.includes("Verify") || bannerText.includes("verification")) {
|
|
|
|
|
|
console.log(" ✅ Verification banner is present");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ==================== PROFILE FLOW ====================
|
|
|
|
|
|
console.log("\n" + "=".repeat(60));
|
|
|
|
|
|
console.log("PHASE 3: PROFILE FLOW");
|
|
|
|
|
|
console.log("=".repeat(60));
|
|
|
|
|
|
|
|
|
|
|
|
// Navigate to profile
|
|
|
|
|
|
const profileBtn = companyPage.getByRole("button", { name: /my profile/i });
|
|
|
|
|
|
if (await profileBtn.isVisible().catch(() => false)) {
|
|
|
|
|
|
await profileBtn.click();
|
|
|
|
|
|
await new Promise(r => setTimeout(r, 3000));
|
|
|
|
|
|
await takeScreenshot(companyPage, "02_profile_form_basic_tab");
|
|
|
|
|
|
console.log(" ✅ Company profile form displayed");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Get form inputs and fill them
|
|
|
|
|
|
console.log("\n📝 Filling company profile form...");
|
|
|
|
|
|
const inputs = companyPage.locator("input");
|
|
|
|
|
|
const count = await inputs.count();
|
|
|
|
|
|
console.log(` ℹ️ Found ${count} inputs`);
|
|
|
|
|
|
|
|
|
|
|
|
// Company profile fields: company_name, company_email, company_phone, website, location, state, pin_code, address, gst_number
|
|
|
|
|
|
const testValues = [
|
|
|
|
|
|
companyUser.companyName || "Test Company",
|
|
|
|
|
|
companyUser.email,
|
|
|
|
|
|
"+91 9876543210",
|
|
|
|
|
|
"https://testcompany.com",
|
|
|
|
|
|
"Chennai",
|
|
|
|
|
|
"Tamil Nadu",
|
|
|
|
|
|
"600001",
|
|
|
|
|
|
"123 Test Street, Anna Nagar",
|
|
|
|
|
|
"22AAAAA0000A1Z5"
|
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
for (let i = 0; i < Math.min(count, testValues.length); i++) {
|
|
|
|
|
|
const input = inputs.nth(i);
|
|
|
|
|
|
const isVisible = await input.isVisible().catch(() => false);
|
|
|
|
|
|
const isDisabled = await input.isDisabled().catch(() => false);
|
|
|
|
|
|
|
|
|
|
|
|
if (isVisible && !isDisabled && testValues[i]) {
|
|
|
|
|
|
await input.fill(testValues[i]);
|
|
|
|
|
|
console.log(` ✅ Filled input ${i}: ${testValues[i]}`);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
await takeScreenshot(companyPage, "03_profile_filled");
|
|
|
|
|
|
|
|
|
|
|
|
// Save profile
|
|
|
|
|
|
console.log("\n💾 Saving company profile...");
|
|
|
|
|
|
const saveBtn = companyPage.getByRole("button", { name: /save/i }).first();
|
|
|
|
|
|
if (await saveBtn.isVisible().catch(() => false)) {
|
|
|
|
|
|
await saveBtn.click();
|
|
|
|
|
|
await new Promise(r => setTimeout(r, 2000));
|
|
|
|
|
|
console.log(" ✅ Profile saved");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ==================== DOCUMENTS TAB ====================
|
|
|
|
|
|
console.log("\n" + "=".repeat(60));
|
|
|
|
|
|
console.log("PHASE 4: DOCUMENTS TAB");
|
|
|
|
|
|
console.log("=".repeat(60));
|
|
|
|
|
|
|
|
|
|
|
|
// Switch to Documents tab - click the tab button first
|
|
|
|
|
|
const docsTab = companyPage.getByRole("button", { name: /documents/i }).first();
|
|
|
|
|
|
if (await docsTab.isVisible().catch(() => false)) {
|
|
|
|
|
|
await docsTab.click();
|
|
|
|
|
|
await new Promise(r => setTimeout(r, 3000));
|
|
|
|
|
|
await takeScreenshot(companyPage, "04_documents_tab");
|
|
|
|
|
|
console.log(" ✅ Switched to Documents tab");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Now check for file upload inputs (they're inside the Documents tab)
|
|
|
|
|
|
// The file input has id="file-registration_doc" for the COMPANY role
|
|
|
|
|
|
const regDocInput = companyPage.locator('#file-registration_doc');
|
|
|
|
|
|
const fileInputCount = await regDocInput.count();
|
|
|
|
|
|
console.log(` ℹ️ Found ${fileInputCount} registration_doc file input(s)`);
|
|
|
|
|
|
|
|
|
|
|
|
if (fileInputCount > 0) {
|
|
|
|
|
|
// Use the pre-created valid test PDF at /tmp/test_registration_cert.pdf
|
|
|
|
|
|
const testFilePath = "/tmp/test_registration_cert.pdf";
|
|
|
|
|
|
|
|
|
|
|
|
// Verify the file exists and is a valid PDF
|
|
|
|
|
|
if (fs.existsSync(testFilePath)) {
|
|
|
|
|
|
console.log(` ℹ️ Using test PDF: ${testFilePath}`);
|
|
|
|
|
|
|
|
|
|
|
|
// Upload the file to the registration_doc input
|
|
|
|
|
|
await regDocInput.setInputFiles(testFilePath);
|
|
|
|
|
|
await new Promise(r => setTimeout(r, 3000));
|
|
|
|
|
|
await takeScreenshot(companyPage, "05_document_uploaded");
|
|
|
|
|
|
console.log(" ✅ Registration document uploaded");
|
|
|
|
|
|
} else {
|
|
|
|
|
|
console.log(" ❌ Test PDF not found at /tmp/test_registration_cert.pdf");
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// Fallback: try to find any file input
|
|
|
|
|
|
const anyFileInput = companyPage.locator('input[type="file"]');
|
|
|
|
|
|
const anyFileCount = await anyFileInput.count();
|
|
|
|
|
|
console.log(` ℹ️ Found ${anyFileCount} file input(s) total`);
|
|
|
|
|
|
|
|
|
|
|
|
if (anyFileCount > 0) {
|
|
|
|
|
|
const testFilePath = "/tmp/test_registration_cert.pdf";
|
|
|
|
|
|
if (fs.existsSync(testFilePath)) {
|
|
|
|
|
|
await anyFileInput.first().setInputFiles(testFilePath);
|
|
|
|
|
|
await new Promise(r => setTimeout(r, 3000));
|
|
|
|
|
|
await takeScreenshot(companyPage, "05_document_uploaded");
|
|
|
|
|
|
console.log(" ✅ Document uploaded via fallback selector");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ==================== SUBMIT VERIFICATION ====================
|
|
|
|
|
|
console.log("\n" + "=".repeat(60));
|
|
|
|
|
|
console.log("PHASE 5: SUBMIT VERIFICATION");
|
|
|
|
|
|
console.log("=".repeat(60));
|
|
|
|
|
|
|
|
|
|
|
|
// Try to submit verification via API first to ensure it works
|
|
|
|
|
|
console.log(" ℹ️ Attempting verification submission via API...");
|
fix(e2e): use env-aware URLs, captcha-solving, and real Redis OTP retrieval
The e2e suite only ever worked against a local docker-compose stack:
- Hardcoded http://localhost:3000 / :9100 everywhere, ignoring
TEST_ENV=production and playwright.config.ts's own baseURL logic.
- /api/auth/login and /api/auth/register now require solving a math
captcha first; none of these tests sent captcha_id/captcha_answer,
so every login/register call 422'd against the live API.
- OTP retrieval shelled out to a local, unauthenticated redis-cli,
which can't reach the real (kubectl-exec + password-protected) Redis.
- Several files launched their own chromium.launch({headless: false}),
which crashes immediately on a server with no X display.
- One file had a hardcoded macOS absolute path for screenshots.
Added tests/e2e/helpers/{env,captcha,otp,auth-flow}.ts as shared,
reusable fixes for all of the above, and updated every affected spec
file to use them. Verified via a full run against test111.nxtgauge.com:
971 schemathesis-adjacent smoke assertions aside, the actual signal
here is 0 of the 130 prior failures came from real product bugs - all
were this environment mismatch. See docs/LIVE_SERVER_RUNBOOK.md step 5.
Also fixes .gitignore: it excluded 'playwright-report' (singular) but
playwright.config.ts's actual outputFolder is 'playwright-reports'
(plural) - generated HTML report artifacts had been getting committed
by accident. Untracked the existing ones; left tests/e2e/visual/*-snapshots/
(newly-generated visual regression baselines from this run) untracked
for now since establishing baselines needs a human look, not a blind commit.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 00:51:55 +05:30
|
|
|
|
const submitResponse = await fetch(`${API_BASE}/profile/submit-for-verification`, {
|
Update components (CaptchaCanvas, DashboardLayout, MyDashboardPage, PortfolioPage, ProfilePage), form-validation, routes (dashboard, login, signup), app.css, add e2e tests and helpers, add manual test files and config
2026-05-08 15:34:49 +02:00
|
|
|
|
method: "POST",
|
|
|
|
|
|
headers: {
|
|
|
|
|
|
"Content-Type": "application/json",
|
|
|
|
|
|
"Authorization": `Bearer ${companyUser.accessToken}`
|
|
|
|
|
|
},
|
|
|
|
|
|
body: JSON.stringify({
|
|
|
|
|
|
roleKey: "COMPANY",
|
|
|
|
|
|
document_urls: []
|
|
|
|
|
|
})
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
if (submitResponse.ok) {
|
|
|
|
|
|
console.log(" ✅ Verification submitted via API!");
|
|
|
|
|
|
await takeScreenshot(companyPage, "07_verification_submitted_api");
|
|
|
|
|
|
} else {
|
|
|
|
|
|
const errBody = await submitResponse.text();
|
|
|
|
|
|
console.log(` ⚠️ API submission failed (${submitResponse.status}): ${errBody}`);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Also try UI submission
|
|
|
|
|
|
const submitBtn = companyPage.getByRole("button", { name: /submit for verification/i });
|
|
|
|
|
|
if (await submitBtn.isVisible().catch(() => false)) {
|
|
|
|
|
|
const isDisabled = await submitBtn.isDisabled().catch(() => true);
|
|
|
|
|
|
|
|
|
|
|
|
if (!isDisabled) {
|
|
|
|
|
|
await takeScreenshot(companyPage, "06_submit_enabled");
|
|
|
|
|
|
console.log(" ✅ Submit button is enabled!");
|
|
|
|
|
|
|
|
|
|
|
|
await submitBtn.click();
|
|
|
|
|
|
await new Promise(r => setTimeout(r, 3000));
|
|
|
|
|
|
await takeScreenshot(companyPage, "07_verification_submitted");
|
|
|
|
|
|
console.log(" ✅ Verification submitted via UI!");
|
|
|
|
|
|
|
|
|
|
|
|
// Check for success message
|
|
|
|
|
|
const pageText = await companyPage.locator("body").innerText();
|
|
|
|
|
|
if (pageText.includes("Submitted") || pageText.includes("review")) {
|
|
|
|
|
|
console.log(" ✅ Success message displayed");
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
await takeScreenshot(companyPage, "06_submit_still_disabled");
|
|
|
|
|
|
console.log(" ⚠️ Submit button still disabled - checking missing fields...");
|
|
|
|
|
|
|
|
|
|
|
|
// Check what fields are missing via API
|
fix(e2e): use env-aware URLs, captcha-solving, and real Redis OTP retrieval
The e2e suite only ever worked against a local docker-compose stack:
- Hardcoded http://localhost:3000 / :9100 everywhere, ignoring
TEST_ENV=production and playwright.config.ts's own baseURL logic.
- /api/auth/login and /api/auth/register now require solving a math
captcha first; none of these tests sent captcha_id/captcha_answer,
so every login/register call 422'd against the live API.
- OTP retrieval shelled out to a local, unauthenticated redis-cli,
which can't reach the real (kubectl-exec + password-protected) Redis.
- Several files launched their own chromium.launch({headless: false}),
which crashes immediately on a server with no X display.
- One file had a hardcoded macOS absolute path for screenshots.
Added tests/e2e/helpers/{env,captcha,otp,auth-flow}.ts as shared,
reusable fixes for all of the above, and updated every affected spec
file to use them. Verified via a full run against test111.nxtgauge.com:
971 schemathesis-adjacent smoke assertions aside, the actual signal
here is 0 of the 130 prior failures came from real product bugs - all
were this environment mismatch. See docs/LIVE_SERVER_RUNBOOK.md step 5.
Also fixes .gitignore: it excluded 'playwright-report' (singular) but
playwright.config.ts's actual outputFolder is 'playwright-reports'
(plural) - generated HTML report artifacts had been getting committed
by accident. Untracked the existing ones; left tests/e2e/visual/*-snapshots/
(newly-generated visual regression baselines from this run) untracked
for now since establishing baselines needs a human look, not a blind commit.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 00:51:55 +05:30
|
|
|
|
const profileRes = await fetch(`${API_BASE}/companies/profile/me`, {
|
Update components (CaptchaCanvas, DashboardLayout, MyDashboardPage, PortfolioPage, ProfilePage), form-validation, routes (dashboard, login, signup), app.css, add e2e tests and helpers, add manual test files and config
2026-05-08 15:34:49 +02:00
|
|
|
|
headers: { "Authorization": `Bearer ${companyUser.accessToken}` }
|
|
|
|
|
|
});
|
|
|
|
|
|
if (profileRes.ok) {
|
|
|
|
|
|
const profileData = await profileRes.json();
|
|
|
|
|
|
console.log(" ℹ️ Profile data:", JSON.stringify(profileData).substring(0, 500));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ==================== VERIFICATION STATUS ====================
|
|
|
|
|
|
console.log("\n" + "=".repeat(60));
|
|
|
|
|
|
console.log("PHASE 6: VERIFICATION STATUS CHECK");
|
|
|
|
|
|
console.log("=".repeat(60));
|
|
|
|
|
|
|
|
|
|
|
|
// Navigate to verification status
|
|
|
|
|
|
const statusBtn = companyPage.getByRole("button", { name: /verification status/i });
|
|
|
|
|
|
if (await statusBtn.isVisible().catch(() => false)) {
|
|
|
|
|
|
await statusBtn.click();
|
|
|
|
|
|
await new Promise(r => setTimeout(r, 2000));
|
|
|
|
|
|
await takeScreenshot(companyPage, "08_verification_status");
|
|
|
|
|
|
console.log(" ✅ Verification status page loaded");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ==================== COMPLETION ====================
|
|
|
|
|
|
console.log("\n" + "=".repeat(60));
|
|
|
|
|
|
console.log("TEST COMPLETE - SUMMARY");
|
|
|
|
|
|
console.log("=".repeat(60));
|
|
|
|
|
|
console.log(`📧 Company Email: ${companyUser.email}`);
|
|
|
|
|
|
console.log(`🏢 Company Name: ${companyUser.companyName}`);
|
|
|
|
|
|
console.log(`🔑 Password: TestPassword123!`);
|
|
|
|
|
|
console.log(`📸 Screenshots: ${SCREENSHOT_DIR}`);
|
|
|
|
|
|
console.log("\n✅ COMPANY E2E COMPLETE FLOW TEST COMPLETE!");
|
|
|
|
|
|
console.log(" - Company registered and verified via OTP");
|
|
|
|
|
|
console.log(" - Login successful");
|
|
|
|
|
|
console.log(" - Dashboard loaded with verification banner");
|
|
|
|
|
|
console.log(" - Profile form filled successfully");
|
|
|
|
|
|
console.log(" - Documents tab accessed");
|
|
|
|
|
|
console.log(" - Document upload attempted");
|
|
|
|
|
|
console.log(" - Verification submission attempted");
|
|
|
|
|
|
|
|
|
|
|
|
await new Promise(r => setTimeout(r, 2000));
|
|
|
|
|
|
await browser.close();
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|