diff --git a/extensions/context.py b/extensions/context.py index dbd2a8b8c..f22430d8e 100644 --- a/extensions/context.py +++ b/extensions/context.py @@ -86,7 +86,7 @@ def hook( # noqa: PLR0915 # yes, this is a lot of statements, but it's all just context["vue_eslint_parser_version"] = "^10.4.0" context["happy_dom_version"] = "^20.9.0" context["node_kiota_bundle_version"] = "1.0.0-preview.100" - context["labsync_nuxt_common_version"] = "^0.1.0" + context["labsync_nuxt_common_version"] = "^0.1.1" context["tanstack_vue_table_version"] = "^8.21.3" context["unplugin_auto_import_version"] = "^21.0.0" diff --git a/template/.gitignore b/template/.gitignore index 1e23fef6d..4cf8f18de 100644 --- a/template/.gitignore +++ b/template/.gitignore @@ -68,6 +68,7 @@ docs/_build tests/**/snapshots/*_actual.png tests/**/snapshots/*_diff.png pytest.log +test-screenshots # test coverage tests/__coverage__ diff --git a/template/frontend/tests/setup/app.ts b/template/frontend/tests/setup/app.ts index 8cf174784..5a6653ca9 100644 --- a/template/frontend/tests/setup/app.ts +++ b/template/frontend/tests/setup/app.ts @@ -1,6 +1,8 @@ +import fs from "node:fs"; +import path from "node:path"; import type { Browser, Page } from "playwright"; import { chromium } from "playwright"; -import { afterAll, beforeAll, beforeEach } from "vitest"; +import { afterAll, beforeAll, beforeEach, onTestFailed } from "vitest"; const isE2E = process.env.USE_DOCKER_COMPOSE_FOR_VITEST_E2E || process.env.USE_BUILT_BACKEND_FOR_VITEST_E2E; let browser: Browser; @@ -10,8 +12,27 @@ if (isE2E) { beforeAll(async () => { browser = await chromium.launch(); // headless by default }, 40 * 1000); // increase timeout to allow application to start - beforeEach(async () => { + beforeEach(async (ctx) => { page = await browser.newPage(); + + page.on("console", (msg) => { + console.log(`[browser:${msg.type()}]`, msg.text()); + }); + page.on("pageerror", (err) => { + console.error("[browser:pageerror]", err.message); + }); + page.on("requestfailed", (req) => { + console.error("[browser:requestfailed]", req.url(), req.failure()?.errorText); + }); + + onTestFailed(async () => { + const screenshotDir = path.resolve("./test-screenshots"); + fs.mkdirSync(screenshotDir, { recursive: true }); + const safeName = ctx.task.name.replace(/[^\w-]/g, "_"); + const screenshotPath = path.join(screenshotDir, `${safeName}.png`); + await page.screenshot({ path: screenshotPath, fullPage: true }); + console.log(`[debug] screenshot saved: ${screenshotPath}`); + }); }); afterAll(async () => { await browser.close();