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.
76 lines
1.8 KiB
TypeScript
76 lines
1.8 KiB
TypeScript
import { expect, test } from 'bun:test'
|
|
|
|
import { ref } from 'vue'
|
|
|
|
import { createSettingsNavigation } from '@/app/settings/navigation/use'
|
|
|
|
test('pristine editors can leave; dirty editors ask before navigation', () => {
|
|
const navigation = createSettingsNavigation()
|
|
const dirty = ref(false)
|
|
const busy = ref(false)
|
|
let cancelled = 0
|
|
let navigated = 0
|
|
const form = {
|
|
dirty,
|
|
busy,
|
|
cancel: () => {
|
|
cancelled++
|
|
}
|
|
}
|
|
navigation.register(form)
|
|
navigation.request(() => {
|
|
navigated++
|
|
})
|
|
expect([cancelled, navigated]).toEqual([1, 1])
|
|
dirty.value = true
|
|
navigation.register(form)
|
|
navigation.request(() => {
|
|
navigated++
|
|
})
|
|
expect(navigation.confirming.value).toBe(true)
|
|
navigation.keepEditing()
|
|
expect(navigation.editing.value).toBe(true)
|
|
expect([cancelled, navigated]).toEqual([1, 1])
|
|
navigation.request(() => {
|
|
navigated++
|
|
})
|
|
navigation.discard()
|
|
expect([cancelled, navigated]).toEqual([2, 2])
|
|
expect(navigation.confirming.value).toBe(false)
|
|
expect(navigation.editing.value).toBe(false)
|
|
})
|
|
|
|
test('busy and replaced editors cannot be discarded by stale requests', () => {
|
|
const navigation = createSettingsNavigation()
|
|
const busy = ref(true)
|
|
let cancelled = false
|
|
let navigated = false
|
|
const unregister = navigation.register({
|
|
dirty: ref(true),
|
|
busy,
|
|
cancel: () => {
|
|
cancelled = true
|
|
}
|
|
})
|
|
navigation.request(() => {
|
|
navigated = true
|
|
})
|
|
expect(navigation.confirming.value).toBe(false)
|
|
busy.value = false
|
|
navigation.request(() => {
|
|
navigated = true
|
|
})
|
|
unregister()
|
|
navigation.register({
|
|
dirty: ref(true),
|
|
busy: ref(false),
|
|
cancel: () => {
|
|
cancelled = true
|
|
}
|
|
})
|
|
navigation.discard()
|
|
expect(cancelled).toBe(false)
|
|
expect(navigated).toBe(false)
|
|
expect(navigation.editing.value).toBe(true)
|
|
})
|