coverage.test.ts
1,191 bytes
| 1 | import { describe, expect, it } from 'vitest' |
|---|---|
| 2 | import { CATEGORY_IDS, initialCoverage, type Coverage } from '../../shared/types' |
| 3 | import { isFullyCovered, weakestCategory } from './coverage' |
| 4 | |
| 5 | function allClear(): Coverage { |
| 6 | return Object.fromEntries(CATEGORY_IDS.map((category) => [category, 'clear'])) as Coverage |
| 7 | } |
| 8 | |
| 9 | describe('weakestCategory', () => { |
| 10 | it('returns the first category in fixed order when all are missing', () => { |
| 11 | expect(weakestCategory(initialCoverage())).toBe(CATEGORY_IDS[0]) |
| 12 | }) |
| 13 | |
| 14 | it('prefers missing over partial, and partial over clear, tie-broken by fixed order', () => { |
| 15 | const coverage: Coverage = { |
| 16 | ...initialCoverage(), |
| 17 | goal: 'clear', |
| 18 | users: 'partial', |
| 19 | 'core-flow': 'missing', |
| 20 | } |
| 21 | expect(weakestCategory(coverage)).toBe('core-flow') |
| 22 | }) |
| 23 | |
| 24 | it('returns null when every category is clear', () => { |
| 25 | expect(weakestCategory(allClear())).toBeNull() |
| 26 | }) |
| 27 | }) |
| 28 | |
| 29 | describe('isFullyCovered', () => { |
| 30 | it('is false until every category is clear', () => { |
| 31 | expect(isFullyCovered(initialCoverage())).toBe(false) |
| 32 | }) |
| 33 | |
| 34 | it('is true once every category is clear', () => { |
| 35 | expect(isFullyCovered(allClear())).toBe(true) |
| 36 | }) |
| 37 | }) |
| 38 | |