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.
72 lines
2.3 KiB
TypeScript
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([])
|
|
})
|