test(web): 添加 vitest 单元测试基础设施和初始测试用例
- 安装 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:
85
apps/web/src/constants/health.test.ts
Normal file
85
apps/web/src/constants/health.test.ts
Normal 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'])
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user