@virtualstate/app-history
Version:
Native JavaScript [app-history](https://github.com/WICG/app-history) implementation
142 lines (138 loc) • 6.99 kB
JavaScript
import * as Playwright from "playwright";
import { h, toString } from "@virtualstate/fringe";
import { deferred } from "../util/deferred.js";
import { DependenciesContent } from "./dependencies.js";
import fs from "fs";
import path from "path";
import { getConfig } from "./config.js";
const DEBUG = false;
const browsers = [
["chromium", Playwright.chromium, { eventTarget: "async", esm: true, args: ["--enable-experimental-web-platform-features"], FLAG: "SPEC_BROWSER" }],
["chromium", Playwright.chromium, { eventTarget: "async", esm: true, args: [], FLAG: "" }],
["webkit", Playwright.webkit, { eventTarget: "async", esm: false, args: [], FLAG: "" }],
["firefox", Playwright.firefox, { eventTarget: "async", esm: false, args: [], FLAG: "" }],
["chromium", Playwright.chromium, { eventTarget: "sync", esm: true, args: ["--enable-experimental-web-platform-features"], FLAG: "SPEC_BROWSER" }],
["chromium", Playwright.chromium, { eventTarget: "sync", esm: true, args: [], FLAG: "" }],
["webkit", Playwright.webkit, { eventTarget: "sync", esm: false, args: [], FLAG: "" }],
["firefox", Playwright.firefox, { eventTarget: "sync", esm: false, args: [], FLAG: "" }]
];
// webkit and firefox do not support importmap
for (const [browserName, browserLauncher, { eventTarget, esm, args, FLAG }] of browsers.filter(([, browser]) => browser)) {
if (FLAG && !getConfig().FLAGS?.includes(FLAG)) {
continue;
}
const browser = await browserLauncher.launch({
headless: !DEBUG,
devtools: DEBUG,
args: [
...args
]
});
console.log(`Running playwright tests for ${browserName} ${browser.version()}`);
const context = await browser.newContext({});
const page = await context.newPage();
const namespacePath = "/@virtualstate/app-history/";
const testsSrcPath = `${namespacePath}tests/${esm ? "" : "rollup.js"}`;
const eventTargetSyncPath = `${namespacePath}event-target/sync`;
const eventTargetAsyncPath = `${namespacePath}event-target/async`;
let src = `https://cdn.skypack.dev${testsSrcPath}`;
const pageContent = await toString(h("html", {}, h("head", {}, h("title", {}, "Website"), h("script", { type: "importmap" }, h(DependenciesContent, { imports: {
"deno:std@latest": "https://cdn.skypack.dev/@edwardmx/noop",
"@virtualstate/nop": "https://cdn.skypack.dev/@edwardmx/noop",
"@virtualstate/app-history/event-target": `https://cdn.skypack.dev/@virtualstate/app-history/event-target/${eventTarget}`,
"iterable": "https://cdn.skypack.dev/iterable@6.0.1-beta.5",
"https://cdn.skypack.dev/-/iterable@v5.7.0-CNtyuMJo9f2zFu6CuB1D/dist=es2019,mode=imports/optimized/iterable.js": "https://cdn.skypack.dev/iterable@6.0.1-beta.5",
} }))), h("body", {}, h("script", { type: "module" }, `
if (typeof appHistory !== "undefined") {
console.log("Global AppHistory exists");
} else {
console.log("Global AppHistory does not exist");
}
console.log("Waiting for window to load");
await new Promise(resolve => window.addEventListener("load", resolve));
console.log("Load event fired");
// while (!window.testsComplete) {
// console.log("testsComplete not available, waiting for definition");
// // await new Promise(resolve => setTimeout(resolve, 1000));
// }
// console.log(!!window.testsComplete, !!window.testsFailed);
try {
await import(${JSON.stringify(src)});
await window.testsComplete();
} catch (error) {
console.log(error instanceof Error ? error.message : \`\${error}\`);
console.log(error);
console.log(error.stack);
await window.testsFailed(error instanceof Error ? error.message : \`\${error}\`);
}
`))));
const { resolve, reject, promise } = deferred();
await page.exposeFunction("testsComplete", () => {
console.log(`Playwright tests complete tests for ${browserName} ${browser.version()}`);
return resolve();
});
await page.exposeFunction("testsFailed", (reason) => {
console.log(`Playwright tests failed tests for ${browserName} ${browser.version()}`, reason);
return reject(reason);
});
page.on('console', console.log);
page.on('pageerror', reject);
await page.route('**/*', async (route, request) => {
const { pathname, hostname } = new URL(request.url());
// console.log(await request.headersArray());
if (pathname.startsWith(namespacePath)) {
const { pathname: file } = new URL(import.meta.url);
let importTarget = path.resolve(path.join(path.dirname(file), "..", pathname.replace(namespacePath, "")));
// console.log({ pathname, eventTargetSyncPath, eventTargetAsyncPath })
if (pathname === eventTargetSyncPath) {
importTarget = path.resolve(path.join(importTarget, "../sync-event-target.js"));
}
else if (pathname === eventTargetAsyncPath) {
importTarget = path.resolve(path.join(importTarget, "../async-event-target.js"));
}
else if (!/\.[a-z]+$/.test(importTarget)) {
// console.log({ importTarget });
if (!importTarget.endsWith("/")) {
importTarget += "/";
}
importTarget += "index.js";
}
// console.log({ importTarget });
const contents = await fs.promises.readFile(importTarget, "utf-8");
// console.log({ importTarget, contents: !!contents });
return route.fulfill({
body: contents,
headers: {
"Content-Type": "application/javascript",
"Access-Control-Allow-Origin": "*"
}
});
}
// console.log({ pathname, hostname });
// if (pathname !== "/test-page-entrypoint") return route.continue();
if (hostname !== "example.com")
return route.continue();
if (pathname.includes(".ico"))
return route.fulfill({
status: 200
});
return route.fulfill({
body: pageContent,
headers: {
"Content-Type": "text/html"
}
});
});
await page.goto("https://example.com/test-page-entrypoint", {});
console.log("Navigation started");
await page.waitForLoadState("load");
console.log("Loaded document");
await page.waitForLoadState("networkidle");
console.log("Network idle");
await promise;
console.log("Playwright tests complete");
await page.close();
await browser.close();
}
console.log(`PASS assertAppHistory:playwright:new AppHistory`);
//# sourceMappingURL=app-history.playwright.js.map