mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-06 10:59:59 +00:00
Chromium never treats plaintext .onion origins as a secure context, so keycloak-js (PKCE via crypto.subtle) could not run. A custom Playwright browser fixture launches Firefox with the Tor-Browser prefs (dom.securecontext.allowlist_onions, origin/mixed-content handling) for onion targets and keeps Chromium for clearnet; all dashboard specs share it via the register pattern. keycloak-js is now vendored from the deployment's own CDN as an ES module (jsdelivr is unreachable over Tor) with CORS opened on the CDN proxy. Personas and the oidc-login spec wait for adapter readiness and navbar settle before driving login/logout, which the async code->token exchange needs over Tor latency. Verified: full deploy matrix green (onion 14/14 twice, clearnet pass). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
57 lines
2.3 KiB
JavaScript
57 lines
2.3 KiB
JavaScript
const { test, expect } = require("./fixtures/onion-test");
|
|
|
|
const { normalizeBaseUrl, gotoOnion } = require("./personas");
|
|
|
|
const cdnBaseUrl = normalizeBaseUrl(process.env.CDN_BASE_URL || "");
|
|
const sharedCssPrefix = `${cdnBaseUrl.replace(/\/$/, "")}/_shared/css`;
|
|
|
|
async function getComputedStyleProperty(locator, propertyName) {
|
|
return locator.evaluate(
|
|
(element, requestedProperty) => window.getComputedStyle(element).getPropertyValue(requestedProperty),
|
|
propertyName
|
|
);
|
|
}
|
|
|
|
async function expectDashboardCssEffects(page) {
|
|
const styledCardIcon = page.locator(".card-img-top i").first();
|
|
|
|
if ((await styledCardIcon.count().catch(() => 0)) > 0) {
|
|
const iconFilter = await getComputedStyleProperty(styledCardIcon, "filter");
|
|
expect(iconFilter, "Expected dashboard card icons to receive the role-local drop shadow style").not.toBe("none");
|
|
return;
|
|
}
|
|
|
|
const navbarToggler = page.locator(".navbar-toggler").first();
|
|
|
|
if ((await navbarToggler.count().catch(() => 0)) > 0) {
|
|
const backgroundColor = await getComputedStyleProperty(navbarToggler, "background-color");
|
|
expect(
|
|
backgroundColor,
|
|
"Expected the dashboard navbar toggler to receive the role-local background color override"
|
|
).not.toBe("rgba(0, 0, 0, 0)");
|
|
return;
|
|
}
|
|
|
|
throw new Error("Expected a dashboard element that demonstrates the role-local CSS to be present");
|
|
}
|
|
|
|
exports.register = function (shared) {
|
|
test("dashboard injects shared CSS assets when css service is enabled", async ({ page }) => {
|
|
shared.skipUnlessServiceEnabled("css");
|
|
|
|
const diagnostics = shared.attachDiagnostics(page);
|
|
const documentResponse = await gotoOnion(page, "/");
|
|
expect(documentResponse.status()).toBeLessThan(400);
|
|
|
|
const documentHtml = await documentResponse.text();
|
|
await shared.waitForDashboardReady(page);
|
|
await shared.waitForResourceResponse(diagnostics.responses, "/_shared/css/default.css", "shared default CSS");
|
|
await shared.waitForResourceResponse(diagnostics.responses, "/_shared/css/bootstrap.css", "shared bootstrap CSS");
|
|
|
|
expect(documentHtml).toContain(sharedCssPrefix);
|
|
expect(documentHtml).toContain(`${sharedCssPrefix}/default.css`);
|
|
expect(documentHtml).toContain(`${sharedCssPrefix}/bootstrap.css`);
|
|
await expectDashboardCssEffects(page);
|
|
});
|
|
};
|