import { mount } from '@vue/test-utils' import { describe, expect, it } from 'vitest' import { createI18n } from 'vue-i18n' import CompletionSummaryBanner from './CompletionSummaryBanner.vue' const i18n = createI18n({ legacy: false, locale: 'en', messages: { en: { sideToolbar: { queueProgressOverlay: { jobsCompleted: '{count} job completed | {count} jobs completed', jobsFailed: '{count} job failed | {count} jobs failed' } } } } }) const mountComponent = (props: Record) => mount(CompletionSummaryBanner, { props: { mode: 'allSuccess', completedCount: 0, failedCount: 0, ...props }, global: { plugins: [i18n] } }) describe('CompletionSummaryBanner', () => { it('renders success mode text, thumbnails, and aria label', () => { const wrapper = mountComponent({ mode: 'allSuccess', completedCount: 3, failedCount: 0, thumbnailUrls: [ 'https://example.com/thumb-a.png', 'https://example.com/thumb-b.png' ], ariaLabel: 'Open queue summary' }) const button = wrapper.get('button') expect(button.attributes('aria-label')).toBe('Open queue summary') expect(wrapper.text()).toContain('3 jobs completed') const thumbnailImages = wrapper.findAll('img') expect(thumbnailImages).toHaveLength(2) expect(thumbnailImages[0].attributes('src')).toBe( 'https://example.com/thumb-a.png' ) expect(thumbnailImages[1].attributes('src')).toBe( 'https://example.com/thumb-b.png' ) const thumbnailContainers = wrapper.findAll('.inline-block.h-6.w-6') expect(thumbnailContainers[1].attributes('style')).toContain( 'margin-left: -12px' ) expect(wrapper.html()).not.toContain('icon-[lucide--circle-alert]') }) it('renders mixed mode with success and failure counts', () => { const wrapper = mountComponent({ mode: 'mixed', completedCount: 2, failedCount: 1 }) const summaryText = wrapper.text().replace(/\s+/g, ' ').trim() expect(summaryText).toContain('2 jobs completed, 1 job failed') }) it('renders failure mode icon without thumbnails', () => { const wrapper = mountComponent({ mode: 'allFailed', completedCount: 0, failedCount: 4 }) expect(wrapper.text()).toContain('4 jobs failed') expect(wrapper.html()).toContain('icon-[lucide--circle-alert]') expect(wrapper.findAll('img')).toHaveLength(0) }) })