import { render, screen } from '@testing-library/react' import { describe, it, expect, vi } from 'vitest' import type { ChainEntry } from '../../api/certificates' import CertificateChainViewer from '../CertificateChainViewer' vi.mock('react-i18next', () => ({ useTranslation: () => ({ t: (key: string) => key, i18n: { language: 'en', changeLanguage: vi.fn() }, }), })) function makeChain(count: number): ChainEntry[] { return Array.from({ length: count }, (_, i) => ({ subject: `Subject ${i}`, issuer: `Issuer ${i}`, expires_at: '2026-06-01T00:00:00Z', })) } describe('CertificateChainViewer', () => { it('renders empty state when chain is empty', () => { render() expect(screen.getByText('certificates.noChainData')).toBeTruthy() }) it('renders single entry as leaf', () => { render() expect(screen.getByText('certificates.chainLeaf')).toBeTruthy() expect(screen.getByText('Subject 0')).toBeTruthy() }) it('renders two entries as leaf + root', () => { render() expect(screen.getByText('certificates.chainLeaf')).toBeTruthy() expect(screen.getByText('certificates.chainRoot')).toBeTruthy() }) it('renders three entries as leaf + intermediate + root', () => { render() expect(screen.getByText('certificates.chainLeaf')).toBeTruthy() expect(screen.getByText('certificates.chainIntermediate')).toBeTruthy() expect(screen.getByText('certificates.chainRoot')).toBeTruthy() }) it('displays issuer for each entry', () => { render() expect(screen.getByText(/Issuer 0/)).toBeTruthy() expect(screen.getByText(/Issuer 1/)).toBeTruthy() }) it('displays formatted expiration dates', () => { render() const dateStr = new Date('2026-06-01T00:00:00Z').toLocaleDateString() expect(screen.getByText(new RegExp(dateStr))).toBeTruthy() }) it('uses list role with list items', () => { render() expect(screen.getByRole('list')).toBeTruthy() expect(screen.getAllByRole('listitem')).toHaveLength(2) }) it('has aria-label on list', () => { render() expect(screen.getByRole('list').getAttribute('aria-label')).toBe( 'certificates.certificateChain', ) }) })