import { describe, it, expect } from 'vitest'; import { renderCustomEmojis, isCustomEmojiAlt } from './customEmoji'; import type { SpaceEmoji } from '../api/client'; const emoji = (name: string): SpaceEmoji => ({ id: '1', spaceId: 's', name, filename: `${name}.png`, uploaderId: null, createdAt: 0, }); const lookup = (n: string) => (n === 'trollface' ? emoji('trollface') : undefined); const urlOf = (f: string) => `/api/uploads/${f}`; describe('renderCustomEmojis', () => { it('troca um emoji conhecido por imagem', () => { expect(renderCustomEmojis('olha :trollface: isso', lookup, urlOf)) .toBe('olha ![:trollface:](/api/uploads/trollface.png) isso'); }); it('deixa nome desconhecido como texto', () => { expect(renderCustomEmojis('nada :inexistente: aqui', lookup, urlOf)) .toBe('nada :inexistente: aqui'); }); it('não mexe em código em linha', () => { // Quem escreveu entre crases quis mostrar o texto literal. expect(renderCustomEmojis('use `:trollface:` assim', lookup, urlOf)) .toBe('use `:trollface:` assim'); }); it('não mexe em bloco de código', () => { const src = '```\n:trollface:\n```'; expect(renderCustomEmojis(src, lookup, urlOf)).toBe(src); }); it('devolve o texto intacto quando não há dois-pontos', () => { expect(renderCustomEmojis('sem nada', lookup, urlOf)).toBe('sem nada'); }); }); describe('isCustomEmojiAlt', () => { it('reconhece o alt de emoji e ignora imagem comum', () => { expect(isCustomEmojiAlt(':trollface:')).toBe(true); expect(isCustomEmojiAlt('foto de praia')).toBe(false); expect(isCustomEmojiAlt(undefined)).toBe(false); }); });