// @vitest-environment jsdom
import type { ReactElement } from 'react';
import { describe, expect, it } from 'vitest';
import { render, screen } from '@testing-library/react';
import '@testing-library/jest-dom/vitest';
import { svgRenderer } from '../svg';
import type { RenderCtx } from '../types';
const ctx: RenderCtx = {
contentType: 'image/svg+xml',
url: 'https://example.com/icon.svg',
};
const SVG_SOURCE =
'';
const renderSvg = (view: 'preview' | 'raw', body = SVG_SOURCE) =>
render(svgRenderer.render({ view, body, ctx }) as ReactElement);
describe('svgRenderer', () => {
it('declares both preview and raw views with preview as default', () => {
expect(svgRenderer.views).toEqual(['preview', 'raw']);
expect(svgRenderer.defaultView).toBe('preview');
});
it('does not support override (keeps parity with binary image semantics)', () => {
expect(svgRenderer.supportsOverride).toBe(false);
});
it('renders an with a utf8 data URL in preview — never base64', () => {
renderSvg('preview');
const img = screen.getByRole('img');
const src = img.getAttribute('src') ?? '';
expect(src.startsWith('data:image/svg+xml;utf8,')).toBe(true);
// The encoded payload must round-trip back to the original source —
// proves we URL-encoded the SVG text rather than dropping it.
const encoded = src.slice('data:image/svg+xml;utf8,'.length);
expect(decodeURIComponent(encoded)).toBe(SVG_SOURCE);
});
it('renders the SVG source verbatim (not base64) in raw view', () => {
renderSvg('raw');
expect(screen.queryByRole('img')).toBeNull();
expect(screen.getByText(SVG_SOURCE)).toBeInTheDocument();
});
});