review.test.js 1.71 KB
import { describe, expect, it } from 'vitest'
import { reviewViolation } from '../src/review.js'

const item_keys = ['c1', 'c2']
const pass = (id) => ({ id, pass: true, reason: 'ok' })
const failed = (id) => ({ id, pass: false, reason: 'not done' })

describe('验收格式校验', () => {
  it('全部通过只能 accept / select_winner', () => {
    expect(reviewViolation({ action: 'accept', checks: [pass('c1'), pass('c2')], item_keys })).toBeNull()
    expect(reviewViolation({ action: 'select_winner', checks: [pass('c1'), pass('c2')], item_keys })).toBeNull()
    expect(reviewViolation({ action: 'reject', checks: [pass('c1'), pass('c2')], item_keys })).toMatch(/at least one failed/)
  })

  it('任一条不通过只能 reject', () => {
    expect(reviewViolation({ action: 'reject', checks: [pass('c1'), failed('c2')], item_keys })).toBeNull()
    expect(reviewViolation({ action: 'accept', checks: [pass('c1'), failed('c2')], item_keys })).toMatch(/reject instead/)
    expect(reviewViolation({ action: 'select_winner', checks: [failed('c1'), pass('c2')], item_keys })).toMatch(/reject instead/)
  })

  it('必须恰好覆盖全部清单项', () => {
    expect(reviewViolation({ action: 'accept', checks: [pass('c1')], item_keys })).toMatch(/missing: c2/)
    expect(reviewViolation({ action: 'accept', checks: [pass('c1'), pass('c2'), pass('c9')], item_keys })).toMatch(/unknown acceptance items: c9/)
    expect(reviewViolation({ action: 'accept', checks: [pass('c1'), pass('c1'), pass('c2')], item_keys })).toMatch(/more than once/)
  })

  it('未知动作直接 throw', () => {
    expect(() => reviewViolation({ action: 'approve', checks: [pass('c1'), pass('c2')], item_keys })).toThrow(/Unhandled review action: approve/)
  })
})