开会话原先要先全量拉工单(含每张工单的评论、依赖、PR)做前置锁检查, 再各读一次 state JSON 给 pre-create 钩子和终端图标,几秒后才 createTerminal。 - 锁检查改用主进程已算好的工单快照,快照里没有该工单才回落全量拉取 - state JSON 一次读两处用,且提前发起与本地准备重叠 - 会话行 spinner 由扩展的 session/tab-settled 消息驱动,不再是固定 1.5s 假动画, 消息丢失时 60s 超时兜底 Claude-Session: https://claude.ai/code/session_01Kgmb1LvrPmFX3NoUDB4zZC
36 lines
1.2 KiB
TypeScript
36 lines
1.2 KiB
TypeScript
import type { Issue } from '../gitea/types'
|
|
import { describe, expect, it } from 'vitest'
|
|
import { evaluateLockedReason } from './issueLock'
|
|
|
|
function issue(number: number, column: Issue['column'], prerequisite?: number): Issue {
|
|
return { number, title: `#${number}`, column, prerequisite } as Issue
|
|
}
|
|
|
|
describe('evaluateLockedReason', () => {
|
|
it('没有前置 → 放行', () => {
|
|
expect(evaluateLockedReason([issue(1, 'todo')], 1)).toEqual({ locked: false })
|
|
})
|
|
|
|
it('前置未完成 → 锁定并带上前置号和所在列', () => {
|
|
const issues = [issue(2, 'todo', 1), issue(1, 'in-progress')]
|
|
expect(evaluateLockedReason(issues, 2)).toEqual({
|
|
locked: true,
|
|
prerequisiteNumber: 1,
|
|
prerequisiteColumn: 'in-progress',
|
|
})
|
|
})
|
|
|
|
it('前置已完成 → 放行', () => {
|
|
const issues = [issue(2, 'todo', 1), issue(1, 'done')]
|
|
expect(evaluateLockedReason(issues, 2)).toEqual({ locked: false })
|
|
})
|
|
|
|
it('快照里没有前置工单 → 放行(不误锁)', () => {
|
|
expect(evaluateLockedReason([issue(2, 'todo', 99)], 2)).toEqual({ locked: false })
|
|
})
|
|
|
|
it('快照里没有这张工单 → 放行', () => {
|
|
expect(evaluateLockedReason([issue(1, 'todo')], 7)).toEqual({ locked: false })
|
|
})
|
|
})
|