Files
0pt/tests/components/order-notes-ssr.test.ts
T
admin 04813c34b0
CI (SIAX Cloud) / integration (push) Skipped
CI (SIAX Cloud) / sonar (push) Skipped
masterplan-lock / check (push) Successful in 7s
Security Scan (SIAX Cloud) / security (push) Successful in 16s
CI (SIAX Cloud) / security (push) Successful in 18s
masterplan-lock / check (pull_request) Successful in 8s
CI (SIAX Cloud) / quality (push) Failing after 33s
Security Scan (SIAX Cloud) / security (pull_request) Successful in 22s
CI (SIAX Cloud) / integration (pull_request) Successful in 31s
CI (SIAX Cloud) / security (pull_request) Successful in 23s
CI (SIAX Cloud) / sonar (pull_request) Skipped
CI (SIAX Cloud) / quality (pull_request) Failing after 21s
feat(collab): order-anteckningar — @siax/collaboration-kernelns första produktkonsument (spår C)
Kernel 0.3.0 används som capability, inte som paket-dekor:
- lib/order-notes-store.ts: varje note ÄR en CollaborationOperation;
  nextLamportClock för nya klockor, mergeOperationLog/compareOperations
  för deterministisk listning; optimistisk version -> 409 vid stale skrivning.
- lib/order-notes-client.ts: kernel-CollaborationTransport över host-API;
  offline = medvetet no-op + varning (ingen tyst förlust), 409 -> ConflictError.
- app/api/admin/order-notes: requireRouteAuth (fail-closed 401),
  server-authoritative tenant-guard (403), AUD0-audit via hostens klient.
- app/admin/notes: admin-yta med offline-växel, konflikt-banner + reload.
- sql/016_order_notes.sql: persistens (DB-tabell, version + Lamport-klocka).

Tester: API (happy/conflict 409/empty/400/401/403/404), klient-adapter
(offline no-op utan fetch, 409-mappning, presence), SSR-render. 18 nya test.
2026-09-30 17:07:21 +02:00

32 lines
1.3 KiB
TypeScript

/**
* SSR-render-proof för den nya admin-ytan /admin/notes (kernel-konsumenten).
* Samma mönster som import-wizard-ssr.test.ts: react-dom/server i Node.
* PortalShell -> usePathname (next/navigation) mockas; sonner toast mockas.
*/
import { describe, it, expect, vi } from "vitest";
vi.mock("next/navigation", () => ({
usePathname: () => "/admin/notes",
useRouter: () => ({ push: vi.fn(), replace: vi.fn() }),
}));
vi.mock("sonner", () => ({ toast: { success: vi.fn(), warning: vi.fn(), error: vi.fn() } }));
vi.mock("@/components/locale-provider", () => ({
LocaleProvider: ({ children }: { children: React.ReactNode }) => children,
useT: () => (x: { en: string; sv: string }) => x.en,
useLocale: () => "en",
}));
import { createElement } from "react";
import { renderToString } from "react-dom/server";
import OrderNotesPage from "@/app/admin/notes/page";
describe("/admin/notes SSR (kernel-konsument-yta)", () => {
it("renderar rubrik, offline-växeln och laddningstillstånd utan krasch (SSR = första paint före useEffect)", () => {
const html = renderToString(createElement(OrderNotesPage));
expect(html).toContain("Orderanteckningar");
expect(html).toContain("Offline-läge");
expect(html).toContain('role="status"'); // loading-skeleton = korrekt SSR-att-få-state
expect(html.length).toBeGreaterThan(500);
});
});