From b0f253a3e14dd30b899fca3f3f2050fa9e18f5a0 Mon Sep 17 00:00:00 2001 From: Imaan Date: Wed, 13 May 2026 13:55:06 -0400 Subject: [PATCH] test: cover interface primitive components --- .../interface/components/primitives.test.tsx | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 plugins/interface/components/primitives.test.tsx diff --git a/plugins/interface/components/primitives.test.tsx b/plugins/interface/components/primitives.test.tsx new file mode 100644 index 0000000..0e26beb --- /dev/null +++ b/plugins/interface/components/primitives.test.tsx @@ -0,0 +1,165 @@ +import { describe, expect, it } from 'vitest' +import { renderToString } from 'hono/jsx/dom/server' +import { Avatar } from './avatar' +import { Card } from './card' +import { Input } from './input/Input' +import { Label } from './label/Label' +import { Loader } from './loader/Loader' +import { Toggle } from './toggle' +import { cn, getAssetImportTagsFromManifest } from '../utils' + +describe('interface primitives', () => { + it('merges Tailwind utility classes predictably', () => { + expect(cn('px-2 text-sm', false && 'hidden', 'px-4')).toBe( + 'text-sm px-4' + ) + }) + + it('renders avatar initials and image variants', () => { + const initialAvatar = renderToString( + + ) + expect(initialAvatar).toContain('O

') + + const imageAvatar = renderToString( + + ) + expect(imageAvatar).toContain(' { + const card = renderToString( + + Summary + + ) + expect(card).toContain('Summary') + + const linkCard = renderToString( + + Settings + + ) + expect(linkCard).toContain('Settings') + }) + + it('renders labels with conditional required copy', () => { + const invalidLabel = renderToString( + + ) + expect(invalidLabel).toContain(' + + + ) + expect(validLabel).not.toContain('text-ob-destructive') + }) + + it('renders loader sizing through inline styles', () => { + const loader = renderToString() + expect(loader).toContain(' { + const toggle = renderToString( + undefined} size="lg" toggled /> + ) + expect(toggle).toContain(' undefined} size="sm" toggled={false} /> + ) + expect(offToggle).toContain('h-5.5 w-8.5') + expect(offToggle).not.toContain('translate-x-full') + }) + + it('renders input standalone and decorated variants', () => { + const plainInput = renderToString( + + ) + expect(plainInput).toContain(' + ) + expect(decoratedInput).toContain('$') + expect(decoratedInput).toContain('value="42"') + expect(decoratedInput).toContain('>USD') + }) + + it('builds manifest import tags for a requested page', async () => { + const tags = await getAssetImportTagsFromManifest('template') + const html = renderToString(<>{tags}) + + expect(html).toContain('src="/assets/template.') + expect(html).toContain('src="/assets/vendor.') + expect(html).toContain('src="/assets/components.') + expect(html).toContain('href="/assets/template.') + expect(html).toContain('.css"') + expect(html).not.toContain('global') + }) +})