mirror of
https://github.com/zhom/donutbrowser.git
synced 2026-10-21 14:51:49 +02:00
style: more consistent style across pages
This commit is contained in:
1 parent
b61e582e24
commit
ffd762bdae
31 files changed
+3001
-884
No files matched your search
@@ -0,0 +1,154 @@
|
||||
import assert from "node:assert/strict";
|
||||
import { readFileSync } from "node:fs";
|
||||
import test from "node:test";
|
||||
import {
|
||||
curlSnippet,
|
||||
javascriptSnippet,
|
||||
LOCAL_API_EXAMPLES,
|
||||
maskToken,
|
||||
mcpClientConfig,
|
||||
oneLine,
|
||||
PROFILE_ID_PLACEHOLDER,
|
||||
pythonLiteral,
|
||||
pythonSnippet,
|
||||
REMOTE_MCP_EXAMPLES,
|
||||
REQUEST_LANGUAGES,
|
||||
requestSnippet,
|
||||
} from "./api-examples.ts";
|
||||
|
||||
const target = { baseUrl: "http://127.0.0.1:10108", token: "tok" };
|
||||
const AsyncFunction = (async () => {}).constructor;
|
||||
|
||||
test("curl puts the method, the bearer and the body on their own lines", () => {
|
||||
assert.equal(
|
||||
curlSnippet({ method: "GET", path: "/v1/profiles" }, target),
|
||||
'curl http://127.0.0.1:10108/v1/profiles \\\n -H "Authorization: Bearer tok"',
|
||||
);
|
||||
assert.equal(
|
||||
curlSnippet(
|
||||
{ method: "POST", path: "/v1/x", body: { note: "it's" } },
|
||||
target,
|
||||
),
|
||||
[
|
||||
"curl -X POST http://127.0.0.1:10108/v1/x \\",
|
||||
' -H "Authorization: Bearer tok" \\',
|
||||
' -H "Content-Type: application/json" \\',
|
||||
` -d '{"note":"it'\\''s"}'`,
|
||||
].join("\n"),
|
||||
);
|
||||
assert.equal(
|
||||
curlSnippet({ method: "GET", path: "/openapi.json", auth: false }, target),
|
||||
"curl http://127.0.0.1:10108/openapi.json",
|
||||
);
|
||||
});
|
||||
|
||||
test("the JavaScript form is valid code and keeps the body's values", () => {
|
||||
for (const example of [...LOCAL_API_EXAMPLES, ...REMOTE_MCP_EXAMPLES]) {
|
||||
const code = javascriptSnippet(example.request, target);
|
||||
assert.doesNotThrow(() => new AsyncFunction(code), example.id);
|
||||
}
|
||||
const code = javascriptSnippet(
|
||||
{
|
||||
method: "POST",
|
||||
path: "/v1/x",
|
||||
body: { plain: 1, "needs-quotes": [true, null] },
|
||||
},
|
||||
target,
|
||||
);
|
||||
assert.match(code, /\bplain: 1,/);
|
||||
assert.match(code, /"needs-quotes": \[/);
|
||||
assert.equal(
|
||||
javascriptSnippet({ method: "GET", path: "/o", auth: false }, target),
|
||||
'const response = await fetch("http://127.0.0.1:10108/o");\nconsole.log(await response.json());',
|
||||
);
|
||||
assert.match(
|
||||
javascriptSnippet(
|
||||
{ method: "POST", path: "/k", returnsJson: false },
|
||||
target,
|
||||
),
|
||||
/console\.log\(response\.status\);$/,
|
||||
);
|
||||
});
|
||||
|
||||
test("Python literals use Python's constants", () => {
|
||||
assert.equal(pythonLiteral(true), "True");
|
||||
assert.equal(pythonLiteral(false), "False");
|
||||
assert.equal(pythonLiteral(null), "None");
|
||||
assert.equal(
|
||||
pythonLiteral({ a: [1, false], b: {} }),
|
||||
'{\n "a": [\n 1,\n False,\n ],\n "b": {},\n}',
|
||||
);
|
||||
const code = pythonSnippet(
|
||||
{ method: "PUT", path: "/v1/y", body: { on: true }, returnsJson: false },
|
||||
target,
|
||||
);
|
||||
assert.match(code, /^import requests\n\nresponse = requests\.put\(/);
|
||||
assert.match(code, /json=\{\n {8}"on": True,\n {4}\},/);
|
||||
assert.match(code, /print\(response\.status_code\)$/);
|
||||
});
|
||||
|
||||
test("every request language renders every example", () => {
|
||||
assert.deepEqual(REQUEST_LANGUAGES, ["curl", "javascript", "python"]);
|
||||
for (const language of REQUEST_LANGUAGES) {
|
||||
for (const example of LOCAL_API_EXAMPLES) {
|
||||
const code = requestSnippet(language, example.request, target);
|
||||
assert.ok(code.includes(target.baseUrl), `${language} ${example.id}`);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
test("a one-line command is the same command", () => {
|
||||
const spec = LOCAL_API_EXAMPLES.find((e) => e.id === "runProfile").request;
|
||||
assert.equal(
|
||||
oneLine(curlSnippet(spec, target)),
|
||||
`curl -X POST http://127.0.0.1:10108/v1/profiles/PROFILE_ID/run -H "Authorization: Bearer tok" -H "Content-Type: application/json" -d '{"url":"https://example.com","headless":false}'`,
|
||||
);
|
||||
assert.equal(oneLine("echo 'a \\ b'"), "echo 'a \\ b'");
|
||||
});
|
||||
|
||||
test("the curl body round-trips to the request body", () => {
|
||||
for (const example of LOCAL_API_EXAMPLES.filter((e) => e.request.body)) {
|
||||
const code = curlSnippet(example.request, target);
|
||||
const body = code.match(/-d '(.*)'$/)[1];
|
||||
assert.deepEqual(JSON.parse(body), example.request.body, example.id);
|
||||
}
|
||||
});
|
||||
|
||||
test("local examples only call routes the app publishes", () => {
|
||||
const published = new Set(
|
||||
JSON.parse(
|
||||
readFileSync(new URL("../../sdk/api-paths.json", import.meta.url)),
|
||||
).operations.map((operation) => `${operation.method} ${operation.path}`),
|
||||
);
|
||||
for (const example of LOCAL_API_EXAMPLES) {
|
||||
const { method, path, auth } = example.request;
|
||||
if (auth === false) {
|
||||
assert.equal(path, "/openapi.json", example.id);
|
||||
continue;
|
||||
}
|
||||
const route = `${method} ${path.replace(PROFILE_ID_PLACEHOLDER, "{id}")}`;
|
||||
assert.ok(published.has(route), `${example.id}: ${route}`);
|
||||
}
|
||||
});
|
||||
|
||||
test("only the automation routes are marked paid", () => {
|
||||
assert.deepEqual(
|
||||
LOCAL_API_EXAMPLES.filter((example) => example.paid).map((e) => e.id),
|
||||
["runProfile", "openUrl", "killProfile"],
|
||||
);
|
||||
});
|
||||
|
||||
test("a token is shown by its ends, never whole", () => {
|
||||
assert.equal(maskToken(null), "TOKEN");
|
||||
assert.equal(maskToken("short"), "••••••••");
|
||||
assert.equal(maskToken("abcd0123456789wxyz"), "abcd…wxyz");
|
||||
});
|
||||
|
||||
test("the client config names the server and carries the bearer", () => {
|
||||
const config = JSON.parse(mcpClientConfig("https://h/api/mcp", "k…"));
|
||||
assert.deepEqual(config.mcpServers["donut-browser"], {
|
||||
type: "http",
|
||||
url: "https://h/api/mcp",
|
||||
headers: { Authorization: "Bearer k…" },
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user