/*
Copyright 2026 Element Creations Ltd.
SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE in the repository root for full details.
*/
import { describe, expect, test } from "vitest";
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { AudioLevelMeter } from "./AudioLevelMeter";
describe("AudioLevelMeter", () => {
test("a denied microphone renders a hint instead of the meter", () => {
render();
expect(screen.getByTestId("mic_level_denied")).toHaveTextContent(
/microphone access is blocked/i,
);
// A hint replaces the meter rather than sitting next to a dead one.
expect(screen.queryByRole("meter")).toBe(null);
});
test("level indicator greys out when the microphone is unavailable", () => {
render();
const meter = screen.getByRole("meter");
expect(meter).toHaveAttribute("data-unavailable", "true");
expect(meter).toHaveAttribute("aria-valuetext", "Microphone unavailable");
});
test("level indicator reports its level to assistive technology", () => {
const { rerender } = render(
,
);
const meter = screen.getByRole("meter");
expect(meter).toHaveAttribute("aria-valuenow", "0");
expect(meter).toHaveAttribute("aria-valuetext", "No sound detected");
rerender();
expect(screen.getByRole("meter")).toHaveAttribute(
"aria-valuetext",
"Picking up sound",
);
});
test("level indicator announces its state only while focused", async () => {
const user = userEvent.setup();
render();
const meter = screen.getByRole("meter");
// Nothing is announced until the user puts the meter in focus, so the
// level does not talk over the rest of the menu.
expect(meter.textContent).not.toContain("Picking up sound");
await user.tab();
expect(meter).toHaveFocus();
expect(meter.textContent).toContain("Picking up sound");
});
});