✨ feat(vscode): 选工单也列「进行中」列里已经有 PR 的工单(开发完了没走自动审查的),弹框按「审查」「进行中」分组,进审查、刷新、重开窗口按同一条列规则判断

This commit is contained in:
cruldra committed 2026-09-29 04:23:57 +08:00
1 parent f2b17e5389
commit 489d0ef41f
7 files changed
+159 -68

No files matched your search

@@ -1,5 +1,5 @@
import { describe, expect, it } from 'vitest'
import { inReviewColumn, prNumberOf, reviewableIssue, reviewablePullRequest, reviewDescription, reviewMessage } from './reviewRules'
import { columnLabel, prNumberOf, REVIEW_COLUMNS_TEXT, reviewableIssue, reviewablePullRequest, reviewCandidates, reviewDescription, reviewMessage } from './reviewRules'
const issue = { number: 446, title: '用户资料:上传头像,收紧非管理员改资料的权限' }
@@ -10,25 +10,43 @@ describe('审查时的视图标题', () => {
})
})
describe('看板「审查」列', () => {
it('只要审查列的,工单号大的在前(和看板列里一样)', () => {
describe('选工单弹框列哪些工单', () => {
it('「审查」列的都列(没 PR 的也列),「进行中」列的只列有 PR 的,别的列不列', () => {
const issues = [
{ number: 438, column: 'review' as const },
{ number: 452, column: 'review' as const },
{ number: 452, column: 'review' as const, pr: '455' },
{ number: 451, column: 'in-progress' as const },
{ number: 446, column: 'review' as const },
{ number: 460, column: 'done' as const },
{ number: 449, column: 'in-progress' as const, pr: '450' },
{ number: 460, column: 'done' as const, pr: '461' },
{ number: 470, column: 'todo' as const, pr: '471' },
]
expect(inReviewColumn(issues).map(item => item.number)).toEqual([452, 446, 438])
expect(reviewCandidates(issues).map(item => item.number)).toEqual([452, 438, 449])
})
it('先「审查」一组再「进行中」一组,组里工单号大的在前(和看板列里一样)', () => {
const issues = [
{ number: 300, column: 'in-progress' as const, pr: '301' },
{ number: 438, column: 'review' as const, pr: '440' },
{ number: 500, column: 'in-progress' as const, pr: '501' },
{ number: 446, column: 'review' as const, pr: '447' },
]
expect(reviewCandidates(issues).map(item => item.number)).toEqual([446, 438, 500, 300])
})
it('只要 Gitea 的工单(PR 在 Gitea 上),YouTrack 的不算,没写来源的算 Gitea 的', () => {
const issues = [
{ number: 12, column: 'review' as const, source: 'youtrack' as const },
{ number: 13, column: 'in-progress' as const, source: 'youtrack' as const, pr: '14' },
{ number: 446, column: 'review' as const, source: 'gitea' as const },
{ number: 438, column: 'review' as const },
]
expect(inReviewColumn(issues).map(item => item.number)).toEqual([446, 438])
expect(reviewCandidates(issues).map(item => item.number)).toEqual([446, 438])
})
it('列名:分组标题和连着写的几列', () => {
expect(columnLabel('review')).toBe('审查')
expect(columnLabel('in-progress')).toBe('进行中')
expect(REVIEW_COLUMNS_TEXT).toBe('「审查」「进行中」')
})
it('工单的 PR 号取 state JSON 里的正整数(看板快照里也是字符串)', () => {
@@ -42,16 +60,19 @@ describe('看板「审查」列', () => {
})
describe('还能不能审查(选中、刷新、重开窗口时判断)', () => {
it('在审查列、有 PR:带上工单和 PR 号', () => {
const current = { column: 'review' as const, pr: '447' }
expect(reviewableIssue(446, current)).toEqual({ issue: current, pr: 447 })
it('在「审查」或「进行中」列、有 PR:带上工单和 PR 号', () => {
const inReview = { column: 'review' as const, pr: '447' }
const inProgress = { column: 'in-progress' as const, pr: '450' }
expect(reviewableIssue(446, inReview)).toEqual({ issue: inReview, pr: 447 })
expect(reviewableIssue(449, inProgress)).toEqual({ issue: inProgress, pr: 450 })
})
it('工单没了、离开了审查列、没有 PR:给出原因', () => {
it('工单没了、两列都离开了、没有 PR:给出原因', () => {
expect(reviewableIssue(446, null)).toEqual({ blocked: '#446 已经不存在' })
expect(reviewableIssue(446, { column: 'done', pr: '447' })).toEqual({ blocked: '#446 已经不在看板「审查」列' })
expect(reviewableIssue(446, { column: 'in-progress', pr: '447' })).toEqual({ blocked: '#446 已经不在看板「审查」列' })
expect(reviewableIssue(446, { column: 'done', pr: '447' })).toEqual({ blocked: '#446 已经不在看板「审查」「进行中」列' })
expect(reviewableIssue(446, { column: 'todo', pr: '447' })).toEqual({ blocked: '#446 已经不在看板「审查」「进行中」列' })
expect(reviewableIssue(446, { column: 'review' })).toEqual({ blocked: '#446 没有关联 PR' })
expect(reviewableIssue(449, { column: 'in-progress' })).toEqual({ blocked: '#449 没有关联 PR' })
})
it('关联的 PR 开着:带上它;没了、合并了、关了:给出原因', () => {