Files
claude-code/src/commands/local-memory/__tests__/parseArgs.test.ts
claude-code-best 4f0aa8615a feat: 添加本地 Memory/Vault 管理命令
- /local-memory: 本地记忆管理(store/entry CRUD、搜索、归档)
- /local-vault: 本地密钥保险库管理(加解密、keychain 集成)
- permissionValidation: vault 权限校验增强

Co-Authored-By: glm-5-turbo <zai-org@claude-code-best.win>
2026-05-09 23:04:20 +08:00

107 lines
3.1 KiB
TypeScript

import { describe, test, expect } from 'bun:test'
import { parseLocalMemoryArgs } from '../parseArgs.js'
describe('parseLocalMemoryArgs', () => {
test('empty string → list', () => {
expect(parseLocalMemoryArgs('')).toEqual({ action: 'list' })
})
test('"list" → list', () => {
expect(parseLocalMemoryArgs('list')).toEqual({ action: 'list' })
})
test('create with store name', () => {
expect(parseLocalMemoryArgs('create my-store')).toEqual({
action: 'create',
store: 'my-store',
})
})
test('create without store name → invalid', () => {
expect(parseLocalMemoryArgs('create').action).toBe('invalid')
})
test('store with store, key, value', () => {
expect(parseLocalMemoryArgs('store my-store my-key my value here')).toEqual(
{
action: 'store',
store: 'my-store',
key: 'my-key',
value: 'my value here',
},
)
})
test('store without key → invalid', () => {
expect(parseLocalMemoryArgs('store my-store').action).toBe('invalid')
})
test('store without value → invalid', () => {
expect(parseLocalMemoryArgs('store my-store my-key').action).toBe('invalid')
})
test('fetch with store and key', () => {
expect(parseLocalMemoryArgs('fetch notes hello')).toEqual({
action: 'fetch',
store: 'notes',
key: 'hello',
})
})
test('fetch without key → invalid', () => {
expect(parseLocalMemoryArgs('fetch notes').action).toBe('invalid')
})
test('entries with store name', () => {
expect(parseLocalMemoryArgs('entries my-store')).toEqual({
action: 'entries',
store: 'my-store',
})
})
test('entries without store name → invalid', () => {
expect(parseLocalMemoryArgs('entries').action).toBe('invalid')
})
test('archive with store name', () => {
expect(parseLocalMemoryArgs('archive old-store')).toEqual({
action: 'archive',
store: 'old-store',
})
})
test('archive without store name → invalid', () => {
expect(parseLocalMemoryArgs('archive').action).toBe('invalid')
})
test('unknown sub-command → invalid with reason', () => {
const result = parseLocalMemoryArgs('frobnicate')
expect(result.action).toBe('invalid')
if (result.action === 'invalid') {
expect(result.reason).toContain('frobnicate')
}
})
test('"list" with trailing args still returns list action', () => {
// 'list extra' bypasses the short-circuit on line 33 and hits the
// tokens-based branch on line 41-43.
expect(parseLocalMemoryArgs('list extra-arg')).toEqual({ action: 'list' })
})
test('store sub-command with no args → invalid (missing store name)', () => {
const r = parseLocalMemoryArgs('store')
expect(r.action).toBe('invalid')
if (r.action === 'invalid') {
expect(r.reason).toContain('store name')
}
})
test('fetch sub-command with no args → invalid (missing store name)', () => {
const r = parseLocalMemoryArgs('fetch')
expect(r.action).toBe('invalid')
if (r.action === 'invalid') {
expect(r.reason).toContain('store name')
}
})
})