// @vitest-environment jsdom import { cleanup, render } from '@testing-library/react' import { afterEach, describe, expect, it } from 'vitest' import * as primitives from '@deepseek-ai/dsh-client-ui-primitives' import { IconApiOutline14, IconArchiveOutline20, IconFolderClose16, IconGoalOutline16, IconSendOutline16, } from '@deepseek-ai/dsh-client-ui-primitives' afterEach(cleanup) // Icon components all share the IconProps signature; the barrel also exports // non-icon atoms (different props shapes), so filter by prefix BEFORE typing. const icons = Object.fromEntries( Object.entries(primitives).filter(([name]) => name.startsWith('Icon')), ) as Record React.JSX.Element> const iconNames = Object.keys(icons) describe('ic_ds_ icon set', () => { it('exports the full icon set (46 deepsuite + 20 figma extracts + four product glyphs outside those sets)', () => { expect(iconNames.length).toBe(70) }) it.each(iconNames)('%s renders an svg with currentColor fills and no hardcoded palette', (name) => { const Icon = icons[name]! const { container } = render() const svg = container.querySelector('svg') expect(svg).not.toBeNull() const markup = container.innerHTML expect(markup).not.toMatch(/#[0-9a-fA-F]{3,8}"/) expect(markup).toContain('currentColor') }) it('size and className props land on the root svg', () => { const { container } = render() const svg = container.querySelector('svg')! expect(svg.getAttribute('width')).toBe('20') expect(svg.getAttribute('height')).toBe('20') expect(svg.classList.contains('x')).toBe(true) }) it('each glyph defaults to its own drawn size, not one set-wide default', () => { const api = render() expect(api.container.querySelector('svg')!.getAttribute('width')).toBe('14') const folder = render() expect(folder.container.querySelector('svg')!.getAttribute('width')).toBe('16') const archive = render() expect(archive.container.querySelector('svg')!.getAttribute('width')).toBe('20') }) it('renders reusable goal glyphs without document-global ids', () => { const { container } = render(<>) expect(container.querySelector('[id]')).toBeNull() expect(container.querySelector('[clip-path]')).toBeNull() }) }) describe('FishLogo', () => { it('renders the fish path in currentColor at the native ratio', () => { const { container } = render() const svg = container.querySelector('svg')! expect(svg.getAttribute('width')).toBe('24') expect(Number(svg.getAttribute('height'))).toBeCloseTo(17.66, 1) expect(svg.getAttribute('viewBox')).toBe('0 0 23.16 17.04') expect(container.querySelectorAll('path')).toHaveLength(1) expect(container.innerHTML).toContain('currentColor') expect(container.innerHTML).not.toContain('M0 0L23.16') }) })