mirror of
https://github.com/sky-systems/sky_phone.git
synced 2026-09-04 01:03:25 +00:00
89 lines
2.6 KiB
TypeScript
89 lines
2.6 KiB
TypeScript
import { readFileSync } from 'node:fs'
|
|
|
|
import { createSSRApp, h } from 'vue'
|
|
import { renderToString } from 'vue/server-renderer'
|
|
import { describe, expect, it } from 'vitest'
|
|
|
|
import SkyStatusCard from '@/ui/controls/SkyStatusCard.vue'
|
|
|
|
const controlsStyles = readFileSync(
|
|
new URL('../controls.css', import.meta.url),
|
|
'utf8',
|
|
)
|
|
|
|
describe('SkyStatusCard', () => {
|
|
it('renders a textual live status with a semantic tone and indicator', async () => {
|
|
const app = createSSRApp({
|
|
render: () =>
|
|
h(
|
|
SkyStatusCard,
|
|
{
|
|
indicator: true,
|
|
ariaLive: 'polite',
|
|
subtitle: 'Yaca',
|
|
title: 'Connected to 120.5 MHz',
|
|
tone: 'success',
|
|
},
|
|
{ icon: () => h('svg', { 'aria-hidden': 'true' }) },
|
|
),
|
|
})
|
|
|
|
const html = await renderToString(app)
|
|
|
|
expect(html).toContain('role="status"')
|
|
expect(html).toContain('aria-live="polite"')
|
|
expect(html).toContain('aria-atomic="true"')
|
|
expect(html).toContain('sky-status-card--success')
|
|
expect(html).toContain('sky-status-card__indicator')
|
|
expect(html).toContain('Connected to 120.5 MHz')
|
|
expect(html).toContain('Yaca')
|
|
})
|
|
|
|
it('keeps an indicator in the right-hand column when no icon is present', async () => {
|
|
const app = createSSRApp({
|
|
render: () =>
|
|
h(SkyStatusCard, {
|
|
indicator: true,
|
|
subtitle: 'Sky-only status primitive',
|
|
title: 'Ready',
|
|
tone: 'success',
|
|
}),
|
|
})
|
|
|
|
const html = await renderToString(app)
|
|
const statusCardRule = controlsStyles.match(
|
|
/\.sky-status-card\s*\{([^}]*)\}/s,
|
|
)?.[1]
|
|
|
|
expect(html).toContain('sky-status-card__indicator')
|
|
expect(statusCardRule).toContain('display: flex')
|
|
expect(statusCardRule).not.toContain('grid-template-columns')
|
|
expect(controlsStyles).toMatch(
|
|
/\.sky-status-card__copy\s*\{[^}]*flex:\s*1 1 auto;/s,
|
|
)
|
|
expect(controlsStyles).toMatch(
|
|
/\.sky-status-card__indicator\s*\{[^}]*flex:\s*none;/s,
|
|
)
|
|
})
|
|
|
|
it('prefers a trailing slot over the indicator', async () => {
|
|
const app = createSSRApp({
|
|
render: () =>
|
|
h(
|
|
SkyStatusCard,
|
|
{ indicator: true, title: 'Connected' },
|
|
{ trailing: () => h('span', '120.5 MHz') },
|
|
),
|
|
})
|
|
|
|
const html = await renderToString(app)
|
|
|
|
expect(html).toContain('sky-status-card__trailing')
|
|
expect(html).toContain('120.5 MHz')
|
|
expect(html).not.toContain('sky-status-card__indicator')
|
|
expect(controlsStyles).toMatch(
|
|
/\.sky-status-card__trailing\s*\{[^}]*flex:\s*none;/s,
|
|
)
|
|
})
|
|
})
|