test: add i18n smoke test (#858)

* test: add i18n smoke test

Makes sure that all of the languages that Anubis supports show up when
the challenge page is sent to a client.

Signed-off-by: Xe Iaso <me@xeiaso.net>

* test(i18n): build anubis so that the smoke test doesn't backoff timeout

Signed-off-by: Xe Iaso <me@xeiaso.net>

---------

Signed-off-by: Xe Iaso <me@xeiaso.net>
This commit is contained in:
Xe Iaso 2025-07-18 13:30:46 -04:00 committed by GitHub
parent c59b7179c3
commit 36e25ff5f3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 285 additions and 52 deletions

8
test/i18n/anubis.yaml Normal file
View file

@ -0,0 +1,8 @@
bots:
- name: challenge
user_agent_regex: CHALLENGE
action: CHALLENGE
status_codes:
CHALLENGE: 200
DENY: 403

62
test/i18n/test.mjs Normal file
View file

@ -0,0 +1,62 @@
async function fetchLanguages() {
return fetch("http://localhost:8923/.within.website/x/cmd/anubis/static/locales/manifest.json")
.then(resp => {
if (resp.status !== 200) {
throw new Error(`wanted status 200, got status: ${resp.status}`);
}
return resp;
})
.then(resp => resp.json());
}
async function getChallengePage(lang) {
return fetch("http://localhost:8923/reqmeta", {
headers: {
"Accept-Language": lang,
"User-Agent": "CHALLENGE",
}
})
.then(resp => {
if (resp.status !== 200) {
throw new Error(`wanted status 200, got status: ${resp.status}`);
}
return resp;
})
.then(resp => resp.text());
}
(async () => {
const languages = await fetchLanguages();
console.log(languages);
const { supportedLanguages } = languages;
if (supportedLanguages.length === 0) {
throw new Error(`no languages defined`);
}
const resultSheet = {};
let failed = false;
for (const lang of supportedLanguages) {
console.log(`getting for ${lang}`);
const page = await getChallengePage(lang);
resultSheet[lang] = page.includes(`<html lang="${lang}">`)
}
for (const [lang, result] of Object.entries(resultSheet)) {
if (!result) {
failed = true;
console.log(`${lang} did not show up in challenge page`);
}
}
console.log(resultSheet);
if (failed) {
throw new Error("i18n smoke test failed");
}
process.exit(0);
})();

23
test/i18n/test.sh Executable file
View file

@ -0,0 +1,23 @@
#!/usr/bin/env bash
set -euo pipefail
function cleanup() {
pkill -P $$
}
trap cleanup EXIT SIGINT
# Build static assets
(cd ../.. && npm ci && npm run assets)
go tool anubis --help 2>/dev/null ||:
go run ../cmd/unixhttpd &
go tool anubis \
--policy-fname ./anubis.yaml \
--use-remote-address \
--target=unix://$(pwd)/unixhttpd.sock &
go run ../cmd/backoff-retry node ./test.mjs