// @vitest-environment jsdom
import { describe, expect, it } from "vitest";
import { render, screen } from "@testing-library/react";
import { FeatureFlagsProvider, useFlag, useVariant } from "./context";
import { FeatureFlagService } from "./service";
import { StaticProvider } from "./static-provider";
function FlagBadge({ flagKey, defaultValue }: { flagKey: string; defaultValue: boolean }) {
const enabled = useFlag(flagKey, defaultValue);
return {enabled ? "ON" : "OFF"};
}
function VariantBadge({ flagKey, defaultValue }: { flagKey: string; defaultValue: string }) {
const variant = useVariant(flagKey, defaultValue);
return {variant};
}
describe("FeatureFlagsProvider + hooks", () => {
it("useFlag returns provider value inside the tree", () => {
const service = new FeatureFlagService(
new StaticProvider({ demo: { default: true } }),
);
render(
,
);
expect(screen.getByTestId("flag").textContent).toBe("ON");
});
it("useFlag falls back to default outside any provider (tests / stories)", () => {
render();
expect(screen.getByTestId("flag").textContent).toBe("ON");
});
it("useFlag respects the EvalContext attached to the provider", () => {
const service = new FeatureFlagService(
new StaticProvider({
internal: { default: false, allow: ["user-internal"] },
}),
);
render(
,
);
expect(screen.getByTestId("flag").textContent).toBe("ON");
});
it("useVariant returns the variant identifier", () => {
const service = new FeatureFlagService(
new StaticProvider({
algo: { default: true, variant: "experiment-v2" },
}),
);
render(
,
);
expect(screen.getByTestId("variant").textContent).toBe("experiment-v2");
});
it("useVariant falls back to default outside any provider", () => {
render();
expect(screen.getByTestId("variant").textContent).toBe("control");
});
});