import { describe, expect, it } from 'vitest' import { columnLabel, prNumberOf, REVIEW_COLUMNS_TEXT, reviewableIssue, reviewablePullRequest, reviewCandidates, reviewDescription, reviewMessage } from './reviewRules' const issue = { number: 446, title: '用户资料:上传头像,收紧非管理员改资料的权限' } describe('审查时的视图标题', () => { it('标题后面「审查 #446」,下面一行工单标题、PR、改了几个文件', () => { expect(reviewDescription(446)).toBe('审查 #446') expect(reviewMessage(issue, 447, 6)).toBe('#446 用户资料:上传头像,收紧非管理员改资料的权限 · PR #447 · 改了 6 个文件') }) }) describe('选工单弹框列哪些工单', () => { it('「审查」列的都列(没 PR 的也列),「进行中」列的只列有 PR 的,别的列不列', () => { const issues = [ { number: 438, column: 'review' as const }, { number: 452, column: 'review' as const, pr: '455' }, { number: 451, column: 'in-progress' 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(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(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 里的正整数(看板快照里也是字符串)', () => { expect(prNumberOf({ pr: '454' })).toBe(454) expect(prNumberOf({ pr: '447' })).toBe(447) expect(prNumberOf({})).toBeUndefined() expect(prNumberOf({ pr: '' })).toBeUndefined() expect(prNumberOf({ pr: '0' })).toBeUndefined() expect(prNumberOf({ pr: 'abc' })).toBeUndefined() }) }) describe('还能不能审查(选中、刷新、重开窗口时判断)', () => { 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:给出原因', () => { expect(reviewableIssue(446, null)).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 开着:带上它;没了、合并了、关了:给出原因', () => { const open = { state: 'open', merged: false, headSha: 'abc' } expect(reviewablePullRequest(447, open)).toEqual({ pull: open }) expect(reviewablePullRequest(447, null)).toEqual({ blocked: 'PR #447 已经不存在' }) expect(reviewablePullRequest(447, { state: 'closed', merged: true })).toEqual({ blocked: 'PR #447 已经合并' }) expect(reviewablePullRequest(447, { state: 'closed', merged: false })).toEqual({ blocked: 'PR #447 已经关闭' }) }) })