import { BeforeAll, AfterAll, Before, After, Status, setDefaultTimeout } from "@cucumber/cucumber"; import { Browser, BrowserContext } from "@playwright/test"; import { fixture } from "./pageFixture"; import { invokeBrowser } from "../browser/browserManager"; import { getEnv } from "../helper/env/env"; import { createLogger } from "winston"; import { options } from "../report/logger"; const fs = require("fs-extra"); let browser: Browser; let context: BrowserContext; setDefaultTimeout(60 * 1000 * 3); BeforeAll(async function () { getEnv(); browser = await invokeBrowser(); }); // It will trigger for not auth scenarios Before({ tags: "not @auth" }, async function ({ pickle }) { const scenarioName = pickle.name + pickle.id context = await browser.newContext({ recordVideo: { dir: "test-results/default-report/videos", }, }); await context.tracing.start({ name: scenarioName, title: pickle.name, sources: true, screenshots: true, snapshots: true }); const page = await context.newPage(); fixture.page = page; fixture.logger = createLogger(options(scenarioName)); }); // It will trigger for auth scenarios Before({ tags: '@auth' }, async function ({ pickle }) { const scenarioName = pickle.name + pickle.id context = await browser.newContext({ storageState: getStorageState(pickle.name), recordVideo: { dir: "test-results/videos", }, }); await context.tracing.start({ name: scenarioName, title: pickle.name, sources: true, screenshots: true, snapshots: true }); const page = await context.newPage(); fixture.page = page; fixture.logger = createLogger(options(scenarioName)); }); After(async function ({ pickle, result }) { let videoPath; let img: Buffer | undefined = undefined; const path = `./test-results/default-report/trace/${pickle.id}.zip`; if (result?.status == Status.PASSED) { img = await fixture.page.screenshot( { path: `./test-results/default-report/screenshots/${pickle.name}.png`, type: "png" }) videoPath = await fixture.page.video()?.path(); } await context.tracing.stop({ path: path }); await fixture.page.close(); await context.close(); if (result?.status == Status.PASSED) { if (img){ await this.attach( img, "image/png" );} await this.attach( fs.readFileSync(videoPath), 'video/webm' ); const traceFileLink = `Open ${path}` await this.attach(`Trace file: ${traceFileLink}`, 'text/html'); } }); AfterAll(async function () { //await browser.close(); }) function getStorageState(user: string): string | { cookies: { name: string; value: string; domain: string; path: string; expires: number; httpOnly: boolean; secure: boolean; sameSite: "Strict" | "Lax" | "None"; }[]; origins: { origin: string; localStorage: { name: string; value: string; }[]; }[]; } { if (user.endsWith("admin")) return "src/app/test-data/auth/admin.json"; else if (user.endsWith("lead")) return "src/app/test-data/auth/lead.json"; else return ""; }