ladybird/Tests/LibWeb/Text/input/include.js
Cory Virok 39f844f77c LibWeb/Tests: Added example test for how to use http-test-server.py
The example shows how to write a test that depends on custom HTTP
headers in the response. This will be useful for testing browser JS
that depends on how Ladybird processes response headers, eg CORS
headers like Access-Control-Allow-Origin and others.
2024-11-09 13:08:31 -07:00

128 lines
3.2 KiB
JavaScript

var __outputElement = null;
let __alreadyCalledTest = false;
let __originalURL = null;
function __preventMultipleTestFunctions() {
if (__alreadyCalledTest) {
throw new Error("You must only call test() or asyncTest() once per page");
}
__alreadyCalledTest = true;
}
if (globalThis.internals === undefined) {
internals = {
signalTextTestIsDone: function () {},
spoofCurrentURL: function (url) {},
};
}
function __finishTest() {
if (__originalURL) {
internals.spoofCurrentURL(__originalURL);
}
internals.signalTextTestIsDone(__outputElement.innerText);
}
function spoofCurrentURL(url) {
if (__originalURL === null) {
__originalURL = document.location.href;
}
internals.spoofCurrentURL(url);
}
function println(s) {
__outputElement.appendChild(document.createTextNode(s + "\n"));
}
function printElement(e) {
let element_string = `<${e.nodeName} `;
if (e.id) element_string += `id="${e.id}" `;
element_string += ">";
println(element_string);
}
function animationFrame() {
const { promise, resolve } = Promise.withResolvers();
requestAnimationFrame(resolve);
return promise;
}
function timeout(ms) {
const { promise, resolve } = Promise.withResolvers();
setTimeout(resolve, ms);
return promise;
}
const __testErrorHandlerController = new AbortController();
window.addEventListener(
"error",
event => {
println(`Uncaught Error In Test: ${event.message}`);
__finishTest();
},
{ signal: __testErrorHandlerController.signal }
);
function removeTestErrorHandler() {
__testErrorHandlerController.abort();
}
document.addEventListener("DOMContentLoaded", function () {
__outputElement = document.createElement("pre");
__outputElement.setAttribute("id", "out");
document.body.appendChild(__outputElement);
});
function test(f) {
__preventMultipleTestFunctions();
document.addEventListener("DOMContentLoaded", f);
window.addEventListener("load", () => {
__finishTest();
});
}
function asyncTest(f) {
const done = () => {
__preventMultipleTestFunctions();
__finishTest();
};
document.addEventListener("DOMContentLoaded", () => {
f(done);
});
}
function promiseTest(f) {
document.addEventListener("DOMContentLoaded", () => {
f().then(() => {
__preventMultipleTestFunctions();
__finishTest();
});
});
}
class HTTPTestServer {
constructor(baseURL) {
this.baseURL = baseURL;
}
async createEcho(method, path, options) {
const result = await fetch(`${this.baseURL}/create`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ ...options, method, path }),
});
if (!result.ok) {
throw new Error("Error creating echo: " + result.statusText);
}
return `${this.baseURL}${path}`;
}
getStaticURL(path) {
return `${this.baseURL}/static/${path}`;
}
}
// FIXME: Get the port from internals
const __httpTestServer = new HTTPTestServer("http://localhost:8123");
function httpTestServer() {
return __httpTestServer;
}