/** * Hook + provider smoke. Uses react-dom/server to avoid bringing JSDOM * + testing-library into this leaf package. Asserts via the * server-rendered HTML which is enough to prove the context wiring. */ import { describe, expect, it } from "vitest"; import { renderToString } from "react-dom/server"; import { createElement } from "react"; import { FeatureFlagProvider, useFeatureFlag, useFeatureFlagEnabled, useFeatureFlagVariant } from "./context.js"; function Probe(props: { flag: string }) { const r = useFeatureFlag(props.flag); const en = useFeatureFlagEnabled(props.flag); const variant = useFeatureFlagVariant(props.flag) ?? "none"; return createElement( "div", null, `enabled=${r.enabled} reason=${r.reason} bool=${en} variant=${variant}`, ); } describe("FeatureFlagProvider + useFeatureFlag", () => { it("returns hydrated value when present", () => { const html = renderToString( createElement( FeatureFlagProvider, { flags: { foo: { enabled: true, reason: "matched" } } }, createElement(Probe, { flag: "foo" }), ), ); expect(html).toContain("enabled=true"); expect(html).toContain("reason=matched"); expect(html).toContain("bool=true"); }); it("returns fallback when flag absent", () => { const html = renderToString( createElement( FeatureFlagProvider, { flags: {} }, createElement(Probe, { flag: "missing" }), ), ); expect(html).toContain("enabled=false"); expect(html).toContain("reason=flag-not-found"); }); it("exposes variant key", () => { const html = renderToString( createElement( FeatureFlagProvider, { flags: { ab: { enabled: true, reason: "matched", variant: { key: "treatment", value: 1 } }, }, }, createElement(Probe, { flag: "ab" }), ), ); expect(html).toContain("variant=treatment"); }); it("returns fallback outside of a Provider (default context)", () => { const html = renderToString(createElement(Probe, { flag: "x" })); expect(html).toContain("enabled=false"); expect(html).toContain("reason=flag-not-found"); }); });