69 lines
2.2 KiB
TypeScript
69 lines
2.2 KiB
TypeScript
/**
|
|
* 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");
|
|
});
|
|
});
|