import { expect, test } from "vitest"; import { screen } from "@testing-library/react"; import { http, HttpResponse } from "msw"; import { Routes, Route } from "react-router-dom"; import { server } from "../test/server"; import { renderApp } from "../test/render"; import { ObjectDetail } from "./object-detail"; function tree() { return ( } /> ); } test("renders inventory-minimum fields, flexible values and visibility", async () => { // override so the object carries a flexible field value (schema types fields as // Record, so return a plain object literal here) server.use( http.get("/api/admin/objects/:id", () => HttpResponse.json({ id: "11111111-1111-1111-1111-111111111111", object_number: "LM-0042", object_name: "Amphora", number_of_objects: 1, brief_description: "Storage jar", current_location: "Vault 3", current_owner: null, recorder: null, recording_date: null, visibility: "public", fields: { material: "Bronze" }, }), ), ); renderApp(tree(), { route: "/objects/11111111-1111-1111-1111-111111111111" }); expect(await screen.findByText("Amphora")).toBeInTheDocument(); expect(screen.getByText("Vault 3")).toBeInTheDocument(); expect(screen.getByText("Bronze")).toBeInTheDocument(); // flexible field value // "Public" appears in both the VisibilityBadge and the PublishControl stepper; // scope the assertion to the badge element to avoid ambiguity. expect(document.querySelector("[data-slot='badge']")).toHaveTextContent("Public"); }); test("shows a not-found state for a missing object", async () => { server.use(http.get("/api/admin/objects/:id", () => new HttpResponse(null, { status: 404 }))); renderApp(tree(), { route: "/objects/does-not-exist" }); expect(await screen.findByText(/object not found/i)).toBeInTheDocument(); }); test("detail shows the publish control with the current visibility stepper", async () => { // default GET /api/admin/objects/:id handler returns amphora (visibility "public") renderApp(tree(), { route: "/objects/11111111-1111-1111-1111-111111111111" }); expect(await screen.findByText(/visibility/i)).toBeInTheDocument(); expect(await screen.findByRole("button", { name: /unpublish to internal/i })).toBeInTheDocument(); });