mirror of
https://github.com/mastodon/mastodon.git
synced 2025-10-05 16:42:47 +00:00
This commit is contained in:
parent
63bfd738e9
commit
6cd187eb36
|
@ -5,11 +5,8 @@ import { flattenEmojiData } from 'emojibase';
|
||||||
import unicodeRawEmojis from 'emojibase-data/en/data.json';
|
import unicodeRawEmojis from 'emojibase-data/en/data.json';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
unicodeHexToUrl,
|
|
||||||
twemojiToUnicodeInfo,
|
twemojiToUnicodeInfo,
|
||||||
unicodeToTwemojiHex,
|
unicodeToTwemojiHex,
|
||||||
CODES_WITH_DARK_BORDER,
|
|
||||||
CODES_WITH_LIGHT_BORDER,
|
|
||||||
emojiToUnicodeHex,
|
emojiToUnicodeHex,
|
||||||
} from './normalize';
|
} from './normalize';
|
||||||
|
|
||||||
|
@ -57,26 +54,6 @@ describe('unicodeToTwemojiHex', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('twemojiHasBorder', () => {
|
|
||||||
test.concurrent.for(
|
|
||||||
svgFileNames
|
|
||||||
.filter((file) => file.endsWith('_border'))
|
|
||||||
.map((file) => {
|
|
||||||
const hexCode = file.replace('_border', '');
|
|
||||||
return [
|
|
||||||
hexCode,
|
|
||||||
CODES_WITH_LIGHT_BORDER.includes(hexCode.toUpperCase()),
|
|
||||||
CODES_WITH_DARK_BORDER.includes(hexCode.toUpperCase()),
|
|
||||||
] as const;
|
|
||||||
}),
|
|
||||||
)('twemojiHasBorder for %s', ([hexCode, isLight, isDark], { expect }) => {
|
|
||||||
const result = unicodeHexToUrl(hexCode, isDark);
|
|
||||||
expect(result).toHaveProperty('hexCode', hexCode);
|
|
||||||
expect(result).toHaveProperty('hasLightBorder', isLight);
|
|
||||||
expect(result).toHaveProperty('hasDarkBorder', isDark);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('twemojiToUnicodeInfo', () => {
|
describe('twemojiToUnicodeInfo', () => {
|
||||||
const unicodeCodeSet = new Set(unicodeEmojis.map((emoji) => emoji.hexcode));
|
const unicodeCodeSet = new Set(unicodeEmojis.map((emoji) => emoji.hexcode));
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
import { customEmojiFactory, unicodeEmojiFactory } from '@/testing/factories';
|
import { customEmojiFactory, unicodeEmojiFactory } from '@/testing/factories';
|
||||||
|
|
||||||
import {
|
import { EMOJI_MODE_TWEMOJI } from './constants';
|
||||||
EMOJI_MODE_NATIVE,
|
|
||||||
EMOJI_MODE_NATIVE_WITH_FLAGS,
|
|
||||||
EMOJI_MODE_TWEMOJI,
|
|
||||||
} from './constants';
|
|
||||||
import * as db from './database';
|
import * as db from './database';
|
||||||
import {
|
import {
|
||||||
emojifyElement,
|
emojifyElement,
|
||||||
|
@ -12,7 +8,7 @@ import {
|
||||||
testCacheClear,
|
testCacheClear,
|
||||||
tokenizeText,
|
tokenizeText,
|
||||||
} from './render';
|
} from './render';
|
||||||
import type { EmojiAppState, ExtraCustomEmojiMap } from './types';
|
import type { EmojiAppState } from './types';
|
||||||
|
|
||||||
function mockDatabase() {
|
function mockDatabase() {
|
||||||
return {
|
return {
|
||||||
|
@ -40,18 +36,6 @@ const expectedSmileImage =
|
||||||
'<img draggable="false" class="emojione" alt="😊" title="smiling face with smiling eyes" src="/emoji/1f60a.svg">';
|
'<img draggable="false" class="emojione" alt="😊" title="smiling face with smiling eyes" src="/emoji/1f60a.svg">';
|
||||||
const expectedFlagImage =
|
const expectedFlagImage =
|
||||||
'<img draggable="false" class="emojione" alt="🇪🇺" title="flag-eu" src="/emoji/1f1ea-1f1fa.svg">';
|
'<img draggable="false" class="emojione" alt="🇪🇺" title="flag-eu" src="/emoji/1f1ea-1f1fa.svg">';
|
||||||
const expectedCustomEmojiImage =
|
|
||||||
'<img draggable="false" class="emojione custom-emoji" alt=":custom:" title=":custom:" src="emoji/custom/static" data-original="emoji/custom" data-static="emoji/custom/static">';
|
|
||||||
const expectedRemoteCustomEmojiImage =
|
|
||||||
'<img draggable="false" class="emojione custom-emoji" alt=":remote:" title=":remote:" src="remote.social/static" data-original="remote.social/custom" data-static="remote.social/static">';
|
|
||||||
|
|
||||||
const mockExtraCustom: ExtraCustomEmojiMap = {
|
|
||||||
remote: {
|
|
||||||
shortcode: 'remote',
|
|
||||||
static_url: 'remote.social/static',
|
|
||||||
url: 'remote.social/custom',
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
function testAppState(state: Partial<EmojiAppState> = {}) {
|
function testAppState(state: Partial<EmojiAppState> = {}) {
|
||||||
return {
|
return {
|
||||||
|
@ -86,64 +70,10 @@ describe('emojifyElement', () => {
|
||||||
'en',
|
'en',
|
||||||
);
|
);
|
||||||
expect(searchCustomEmojisByShortcodes).toHaveBeenCalledExactlyOnceWith([
|
expect(searchCustomEmojisByShortcodes).toHaveBeenCalledExactlyOnceWith([
|
||||||
'custom',
|
':custom:',
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('emojifies custom emoji in native mode', async () => {
|
|
||||||
const { searchEmojisByHexcodes } = mockDatabase();
|
|
||||||
const actual = await emojifyElement(
|
|
||||||
testElement(),
|
|
||||||
testAppState({ mode: EMOJI_MODE_NATIVE }),
|
|
||||||
);
|
|
||||||
assert(actual);
|
|
||||||
expect(actual.innerHTML).toBe(
|
|
||||||
`<p>Hello 😊🇪🇺!</p><p>${expectedCustomEmojiImage}</p>`,
|
|
||||||
);
|
|
||||||
expect(searchEmojisByHexcodes).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('emojifies flag emoji in native-with-flags mode', async () => {
|
|
||||||
const { searchEmojisByHexcodes } = mockDatabase();
|
|
||||||
const actual = await emojifyElement(
|
|
||||||
testElement(),
|
|
||||||
testAppState({ mode: EMOJI_MODE_NATIVE_WITH_FLAGS }),
|
|
||||||
);
|
|
||||||
assert(actual);
|
|
||||||
expect(actual.innerHTML).toBe(
|
|
||||||
`<p>Hello 😊${expectedFlagImage}!</p><p>${expectedCustomEmojiImage}</p>`,
|
|
||||||
);
|
|
||||||
expect(searchEmojisByHexcodes).toHaveBeenCalledOnce();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('emojifies everything in twemoji mode', async () => {
|
|
||||||
const { searchCustomEmojisByShortcodes, searchEmojisByHexcodes } =
|
|
||||||
mockDatabase();
|
|
||||||
const actual = await emojifyElement(testElement(), testAppState());
|
|
||||||
assert(actual);
|
|
||||||
expect(actual.innerHTML).toBe(
|
|
||||||
`<p>Hello ${expectedSmileImage}${expectedFlagImage}!</p><p>${expectedCustomEmojiImage}</p>`,
|
|
||||||
);
|
|
||||||
expect(searchEmojisByHexcodes).toHaveBeenCalledOnce();
|
|
||||||
expect(searchCustomEmojisByShortcodes).toHaveBeenCalledOnce();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('emojifies with provided custom emoji', async () => {
|
|
||||||
const { searchCustomEmojisByShortcodes, searchEmojisByHexcodes } =
|
|
||||||
mockDatabase();
|
|
||||||
const actual = await emojifyElement(
|
|
||||||
testElement('<p>hi :remote:</p>'),
|
|
||||||
testAppState(),
|
|
||||||
mockExtraCustom,
|
|
||||||
);
|
|
||||||
assert(actual);
|
|
||||||
expect(actual.innerHTML).toBe(
|
|
||||||
`<p>hi ${expectedRemoteCustomEmojiImage}</p>`,
|
|
||||||
);
|
|
||||||
expect(searchEmojisByHexcodes).not.toHaveBeenCalled();
|
|
||||||
expect(searchCustomEmojisByShortcodes).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('returns null when no emoji are found', async () => {
|
test('returns null when no emoji are found', async () => {
|
||||||
mockDatabase();
|
mockDatabase();
|
||||||
const actual = await emojifyElement(
|
const actual = await emojifyElement(
|
||||||
|
@ -165,28 +95,9 @@ describe('emojifyText', () => {
|
||||||
const actual = await emojifyText('Hello 😊🇪🇺!', testAppState());
|
const actual = await emojifyText('Hello 😊🇪🇺!', testAppState());
|
||||||
expect(actual).toBe(`Hello ${expectedSmileImage}${expectedFlagImage}!`);
|
expect(actual).toBe(`Hello ${expectedSmileImage}${expectedFlagImage}!`);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('renders custom emojis', async () => {
|
|
||||||
mockDatabase();
|
|
||||||
const actual = await emojifyText('Hello :custom:!', testAppState());
|
|
||||||
expect(actual).toBe(`Hello ${expectedCustomEmojiImage}!`);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('renders provided extra emojis', async () => {
|
|
||||||
const actual = await emojifyText(
|
|
||||||
'remote emoji :remote:',
|
|
||||||
testAppState(),
|
|
||||||
mockExtraCustom,
|
|
||||||
);
|
|
||||||
expect(actual).toBe(`remote emoji ${expectedRemoteCustomEmojiImage}`);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('tokenizeText', () => {
|
describe('tokenizeText', () => {
|
||||||
test('returns empty array for string with only whitespace', () => {
|
|
||||||
expect(tokenizeText(' \n')).toEqual([]);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('returns an array of text to be a single token', () => {
|
test('returns an array of text to be a single token', () => {
|
||||||
expect(tokenizeText('Hello')).toEqual(['Hello']);
|
expect(tokenizeText('Hello')).toEqual(['Hello']);
|
||||||
});
|
});
|
||||||
|
@ -212,7 +123,7 @@ describe('tokenizeText', () => {
|
||||||
'Hello ',
|
'Hello ',
|
||||||
{
|
{
|
||||||
type: 'custom',
|
type: 'custom',
|
||||||
code: 'smile',
|
code: ':smile:',
|
||||||
},
|
},
|
||||||
'!!',
|
'!!',
|
||||||
]);
|
]);
|
||||||
|
@ -223,7 +134,7 @@ describe('tokenizeText', () => {
|
||||||
'Hello ',
|
'Hello ',
|
||||||
{
|
{
|
||||||
type: 'custom',
|
type: 'custom',
|
||||||
code: 'smile_123',
|
code: ':smile_123:',
|
||||||
},
|
},
|
||||||
'!!',
|
'!!',
|
||||||
]);
|
]);
|
||||||
|
@ -239,7 +150,7 @@ describe('tokenizeText', () => {
|
||||||
' ',
|
' ',
|
||||||
{
|
{
|
||||||
type: 'custom',
|
type: 'custom',
|
||||||
code: 'smile',
|
code: ':smile:',
|
||||||
},
|
},
|
||||||
'!!',
|
'!!',
|
||||||
]);
|
]);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user