86 lines
4.6 KiB
TypeScript
86 lines
4.6 KiB
TypeScript
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 已经关闭' })
|
|
})
|
|
})
|