Files
HiveGrid-Wireframes/hivegrid-cloud/packages/feature-flags/src/client/context.test.tsx
T

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");
});
});