Files
beacon-web/tests/features/stats/StatsSubHeader.test.tsx
T
n30nex d259be512e feat: observer monitoring, retained evidence and channel scopes (#75-#99)
Lands the stacked web PRs #75, #79, #80, #81, #83, #85, #87, #89, #92, #95 and #99 in one squash. Server counterparts #166-#176 are merged. Remaining review items follow in a fix PR.
2026-09-30 08:03:13 -04:00

55 lines
3.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { afterEach, describe, expect, it, vi } from "vitest";
import { act, fireEvent, render, screen, within } from "@testing-library/react";
import { StatsSubHeader } from "../../../src/features/stats/StatsSubHeader";
import i18n from "../../../src/i18n";
afterEach(() => vi.restoreAllMocks());
describe("translated analytics controls", () => {
it("keeps archived analytics ranges without the legacy Observer destination", async () => {
const props = { onTabChange: vi.fn(), onRangeChange: vi.fn() };
const { rerender } = render(<StatsSubHeader {...props} tab="mesh" range="3d" />);
expect(screen.getByRole("button", { name: "3d" })).toHaveAttribute("aria-pressed", "true");
expect(screen.queryByRole("button", { name: "7d" })).not.toBeInTheDocument();
expect(screen.getByRole("button", { name: "30d" })).toBeInTheDocument();
expect(screen.queryByRole("button", { name: "Observer", exact: true })).not.toBeInTheDocument();
await act(() => i18n.changeLanguage("fr"));
fireEvent.click(screen.getByRole("button", { name: "3 j" }));
expect(props.onRangeChange).toHaveBeenCalledWith("3d");
rerender(<StatsSubHeader {...props} tab="traffic" range="3d" />);
expect(screen.queryByRole("button", { name: "7 j" })).not.toBeInTheDocument();
expect(screen.getByRole("button", { name: "30 j" })).toBeInTheDocument();
});
it("keeps section and range identifiers when labels change", async () => {
const onTabChange = vi.fn(), onRangeChange = vi.fn();
render(<StatsSubHeader tab="signal" range="3d" onTabChange={onTabChange} onRangeChange={onRangeChange} />);
expect(screen.getByRole("button", { name: "3d" })).toHaveAttribute("aria-pressed", "true");
await act(() => i18n.changeLanguage("fr"));
expect(screen.getByRole("group", { name: "Section des statistiques" })).toBeInTheDocument();
const range = screen.getByRole("group", { name: "Période" });
expect(within(range).getByRole("button", { name: "3 j" })).toHaveAttribute("aria-pressed", "true");
expect(onTabChange).not.toHaveBeenCalled();
expect(onRangeChange).not.toHaveBeenCalled();
fireEvent.click(screen.getByRole("button", { name: "Chemins et hachages" }));
expect(onTabChange).toHaveBeenCalledWith("paths");
fireEvent.click(within(range).getByRole("button", { name: "30 j" }));
expect(onRangeChange).toHaveBeenCalledWith("30d");
});
it("uses the same canonical mobile choices and hides ranges for clock drift", async () => {
const media = window.matchMedia("(max-width: 767px)");
vi.spyOn(window, "matchMedia").mockImplementation((query) => ({ ...media, media: query, matches: query === "(max-width: 767px)" }));
await act(() => i18n.changeLanguage("fr"));
const onTabChange = vi.fn(), onRangeChange = vi.fn();
const { rerender } = render(<StatsSubHeader tab="signal" range="24h" onTabChange={onTabChange} onRangeChange={onRangeChange} />);
fireEvent.click(screen.getByRole("button", { name: /Section/ }));
fireEvent.click(screen.getByRole("option", { name: "Dérive d’horloge" }));
expect(onTabChange).toHaveBeenCalledWith("clockdrift");
expect(screen.queryByRole("listbox")).not.toBeInTheDocument();
rerender(<StatsSubHeader tab="clockdrift" range="24h" onTabChange={onTabChange} onRangeChange={onRangeChange} />);
expect(screen.queryByRole("group", { name: "Période" })).not.toBeInTheDocument();
expect(onRangeChange).not.toHaveBeenCalled();
});
});