openpencil/tests/engine/app/settings/mcp-tool-access.test.ts
Danila Poyarkov ea4b8e4b97 feat(settings): unify preferences and integration editors
Unify Settings navigation, credential drafts, translated form validation, and appearance controls. Add explicit WebMCP access modes and searchable MCP tool permissions while preserving execution and credential safeguards.
2026-09-15 16:34:05 +03:00

72 lines
2.3 KiB
TypeScript

import { expect, test } from 'bun:test'
import { ref } from 'vue'
import type { ToolDescriptor } from '@open-pencil/mcp/tools'
import { useMCPToolAccess } from '@/app/automation/mcp/settings/tool-access'
function catalog() {
return ref<ToolDescriptor[]>([
{
name: 'inspect_a',
description: 'Inspect layers',
effect: 'read',
availability: 'default',
capabilities: ['document:read'],
enabled: true
},
{
name: 'inspect_b',
description: 'Inspect variables',
effect: 'read',
availability: 'default',
capabilities: ['document:read'],
enabled: true
},
{
name: 'edit_a',
description: 'Change a layer',
effect: 'write',
availability: 'default',
capabilities: ['document:write'],
enabled: true
}
])
}
test('tool counts and mixed states follow the controlled model and catalog', () => {
const tools = catalog()
const disabled = ref(['inspect_a', 'unavailable_tool'])
const access = useMCPToolAccess(tools, disabled)
expect(access.enabledCount.value).toBe(2)
expect(access.inspectionEnabled.value).toBe(true)
expect(access.inspectionState.value).toBe('mixed')
access.inspectionEnabled.value = false
expect(disabled.value).toEqual(['inspect_a', 'unavailable_tool', 'inspect_b'])
expect(access.enabledCount.value).toBe(1)
expect(access.inspectionState.value).toBe('idle')
access.inspectionEnabled.value = true
expect(disabled.value).toEqual(['unavailable_tool'])
access.setToolEnabled('edit_a', false)
expect(access.modificationEnabled.value).toBe(false)
disabled.value = []
expect(access.enabledCount.value).toBe(3)
tools.value = []
expect(access.enabledCount.value).toBe(0)
expect(access.inspectionEnabled.value).toBe(false)
})
test('search filters presentation without changing category membership or access', () => {
const tools = catalog()
const disabled = ref<string[]>([])
const access = useMCPToolAccess(tools, disabled)
access.search.value = ' VARIABLES '
expect(access.visibleTools.value.map((tool) => tool.name)).toEqual(['inspect_b'])
access.inspectionEnabled.value = false
expect(disabled.value).toEqual(['inspect_a', 'inspect_b'])
expect(access.enabledCount.value).toBe(1)
access.search.value = 'no-match'
expect(access.visibleTools.value).toEqual([])
})