test(10-01): add failing AppIcon tests for icon registry contract

- 6 tests covering name→path rendering, class forwarding, dual-path (cog), svg attrs, unknown-name warn, and path stroke attrs
- RED phase: AppIcon.vue does not exist yet; tests fail on import
This commit is contained in:
curo1305
2026-06-15 20:09:21 +02:00
parent d3d3f711eb
commit 4a45dd4801
@@ -0,0 +1,56 @@
import { describe, it, expect, vi, beforeEach } from 'vitest'
import { mount } from '@vue/test-utils'
import AppIcon from '../AppIcon.vue'
describe('AppIcon', () => {
beforeEach(() => {
vi.restoreAllMocks()
})
it('renders <svg> with the correct d attribute for a known single-path icon (folder)', () => {
const wrapper = mount(AppIcon, { props: { name: 'folder' } })
const path = wrapper.find('path')
expect(path.exists()).toBe(true)
expect(path.attributes('d')).toMatch(/^M3 7a2 2 0 012-2h4l2 2h8a2 2 0 012 2v9/)
})
it('forwards consumer class to the <svg> element', () => {
const wrapper = mount(AppIcon, {
props: { name: 'folder' },
attrs: { class: 'w-4 h-4 text-amber-500' },
})
const svg = wrapper.find('svg')
expect(svg.classes()).toContain('w-4')
expect(svg.classes()).toContain('h-4')
expect(svg.classes()).toContain('text-amber-500')
})
it('renders TWO <path> elements for a dual-path icon (cog)', () => {
const wrapper = mount(AppIcon, { props: { name: 'cog' } })
expect(wrapper.findAll('path').length).toBe(2)
})
it('renders the standard SVG attrs (fill=none, stroke=currentColor, viewBox=0 0 24 24)', () => {
const wrapper = mount(AppIcon, { props: { name: 'folder' } })
const svg = wrapper.find('svg')
expect(svg.attributes('fill')).toBe('none')
expect(svg.attributes('stroke')).toBe('currentColor')
expect(svg.attributes('viewBox')).toBe('0 0 24 24')
})
it('renders no svg and calls console.warn when name is unknown', () => {
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {})
const wrapper = mount(AppIcon, { props: { name: 'bogus-name' } })
expect(wrapper.find('svg').exists()).toBe(false)
expect(warnSpy).toHaveBeenCalledOnce()
expect(warnSpy.mock.calls[0][0]).toContain('bogus-name')
})
it('path elements use stroke-linecap=round, stroke-linejoin=round, stroke-width=2', () => {
const wrapper = mount(AppIcon, { props: { name: 'folder' } })
const path = wrapper.find('path')
expect(path.attributes('stroke-linecap')).toBe('round')
expect(path.attributes('stroke-linejoin')).toBe('round')
expect(path.attributes('stroke-width')).toBe('2')
})
})