// Mock Services to éviter les imports lourds (router/token/jose) lors de ces tests jest.mock('../../src/services/service', () => { class ServicesMock { static async getInstance() { return new ServicesMock(); } } return { __esModule: true, default: ServicesMock }; }); import { generateEmojiList, addressToEmoji } from '../../src/utils/sp-address.utils'; describe('sp-address.utils', () => { describe('generateEmojiList', () => { it('retourne exactement 256 emojis', () => { const list = generateEmojiList(); expect(Array.isArray(list)).toBe(true); expect(list.length).toBe(256); expect(list.every((e) => typeof e === 'string' && e.length > 0)).toBe(true); }); }); describe('addressToEmoji', () => { const mockDigest = jest.fn(async (algorithm: string, data: ArrayBuffer) => { // Retourne un buffer de 32 octets avec un motif déterministe basé sur la longueur const len = (data as Uint8Array).byteLength || new Uint8Array(data).byteLength; const out = new Uint8Array(32).map((_, i) => (i * 7 + len) % 256); return out.buffer; }); beforeAll(() => { // @ts-ignore if (!global.crypto) { // @ts-ignore global.crypto = {}; } // @ts-ignore global.crypto.subtle = { digest: mockDigest } as any; }); it('est déterministe pour une même adresse', async () => { const addr = 'sp1qexampleaddress0001'; const a = await addressToEmoji(addr); const b = await addressToEmoji(addr); expect(a).toBe(b); expect(a.length).toBeGreaterThan(0); }); it('retourne une chaîne d’emojis de longueur > 0', async () => { const a = await addressToEmoji('sp1qexampleA'); expect(typeof a).toBe('string'); expect(a.length).toBeGreaterThan(0); }); }); });