// @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, IconFolderClose16, 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 P-I set (43 deepsuite + 12 figma extracts)', () => { expect(iconNames.length).toBe(55) }) 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('native defaults: 14-glyphs default 14, 16-glyphs default 16', () => { const api = render() expect(api.container.querySelector('svg')!.getAttribute('width')).toBe('14') const folder = render() expect(folder.container.querySelector('svg')!.getAttribute('width')).toBe('16') }) }) 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') }) })