mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-15 12:55:51 +00:00
146 lines
4.9 KiB
TypeScript
146 lines
4.9 KiB
TypeScript
import { mock, describe, expect, test } from 'bun:test'
|
|
|
|
// Mock heavy deps
|
|
mock.module('src/utils/model/agent.js', () => ({
|
|
getDefaultSubagentModel: () => undefined,
|
|
}))
|
|
|
|
mock.module('src/utils/settings/constants.js', () => ({
|
|
getSourceDisplayName: (source: string) => source,
|
|
getSourceDisplayNameLowercase: (source: string) => source,
|
|
getSourceDisplayNameCapitalized: (source: string) => source,
|
|
getSettingSourceName: (source: string) => source,
|
|
getSettingSourceDisplayNameLowercase: (source: string) => source,
|
|
getSettingSourceDisplayNameCapitalized: (source: string) => source,
|
|
parseSettingSourcesFlag: () => [],
|
|
getEnabledSettingSources: () => [],
|
|
isSettingSourceEnabled: () => true,
|
|
SETTING_SOURCES: ['localSettings', 'userSettings', 'projectSettings'],
|
|
SOURCES: ['localSettings', 'userSettings', 'projectSettings'],
|
|
CLAUDE_CODE_SETTINGS_SCHEMA_URL:
|
|
'https://json.schemastore.org/claude-code-settings.json',
|
|
}))
|
|
|
|
const { resolveAgentOverrides, compareAgentsByName, AGENT_SOURCE_GROUPS } =
|
|
await import('../agentDisplay')
|
|
|
|
function makeAgent(agentType: string, source: string): any {
|
|
return { agentType, source, name: agentType }
|
|
}
|
|
|
|
describe('resolveAgentOverrides', () => {
|
|
test('marks no overrides when all agents active', () => {
|
|
const agents = [makeAgent('builder', 'userSettings')]
|
|
const result = resolveAgentOverrides(agents, agents)
|
|
expect(result).toHaveLength(1)
|
|
expect(result[0].overriddenBy).toBeUndefined()
|
|
})
|
|
|
|
test('marks inactive agent as overridden', () => {
|
|
const allAgents = [
|
|
makeAgent('builder', 'projectSettings'),
|
|
makeAgent('builder', 'userSettings'),
|
|
]
|
|
const activeAgents = [makeAgent('builder', 'userSettings')]
|
|
const result = resolveAgentOverrides(allAgents, activeAgents)
|
|
const projectAgent = result.find((a: any) => a.source === 'projectSettings')
|
|
expect(projectAgent?.overriddenBy).toBe('userSettings')
|
|
})
|
|
|
|
test('overriddenBy shows the overriding agent source', () => {
|
|
const allAgents = [makeAgent('tester', 'localSettings')]
|
|
const activeAgents = [makeAgent('tester', 'policySettings')]
|
|
const result = resolveAgentOverrides(allAgents, activeAgents)
|
|
expect(result[0].overriddenBy).toBe('policySettings')
|
|
})
|
|
|
|
test('deduplicates agents by (agentType, source)', () => {
|
|
const agents = [
|
|
makeAgent('builder', 'userSettings'),
|
|
makeAgent('builder', 'userSettings'), // duplicate
|
|
]
|
|
const result = resolveAgentOverrides(agents, agents.slice(0, 1))
|
|
expect(result).toHaveLength(1)
|
|
})
|
|
|
|
test('preserves agent definition properties', () => {
|
|
const agents = [
|
|
{ agentType: 'a', source: 'userSettings', name: 'Agent A' },
|
|
] as any[]
|
|
const result = resolveAgentOverrides(agents, agents)
|
|
expect((result[0] as any).name).toBe('Agent A')
|
|
expect(result[0].agentType).toBe('a')
|
|
})
|
|
|
|
test('handles empty arrays', () => {
|
|
expect(resolveAgentOverrides([], [])).toEqual([])
|
|
})
|
|
|
|
test('handles agent from git worktree (duplicate detection)', () => {
|
|
const agents = [
|
|
makeAgent('builder', 'projectSettings'),
|
|
makeAgent('builder', 'projectSettings'),
|
|
makeAgent('builder', 'localSettings'),
|
|
]
|
|
const result = resolveAgentOverrides(agents, agents.slice(0, 1))
|
|
// Deduped: projectSettings appears once, localSettings once
|
|
expect(result).toHaveLength(2)
|
|
})
|
|
})
|
|
|
|
describe('compareAgentsByName', () => {
|
|
test('sorts alphabetically ascending', () => {
|
|
const a = makeAgent('alpha', 'userSettings')
|
|
const b = makeAgent('beta', 'userSettings')
|
|
expect(compareAgentsByName(a, b)).toBeLessThan(0)
|
|
})
|
|
|
|
test('returns negative when a.name < b.name', () => {
|
|
const a = makeAgent('a', 's')
|
|
const b = makeAgent('b', 's')
|
|
expect(compareAgentsByName(a, b)).toBeLessThan(0)
|
|
})
|
|
|
|
test('returns positive when a.name > b.name', () => {
|
|
const a = makeAgent('z', 's')
|
|
const b = makeAgent('a', 's')
|
|
expect(compareAgentsByName(a, b)).toBeGreaterThan(0)
|
|
})
|
|
|
|
test('returns 0 for same name', () => {
|
|
const a = makeAgent('same', 's')
|
|
const b = makeAgent('same', 's')
|
|
expect(compareAgentsByName(a, b)).toBe(0)
|
|
})
|
|
|
|
test('is case-insensitive (sensitivity: base)', () => {
|
|
const a = makeAgent('Alpha', 's')
|
|
const b = makeAgent('alpha', 's')
|
|
expect(compareAgentsByName(a, b)).toBe(0)
|
|
})
|
|
})
|
|
|
|
describe('AGENT_SOURCE_GROUPS', () => {
|
|
test('contains expected source groups in order', () => {
|
|
expect(AGENT_SOURCE_GROUPS).toHaveLength(7)
|
|
expect(AGENT_SOURCE_GROUPS[0]).toEqual({
|
|
label: 'User agents',
|
|
source: 'userSettings',
|
|
})
|
|
expect(AGENT_SOURCE_GROUPS[6]).toEqual({
|
|
label: 'Built-in agents',
|
|
source: 'built-in',
|
|
})
|
|
})
|
|
|
|
test('has unique labels', () => {
|
|
const labels = AGENT_SOURCE_GROUPS.map(g => g.label)
|
|
expect(new Set(labels).size).toBe(labels.length)
|
|
})
|
|
|
|
test('has unique sources', () => {
|
|
const sources = AGENT_SOURCE_GROUPS.map(g => g.source)
|
|
expect(new Set(sources).size).toBe(sources.length)
|
|
})
|
|
})
|