packages/mermaid-zenuml/src/zenumlRenderer.spec.ts
Rama develop · réplica de lectura del repositorio original.
import { vi } from 'vitest';
import { calculateSvgSizeAttrs } from './zenumlRenderer.js';
vi.mock('@zenuml/core', () => ({
renderToSvg: vi.fn((code: string) => ({
innerSvg: `<text>${code.trim()}</text>`,
width: 400,
height: 300,
viewBox: '0 0 400 300',
})),
}));
vi.mock('./mermaidUtils.js', () => ({
log: { info: vi.fn(), error: vi.fn(), debug: vi.fn(), warn: vi.fn() },
getConfig: vi.fn(() => ({
securityLevel: 'loose',
sequence: { useMaxWidth: true },
})),
}));
describe('calculateSvgSizeAttrs', function () {
it('should return responsive width when useMaxWidth is true', function () {
const attrs = calculateSvgSizeAttrs(133, 392, true);
expect(attrs.get('width')).toEqual('100%');
expect(attrs.get('style')).toEqual('max-width: 133px;');
expect(attrs.has('height')).toBe(false);
});
it('should return absolute dimensions when useMaxWidth is false', function () {
const attrs = calculateSvgSizeAttrs(133, 392, false);
expect(attrs.get('width')).toEqual('133');
expect(attrs.get('height')).toEqual('392');
expect(attrs.has('style')).toBe(false);
});
});
describe('draw', () => {
beforeEach(() => {
vi.clearAllMocks();
document.body.innerHTML = '';
});
it('should render SVG content into the target element', async () => {
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
svg.id = 'test-id';
document.body.appendChild(svg);
const { draw } = await import('./zenumlRenderer.js');
await draw('zenuml\n Alice->Bob: hello', 'test-id');
expect(svg.innerHTML).toContain('Alice-');
expect(svg.getAttribute('viewBox')).toBe('0 0 400 300');
expect(svg.getAttribute('width')).toBe('100%');
expect(svg.getAttribute('style')).toBe('max-width: 400px;');
});
it('should set absolute dimensions when useMaxWidth is false', async () => {
const { getConfig } = await import('./mermaidUtils.js');
vi.mocked(getConfig).mockReturnValue({
securityLevel: 'loose',
sequence: { useMaxWidth: false },
});
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
svg.id = 'test-abs';
document.body.appendChild(svg);
const { draw } = await import('./zenumlRenderer.js');
await draw('zenuml\n A->B: msg', 'test-abs');
expect(svg.getAttribute('width')).toBe('400');
expect(svg.getAttribute('height')).toBe('300');
});
it('should handle missing SVG element gracefully', async () => {
const { draw } = await import('./zenumlRenderer.js');
const { log } = await import('./mermaidUtils.js');
await draw('zenuml\n A->B: msg', 'nonexistent');
expect(log.error).toHaveBeenCalledWith('Cannot find svg element');
});
it('should strip the zenuml prefix before rendering', async () => {
const { renderToSvg } = await import('@zenuml/core');
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
svg.id = 'test-strip';
document.body.appendChild(svg);
const { draw } = await import('./zenumlRenderer.js');
await draw('zenuml\n Alice->Bob: hello', 'test-strip');
expect(renderToSvg).toHaveBeenCalledWith('\n Alice->Bob: hello');
});
});