mirror of
https://github.com/MeshCore-Beacon/beacon-web.git
synced 2026-10-20 22:32:01 +00:00
Bugs: clear compare params on tab change, recover channel live messages after a 429, observer copy link keeps only region params, route table no longer navigates on region change with nothing selected, map borders memo on data identity, live overview can't resurrect a failed query, French relative times, no language write on first visit, 0/0 node locations hidden outside the map, path/signal stats use the shared retry rule. i18n: node/packet/mesh/observer strings that were still hardcoded after #62. Cleanup: formatUtc, ACTION_BUTTON_CLASS, observer-stats, useWindowedStats, observer-id; observer pages use StatCard/Card/Field/Segmented/SearchBar/SelectDropdown; one details chrome on the stats tabs; comment and translations-guide trims; localStorage stub for Node 26 in the test setup.
47 lines
2.1 KiB
TypeScript
47 lines
2.1 KiB
TypeScript
import { describe, expect, it, vi } from "vitest";
|
|
import { renderHook } from "@testing-library/react";
|
|
import { useMapBordersData } from "../../../src/features/map/useMapBordersData";
|
|
import type { IataBorder } from "../../../src/api/client";
|
|
|
|
const state = vi.hoisted(() => ({ data: null as IataBorder | null, updated: 0 }));
|
|
vi.mock("@tanstack/react-query", () => ({ useQueries: () => [{ data: state.data, dataUpdatedAt: state.updated }] }));
|
|
|
|
const border = (lng: number): IataBorder => ({ type: "Feature", properties: {}, geometry: { type: "Polygon", coordinates: [[[lng, 0], [lng + 1, 0], [lng + 1, 1], [lng, 0]]] } });
|
|
|
|
describe("border refresh", () => {
|
|
it("replaces an already-loaded polygon when its query refreshes", () => {
|
|
state.data = border(0); state.updated = 1;
|
|
const { result, rerender } = renderHook(() => useMapBordersData(["YKF"], true));
|
|
const previous = result.current;
|
|
state.data = border(5); state.updated = 2;
|
|
rerender();
|
|
expect(result.current).not.toBe(previous);
|
|
expect(result.current.features[0]?.geometry).toEqual(border(5).geometry);
|
|
});
|
|
it("adds a configured border after an earlier empty response", () => {
|
|
state.data = null; state.updated = 3;
|
|
const { result, rerender } = renderHook(() => useMapBordersData(["YOW"], true));
|
|
expect(result.current.features).toHaveLength(0);
|
|
state.data = border(10); state.updated = 4;
|
|
rerender();
|
|
expect(result.current.features).toHaveLength(1);
|
|
});
|
|
it("keeps the same reference when a refetch returns the same data object", () => {
|
|
const same = border(0);
|
|
state.data = same; state.updated = 1;
|
|
const { result, rerender } = renderHook(() => useMapBordersData(["YKF"], true));
|
|
const previous = result.current;
|
|
state.updated = 2;
|
|
rerender();
|
|
expect(result.current).toBe(previous);
|
|
});
|
|
it("keeps the same reference when a null-border query refetches", () => {
|
|
state.data = null; state.updated = 1;
|
|
const { result, rerender } = renderHook(() => useMapBordersData(["YOW"], true));
|
|
const previous = result.current;
|
|
state.updated = 2;
|
|
rerender();
|
|
expect(result.current).toBe(previous);
|
|
});
|
|
});
|