Files
Genarrative/src/services/image-editor/editorImageReference.test.ts
T
kdletters 6bf8b0051b 完善画板生成器与素材导出体验
图片改造改为独立 quick-edit 生成器占位并补齐提交链路
生成完成应用项目快照后同步刷新素材库
序列帧导出补充 Spine JSON 与独立验证器
序列帧播放预加载帧资源以减少加载闪烁
本地 dev 默认启用 all 进程角色并更新文档
2026-06-25 00:12:21 +08:00

77 lines
2.1 KiB
TypeScript

import { afterEach, describe, expect, it, vi } from 'vitest';
import {
compressEditorImageReferenceDataUrlForGeneration,
resolveEditorImageReferenceDataUrl,
} from './editorImageReference';
describe('editorImageReference', () => {
afterEach(() => {
vi.useRealTimers();
vi.restoreAllMocks();
vi.unstubAllGlobals();
});
it('passes through base64 image data urls without fetching', async () => {
vi.spyOn(globalThis, 'fetch');
await expect(
resolveEditorImageReferenceDataUrl('data:image/png;base64,c291cmNl'),
).resolves.toBe('data:image/png;base64,c291cmNl');
expect(globalThis.fetch).not.toHaveBeenCalled();
});
it('converts public image paths to base64 image data urls', async () => {
vi.spyOn(globalThis, 'fetch').mockResolvedValue(
new Response(new Uint8Array([104, 101, 108, 108, 111]), {
status: 200,
headers: {
'Content-Type': 'image/webp',
},
}),
);
await expect(
resolveEditorImageReferenceDataUrl(
'/creation-type-references/puzzle.webp',
),
).resolves.toBe('data:image/webp;base64,aGVsbG8=');
});
it('keeps generation references unchanged when browser canvas is unavailable', async () => {
await expect(
compressEditorImageReferenceDataUrlForGeneration(
'data:image/png;base64,large-reference',
),
).resolves.toBe('data:image/png;base64,large-reference');
});
it('falls back to the original generation reference when browser image decoding stalls', async () => {
vi.useFakeTimers();
vi.stubGlobal('document', {
createElement: vi.fn(),
} as unknown as Document);
vi.stubGlobal(
'Image',
class PendingImage {
onload: (() => void) | null = null;
onerror: (() => void) | null = null;
set src(_value: string) {
void _value;
}
} as unknown as typeof Image,
);
const result = compressEditorImageReferenceDataUrlForGeneration(
'data:image/png;base64,pending-reference',
);
vi.advanceTimersByTime(251);
await expect(result).resolves.toBe(
'data:image/png;base64,pending-reference',
);
});
});