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
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.
32 lines
1.3 KiB
TypeScript
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);
|
|
});
|
|
});
|