hermes-agent/apps/desktop/src/store/coding-status.test.ts
2026-06-25 16:40:27 -05:00

74 lines
2.1 KiB
TypeScript

import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import type { HermesRepoStatus } from '@/global'
import { $repoStatus, refreshRepoStatus } from './coding-status'
import { $currentCwd } from './session'
const sampleStatus: HermesRepoStatus = {
branch: 'feature/login',
defaultBranch: 'main',
detached: false,
ahead: 1,
behind: 0,
staged: 1,
unstaged: 2,
untracked: 0,
conflicted: 0,
changed: 3,
added: 12,
removed: 4,
files: []
}
function stubProbe(impl: (cwd: string) => Promise<HermesRepoStatus | null>) {
;(window as unknown as { hermesDesktop?: unknown }).hermesDesktop = { git: { repoStatus: impl } }
}
describe('refreshRepoStatus', () => {
beforeEach(() => {
$repoStatus.set(null)
$currentCwd.set('')
delete (window as unknown as { hermesDesktop?: unknown }).hermesDesktop
})
afterEach(() => {
delete (window as unknown as { hermesDesktop?: unknown }).hermesDesktop
})
it('populates $repoStatus from the probe for an explicit cwd', async () => {
stubProbe(async () => sampleStatus)
await refreshRepoStatus('/repo')
expect($repoStatus.get()).toEqual(sampleStatus)
})
it('falls back to the active session cwd when none is passed', async () => {
const probe = vi.fn(async () => sampleStatus)
stubProbe(probe)
$currentCwd.set('/active/repo')
await refreshRepoStatus()
expect(probe).toHaveBeenCalledWith('/active/repo')
})
it('clears status when there is no cwd', async () => {
stubProbe(async () => sampleStatus)
$repoStatus.set(sampleStatus)
await refreshRepoStatus(' ')
expect($repoStatus.get()).toBeNull()
})
it('clears status when the probe is unavailable (remote backend)', async () => {
$repoStatus.set(sampleStatus)
await refreshRepoStatus('/repo')
expect($repoStatus.get()).toBeNull()
})
it('clears status when the probe throws', async () => {
stubProbe(async () => {
throw new Error('not a repo')
})
$repoStatus.set(sampleStatus)
await refreshRepoStatus('/repo')
expect($repoStatus.get()).toBeNull()
})
})