import { afterEach, expect, it } from "vitest"; import { cleanup, fireEvent, render, screen } from "@testing-library/react"; import { Ui结构表单 } from "../../src/界面/结构表单/结构表单"; import { 生成字段修改, 投影表单值 } from "../../src/界面/结构表单/投影会话"; afterEach(cleanup); it("NC-form-rebase-intent:冲突刷新只保留作者真正改动的字段", async () => { const schema = { type: "object", properties: { 名称: { type: "string" }, 摘要: { type: "string" } }, }; let output: unknown; const submit = async (changes: unknown) => { output = changes; }; const view = render( , ); fireEvent.change(screen.getByLabelText("名称"), { target: { value: "我改的名字" }, }); view.rerender( , ); expect((screen.getByLabelText("摘要") as HTMLInputElement).value).toBe( "服务器新摘要", ); fireEvent.click(screen.getByRole("button", { name: "保存档案" })); expect(output).toEqual([{ 路径: ["名称"], 动作: "set", 值: "我改的名字" }]); }); it("NC-form-editable-projection:嵌套字段只提交可编辑叶子并隐藏受限值", async () => { const visible = { type: "object", properties: { 人物: { type: "object", properties: { 姓名: { type: "string", title: "姓名" }, 编号: { type: "string", title: "编号" }, }, }, }, }; const editable = { type: "object", properties: { 人物: { type: "object", properties: { 姓名: { type: "string" } } }, }, }; const base = { 人物: { 姓名: "旧名", 编号: "只读身份", 秘密: "不可显示" } }; let output: unknown; render( { output = changes; }} />, ); expect(screen.queryByText("不可显示")).toBeNull(); expect((screen.getByLabelText("编号") as HTMLInputElement).readOnly).toBe( true, ); fireEvent.change(screen.getByLabelText("姓名"), { target: { value: "新名" }, }); fireEvent.click(screen.getByRole("button", { name: "保存档案" })); expect(output).toEqual([{ 路径: ["人物", "姓名"], 动作: "set", 值: "新名" }]); }); it("NC-form-projection-refresh:新投影清除不允许显示的旧输入", () => { const schema = { type: "object", properties: { 公开: { type: "string" } } }; expect(投影表单值(schema, { 公开: "保留", 秘密: "旧输入" })).toEqual({ 公开: "保留", }); expect(生成字段修改({ 公开: "旧值" }, { 公开: "保留" }, schema)).toEqual([ { 路径: ["公开"], 动作: "set", 值: "保留" }, ]); });