Source code
Revision control
Copy as Markdown
Other Tools
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
import { renderHook, waitFor } from "@testing-library/react";
import { CLOCK_CITIES } from "content-src/components/Widgets/Clocks/ClockCityRegistry.mjs";
import { useCuratedCityNames } from "content-src/components/Widgets/Clocks/useCuratedCityNames.jsx";
// jsdom has no document.l10n; about:newtab always does. Only Munich resolves
// so tests can cover both the resolved and the unresolved path.
const mockDocumentL10n = () => {
document.l10n = {
formatValues: jest.fn(async ids =>
ids.map(({ id }) =>
id === "newtab-clock-city-de-munich" ? "München" : null
)
),
};
};
describe("useCuratedCityNames", () => {
beforeEach(mockDocumentL10n);
afterEach(() => {
delete document.l10n;
});
it("returns an empty map until l10n resolves", () => {
const { result, unmount } = renderHook(() => useCuratedCityNames());
expect(result.current).toEqual({});
// Unmount before formatValues resolves so the hook's cleanup cancels the
// setState that would otherwise fire outside act().
unmount();
});
it("maps localized names by cityId and skips unresolved ids", async () => {
const { result } = renderHook(() => useCuratedCityNames());
await waitFor(() => expect(result.current["de-munich"]).toBe("München"));
// Only the resolved id is present; null (unresolved) values are skipped.
expect(Object.keys(result.current)).toEqual(["de-munich"]);
// Requested every curated city's Fluent id.
const [[requested]] = document.l10n.formatValues.mock.calls;
expect(requested).toContainEqual({ id: "newtab-clock-city-us-new-york" });
expect(requested.length).toBe(CLOCK_CITIES.length);
});
it("resolves only the requested cityIds when a subset is passed", async () => {
const { result } = renderHook(() => useCuratedCityNames(["de-munich"]));
await waitFor(() => expect(result.current["de-munich"]).toBe("München"));
const [[requested]] = document.l10n.formatValues.mock.calls;
expect(requested).toEqual([{ id: "newtab-clock-city-de-munich" }]);
});
it("does not call l10n for an empty cityIds list", () => {
const { result } = renderHook(() => useCuratedCityNames([]));
expect(result.current).toEqual({});
expect(document.l10n.formatValues).not.toHaveBeenCalled();
});
});