import { expect, test } from "bun:test"; import { readFile } from "node:fs/promises"; import { join } from "node:path"; const packageRoot = join(import.meta.dir, ".."); test("Captcha browser runtime is valid JavaScript and exposes the expected lifecycle", async () => { const source = await readFile(join(packageRoot, "assets/client/captcha.js"), "utf8"); expect(() => new Function(source)).not.toThrow(); expect(source).toContain("__wrnexusCaptchaRuntime"); expect(source).toContain("createChallenge"); expect(source).toContain("verify(state)"); expect(source).toContain("mountExternal"); expect(source).toContain("captchaDisturbance"); expect(source).toContain("captchaImageStyle"); expect(source).toContain("captchaAllowedStyles"); expect(source).toContain("captchaExcludedStyles"); expect(source).toContain("captchaRandomizeStyle"); expect(source).toContain("captchaResolvedImageStyle"); expect(source).toContain("captchaShowListen"); expect(source).toContain("normalizeSize"); expect(source).toContain("verifyNotRobot"); expect(source).toContain("stopImmediatePropagation"); expect(source).toContain('addEventListener("submit"'); expect(source).toContain("MutationObserver"); expect(source).toContain('new CustomEvent(name'); }); test("Captcha component delegates native browser work to the packaged runtime", async () => { const source = await readFile(join(packageRoot, "components/Captcha.wrn"), "utf8"); expect(source).toContain('src="/assets/wrnexus/captcha.js"'); expect(source).not.toContain('src="/__wrnexus/captcha.js"'); expect(source).toContain("data-wrn-captcha"); expect(source).toContain("data-captcha-response"); expect(source).toContain("data-captcha-disturbance"); expect(source).toContain("data-captcha-image-style"); expect(source).toContain("data-captcha-allowed-styles"); expect(source).toContain("data-captcha-excluded-styles"); expect(source).toContain("data-captcha-randomize-style"); expect(source).toContain("data-captcha-show-listen"); expect(source).toContain("data-captcha-not-robot-button"); expect(source).not.toContain("lifecycle {"); expect(source).not.toContain("async function"); expect(source).not.toContain("await "); expect(source).not.toContain("try {"); expect(source).not.toContain("setTimeout(function"); });