import "@testing-library/jest-dom/vitest"
import { cleanup, fireEvent, render, screen, waitFor } from "@testing-library/react"
import { afterEach, beforeEach, describe, expect, it } from "vitest"
import { App } from "../src/app/App"
import { getCurrentRenderResult, useWorkbenchStore } from "../src/app/store/workbenchStore"
describe("BlockFlowEditor", () => {
beforeEach(() => {
useWorkbenchStore.getState().resetDemo()
})
afterEach(() => {
cleanup()
})
it("renders the demo template in the TipTap editor", () => {
render()
expect(screen.getByTestId("blockflow-editor")).toHaveTextContent("user.name")
expect(screen.getByTestId("blockflow-editor")).toHaveTextContent("fragment_common_footer")
})
it("inserts a variable through the command menu and updates AST", async () => {
render()
fireEvent.click(screen.getByRole("button", { name: "打开命令菜单" }))
fireEvent.click(screen.getByRole("button", { name: "变量 user.email" }))
await waitFor(() => {
const blocks = useWorkbenchStore.getState().snapshot.templates.template_main?.children ?? []
expect(JSON.stringify(blocks)).toContain("user.email")
expect(useWorkbenchStore.getState().saveStatus).toBe("dirty")
})
})
it("inserts condition and loop blocks through the command menu", async () => {
render()
fireEvent.click(screen.getByRole("button", { name: "打开命令菜单" }))
fireEvent.click(screen.getByRole("button", { name: "条件 if user.isVip" }))
fireEvent.click(screen.getByRole("button", { name: "打开命令菜单" }))
fireEvent.click(screen.getByRole("button", { name: "循环 for item in items" }))
await waitFor(() => {
const blocks = useWorkbenchStore.getState().snapshot.templates.template_main?.children ?? []
expect(JSON.stringify(blocks)).toContain("\"type\":\"condition\"")
expect(JSON.stringify(blocks)).toContain("\"type\":\"loop\"")
})
})
it("keeps render preview connected to the AST after editing", async () => {
render()
fireEvent.click(screen.getByRole("button", { name: "打开命令菜单" }))
fireEvent.click(screen.getByRole("button", { name: "变量 user.email" }))
await waitFor(() => {
const result = getCurrentRenderResult(useWorkbenchStore.getState())
expect(result.stats.missingVariables).toContain("user.email")
})
})
})