mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-09-21 14:22:14 +03:00
Landed with the design call resolved per the owner's pick — **option 1**: the synced store is now endpoint-agnostic (persistDiscoveredModels and managedModelImport no longer drop non-chat models at write time), and chat selectability moved to read time (auto-pool expansion in autoStrategy applies filterChatSelectableModels; the models-route projection already had its chatOnly filter). Your discovery test now passes end-to-end (3/3): /api/show capabilities persist per connection and image/embedding requests route through the advertising host. Reconciliation notes: conflicted areas merged onto the current tip (adobe discovery import, requestedModel preflight signature, resolvedProvider fast-path coexists with the synced-route override — explicit resolution wins); carried base-red drains (#10055 memoization, #11071 test variants) dropped as already-landed; the managed-model-import exclusion test was propagated to the new contract (image/video models persist; the read filter still hides them from chat pickers — pinned by a new assertion). Full battery: 205/206 focused (the one red is a confirmed periodic-timer timing flake on the loaded devbox — 20/20 isolated), autoCombo vitest 30/30, combo suites 46/46, gates + typecheck clean. Thank you @yourspraveen — the capability probe + routing design was right; it just needed the store contract opened up. Fixes #11087.
79 lines
2.5 KiB
TypeScript
79 lines
2.5 KiB
TypeScript
// @vitest-environment jsdom
|
|
import React, { act } from "react";
|
|
import { createRoot } from "react-dom/client";
|
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
|
|
import Breadcrumbs from "../../src/shared/components/Breadcrumbs";
|
|
import ptBrMessages from "../../src/i18n/messages/pt-BR.json";
|
|
|
|
let labels: Record<string, string> = {};
|
|
const translate = Object.assign(
|
|
vi.fn((key: string) => {
|
|
if (key in labels) return labels[key];
|
|
throw new Error(`missing translation: ${key}`);
|
|
}),
|
|
{ has: vi.fn((key: string) => key in labels) }
|
|
);
|
|
|
|
vi.mock("next/navigation", () => ({
|
|
usePathname: () => "/dashboard/radar/setup",
|
|
}));
|
|
|
|
vi.mock("next-intl", () => ({
|
|
useTranslations: () => translate,
|
|
}));
|
|
|
|
vi.mock("next/link", () => ({
|
|
default: ({ href, children, ...props }: React.AnchorHTMLAttributes<HTMLAnchorElement>) => (
|
|
<a href={String(href)} {...props}>
|
|
{children}
|
|
</a>
|
|
),
|
|
}));
|
|
|
|
describe("Breadcrumbs missing translation fallback", () => {
|
|
beforeEach(() => {
|
|
labels = { ariaLabel: "Breadcrumb", dashboard: "Dashboard" };
|
|
(
|
|
globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean }
|
|
).IS_REACT_ACT_ENVIRONMENT = true;
|
|
});
|
|
|
|
afterEach(() => {
|
|
document.body.innerHTML = "";
|
|
translate.mockClear();
|
|
translate.has.mockClear();
|
|
});
|
|
|
|
it("renders humanized Radar setup labels without asking next-intl for missing keys", async () => {
|
|
const container = document.createElement("div");
|
|
document.body.appendChild(container);
|
|
const root = createRoot(container);
|
|
|
|
await act(async () => root.render(<Breadcrumbs />));
|
|
|
|
expect(container.textContent).toContain("Dashboard");
|
|
expect(container.textContent).toContain("Radar");
|
|
expect(container.textContent).toContain("Setup");
|
|
expect(translate).not.toHaveBeenCalledWith("radar");
|
|
expect(translate).not.toHaveBeenCalledWith("setup");
|
|
act(() => root.unmount());
|
|
});
|
|
|
|
it("uses localized breadcrumb labels when Radar and setup translations exist", async () => {
|
|
labels = ptBrMessages.breadcrumbs;
|
|
const container = document.createElement("div");
|
|
document.body.appendChild(container);
|
|
const root = createRoot(container);
|
|
|
|
await act(async () => root.render(<Breadcrumbs />));
|
|
|
|
expect(container.textContent).toContain("Painel");
|
|
expect(container.textContent).toContain("Radar");
|
|
expect(container.textContent).toContain("Configuração");
|
|
expect(translate).toHaveBeenCalledWith("radar");
|
|
expect(translate).toHaveBeenCalledWith("setup");
|
|
act(() => root.unmount());
|
|
});
|
|
});
|