test(web): 添加 vitest 单元测试基础设施和初始测试用例
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled

- 安装 vitest + @testing-library/react + @testing-library/jest-dom + jsdom
- 创建 vitest.config.ts (jsdom 环境, 全局 API, e2e 目录排除)
- 创建 test/setup.ts (@testing-library/jest-dom 匹配器)
- 添加 29 个测试用例: health 常量 (14), useThemeMode hook (2), StatusTag 组件 (13)
This commit is contained in:
iven
2026-04-25 10:11:30 +08:00
parent 945ccd64ba
commit 55a3fd32d0
7 changed files with 965 additions and 54 deletions

View File

@@ -0,0 +1,85 @@
import { describe, it, expect } from 'vitest'
import {
GENDER_OPTIONS,
BLOOD_TYPE_OPTIONS,
STATUS_OPTIONS,
} from './health'
describe('GENDER_OPTIONS', () => {
it('should be an array with 3 items', () => {
expect(GENDER_OPTIONS).toBeInstanceOf(Array)
expect(GENDER_OPTIONS).toHaveLength(3)
})
it('each item should have value and label string properties', () => {
for (const opt of GENDER_OPTIONS) {
expect(opt).toHaveProperty('value')
expect(opt).toHaveProperty('label')
expect(typeof opt.value).toBe('string')
expect(typeof opt.label).toBe('string')
}
})
it('should contain expected gender values', () => {
const values = GENDER_OPTIONS.map((o) => o.value)
expect(values).toEqual(['male', 'female', 'other'])
})
it('should contain expected Chinese labels', () => {
const labels = GENDER_OPTIONS.map((o) => o.label)
expect(labels).toEqual(['男', '女', '其他'])
})
})
describe('BLOOD_TYPE_OPTIONS', () => {
it('should be an array with 4 items', () => {
expect(BLOOD_TYPE_OPTIONS).toBeInstanceOf(Array)
expect(BLOOD_TYPE_OPTIONS).toHaveLength(4)
})
it('each item should have value and label string properties', () => {
for (const opt of BLOOD_TYPE_OPTIONS) {
expect(opt).toHaveProperty('value')
expect(opt).toHaveProperty('label')
expect(typeof opt.value).toBe('string')
expect(typeof opt.label).toBe('string')
}
})
it('should contain expected blood type values', () => {
const values = BLOOD_TYPE_OPTIONS.map((o) => o.value)
expect(values).toEqual(['A', 'B', 'AB', 'O'])
})
it('should contain expected Chinese labels', () => {
const labels = BLOOD_TYPE_OPTIONS.map((o) => o.label)
expect(labels).toEqual(['A 型', 'B 型', 'AB 型', 'O 型'])
})
})
describe('STATUS_OPTIONS', () => {
it('should be an array with 4 items', () => {
expect(STATUS_OPTIONS).toBeInstanceOf(Array)
expect(STATUS_OPTIONS).toHaveLength(4)
})
it('each item should have value and label string properties', () => {
for (const opt of STATUS_OPTIONS) {
expect(opt).toHaveProperty('value')
expect(opt).toHaveProperty('label')
expect(typeof opt.value).toBe('string')
expect(typeof opt.label).toBe('string')
}
})
it('should include an empty-string value for "all statuses" filter', () => {
const allOption = STATUS_OPTIONS.find((o) => o.value === '')
expect(allOption).toBeDefined()
expect(allOption!.label).toBe('全部状态')
})
it('should contain expected status values', () => {
const values = STATUS_OPTIONS.map((o) => o.value)
expect(values).toEqual(['', 'active', 'inactive', 'deceased'])
})
})