/* @vitest-environment jsdom */ import { afterEach, describe, expect, it, vi } from 'vitest'; import type { CanvasLayer } from './ImageCanvasEditorTypes'; import { createProjectCoverSnapshotBlob } from './ImageCanvasProjectCoverSnapshotRenderer'; function layer(overrides: Partial = {}): CanvasLayer { return { id: 'layer-offscreen', resourceId: 'resource-offscreen', title: '离屏图层', src: '/generated/offscreen.webp', x: 10_000, y: 10_000, width: 320, height: 240, originalWidth: 320, originalHeight: 240, zIndex: 1, sourceType: 'generated', ...overrides, }; } describe('ImageCanvasProjectCoverSnapshotRenderer', () => { afterEach(() => { vi.restoreAllMocks(); }); it('exports the canvas background when every drawable layer is outside the cover frame', async () => { const fillRect = vi.fn(); const drawImage = vi.fn(); vi.spyOn(HTMLCanvasElement.prototype, 'getContext').mockReturnValue({ fillRect, drawImage, fillStyle: '', } as unknown as CanvasRenderingContext2D); vi.spyOn(HTMLCanvasElement.prototype, 'toBlob').mockImplementation( (callback) => callback(new Blob(['cover'], { type: 'image/webp' })), ); const blob = await createProjectCoverSnapshotBlob({ layers: [layer()], viewport: { x: 0, y: 0, scale: 1 }, viewportSize: { width: 1280, height: 960 }, backgroundColor: '#f8fafc', }); expect(blob?.type).toBe('image/webp'); expect(fillRect).toHaveBeenCalledWith(0, 0, 320, 240); expect(drawImage).not.toHaveBeenCalled(); }); });