import { afterEach, describe, expect, test } from "bun:test"; import { act } from "react"; import type { PluginRegistry } from "../plugins/registry"; import type { PaneSettingActionContext, PaneSettingActionField, PaneSettingField, PaneSettingsContext, } from "../types/plugin"; import { TestDialogProvider, testRender } from "../renderers/opentui/test-utils"; import { useDialog } from "../ui/dialog"; import { PaneSettingsDialogContent } from "./pane-settings-dialog"; import { TuiPaneSettingsDialogBody } from "./pane-settings-dialog/tui"; import { Button } from "./ui"; let testSetup: Awaited> | undefined; afterEach(async () => { if (!testSetup) return; await act(async () => { testSetup!.renderer.destroy(); }); testSetup = undefined; }); const context = { paneId: "test-pane:main", settings: {}, } as PaneSettingsContext; function makeField(overrides: Partial = {}): PaneSettingActionField { return { key: "connection", label: "AI Account", description: "Connect an account used by this pane.", type: "action", actionId: "ai.connect", actionLabel: "Connect", action: () => {}, ...overrides, }; } function makeRegistry( field: PaneSettingActionField, options: { openCommandBar?: (query?: string) => void } = {}, ): PluginRegistry { return { resolvePaneSettings: () => ({ paneId: context.paneId, pane: { title: "AI", paneId: "test-pane" }, paneDef: { name: "AI" }, settingsDef: { title: "AI Settings", fields: [field] }, context, }), openCommandBar: options.openCommandBar ?? (() => {}), notify: () => {}, } as unknown as PluginRegistry; } function NestedSettingsHarness({ field, applyFieldValue, }: { field: PaneSettingField; applyFieldValue: (paneId: string, field: PaneSettingField, value: unknown) => Promise; }) { const dialog = useDialog(); const registry = { resolvePaneSettings: () => ({ paneId: context.paneId, pane: { title: "Chart", paneId: "chart-composer" }, paneDef: { name: "Chart" }, settingsDef: { title: "Chart Settings", fields: [field] }, context, }), openCommandBar: () => {}, notify: () => {}, } as unknown as PluginRegistry; return (