Files
OmniRoute/tests/unit/v388-phase4-playground.test.ts
diegosouzapw 36c276a6d7 feat(playground): Compare freeze fix, Chat provider/model selects, Build wizard (Phase 4)
- Chat (StudioConfigPane): add Provider + Model selects reusing the translator
  hooks; order Endpoint -> Provider -> Model; ConfigState gains optional provider.
- Compare (CompareTab): add a user-prompt input and include it in the request
  body; throttle per-column stream updates via requestAnimationFrame to stop the
  UI freeze (was setColumns per chunk x N columns with an empty user message).
- Build (BuildTab + build/BuildWizard): redesign as a guided 3-step wizard
  (What to test -> Configure -> Run) reusing ToolsBuilder/StructuredOutputEditor;
  all run/tool-call handlers preserved.
- i18n: playground.build.* (18 keys) in en + pt-BR.
2026-05-30 12:54:58 -03:00

42 lines
2.4 KiB
TypeScript

import test from "node:test";
import assert from "node:assert/strict";
import { readFileSync } from "node:fs";
import { join } from "node:path";
// Regression guards for v3.8.8 Playground screen fixes (Phase 4).
const root = join(import.meta.dirname, "../..");
const read = (p: string) => readFileSync(join(root, p), "utf8");
test("playground config: adds Provider + Model selects reusing translator hooks", () => {
const src = read("src/app/(dashboard)/dashboard/playground/components/StudioConfigPane.tsx");
assert.ok(src.includes("useProviderOptions"), "reuses useProviderOptions");
assert.ok(src.includes("useAvailableModels"), "reuses useAvailableModels");
assert.ok(src.includes('update("provider"'), "writes provider into ConfigState");
assert.ok(src.includes("provider?: string"), "ConfigState gains provider");
});
test("playground compare: prompt input + rAF throttle + user message in request", () => {
const src = read("src/app/(dashboard)/dashboard/playground/components/tabs/CompareTab.tsx");
assert.ok(src.includes("requestAnimationFrame"), "throttles stream updates via rAF");
assert.ok(/role:\s*"user"/.test(src), "request body includes a user message");
assert.ok(src.includes("setPrompt"), "has a prompt input control");
});
test("playground build: wizard with 3 modes reusing editors; BuildTab keeps handlers", () => {
const wiz = read("src/app/(dashboard)/dashboard/playground/components/tabs/build/BuildWizard.tsx");
assert.ok(wiz.includes('"tools"') && wiz.includes('"json"') && wiz.includes('"both"'), "three modes");
assert.ok(wiz.includes("ToolsBuilder") && wiz.includes("StructuredOutputEditor"), "reuses both editors");
const tab = read("src/app/(dashboard)/dashboard/playground/components/tabs/BuildTab.tsx");
assert.ok(tab.includes("<BuildWizard"), "BuildTab mounts BuildWizard");
assert.ok(tab.includes("runRequest") && tab.includes("sendToolResult"), "BuildTab preserves run/tool handlers");
});
test("playground build i18n: playground.build keys present with en/pt parity", () => {
const en = JSON.parse(read("src/i18n/messages/en.json"));
const pt = JSON.parse(read("src/i18n/messages/pt-BR.json"));
const ek = Object.keys(en.playground?.build ?? {});
const pk = Object.keys(pt.playground?.build ?? {});
assert.ok(ek.length >= 10, `expected >=10 build keys, got ${ek.length}`);
assert.deepEqual(ek.sort(), pk.sort(), "en/pt-BR playground.build keys must match");
});