skillhub/web/src/shared/ui/button.test.ts
dongmucat e5a3aa6006 test(web): add colocated frontend coverage
变更摘要:
- 将前端测试共置到 web/src,保留并迁移 app 样式相关用例
- 为 pages、features、shared UI 与 hooks 补齐大范围 Vitest 覆盖
- 强化 governance、file preview、namespace header 与 API client 的关键分支测试
- 重新验证 pnpm run test 与 pnpm run typecheck,当前均已通过

关键文件:
- web/src/pages/dashboard/governance.test.ts
- web/src/features/governance/governance-inbox.test.ts
- web/src/features/skill/file-preview-dialog.test.ts
- web/src/features/namespace/namespace-header.test.ts
- web/src/api/client.test.ts
2026-03-23 16:13:34 +08:00

62 lines
2 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import { buttonVariants } from './button'
describe('buttonVariants', () => {
it('applies default variant and size classes', () => {
const classes = buttonVariants()
expect(classes).toContain('bg-brand-gradient')
expect(classes).toContain('h-10')
expect(classes).toContain('px-5')
})
it('applies destructive variant classes', () => {
const classes = buttonVariants({ variant: 'destructive' })
expect(classes).toContain('bg-destructive')
})
it('applies outline variant classes', () => {
const classes = buttonVariants({ variant: 'outline' })
expect(classes).toContain('border')
expect(classes).toContain('bg-transparent')
})
it('applies secondary variant classes', () => {
const classes = buttonVariants({ variant: 'secondary' })
expect(classes).toContain('bg-secondary')
})
it('applies ghost variant classes', () => {
const classes = buttonVariants({ variant: 'ghost' })
expect(classes).toContain('hover:bg-secondary')
})
it('applies link variant classes', () => {
const classes = buttonVariants({ variant: 'link' })
expect(classes).toContain('underline-offset-4')
})
it('applies sm size classes', () => {
const classes = buttonVariants({ size: 'sm' })
expect(classes).toContain('h-8')
expect(classes).toContain('text-xs')
})
it('applies lg size classes', () => {
const classes = buttonVariants({ size: 'lg' })
expect(classes).toContain('h-12')
expect(classes).toContain('text-base')
})
it('applies icon size classes', () => {
const classes = buttonVariants({ size: 'icon' })
expect(classes).toContain('h-10')
expect(classes).toContain('w-10')
})
it('always includes base focus-visible and disabled styles', () => {
const classes = buttonVariants()
expect(classes).toContain('focus-visible:outline-none')
expect(classes).toContain('disabled:pointer-events-none')
expect(classes).toContain('disabled:opacity-50')
})
})