mattermost-mobile/app/utils/emoji_utils.test.js
Dean Whillier 4a51013316
[MM-13677] Fix to ensure unsupported unicode emoji can be rendered jumbo size (#2545)
* fixes unicode emoji not rendering jumbo

- replace inline emoji regex with npm emoji-regex library
- update notice.txt with emoji-regex license
- jumbo emoji issue automatically fixed with updated unicode emoji regex

* Add several tests specifically for 🤟emoji.
2019-02-05 11:58:07 -05:00

285 lines
10 KiB
JavaScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {doesMatchNamedEmoji, hasEmojisOnly} from './emoji_utils';
describe('hasEmojisOnly with named emojis', () => {
const testCases = [{
name: 'Named emoji',
message: ':smile:',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'Valid custom emoji',
message: ':valid_custom:',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'Invalid custom emoji',
message: ':invalid_custom:',
expected: {isEmojiOnly: false, shouldRenderJumboEmoji: false},
}, {
name: 'Named emojis',
message: ':smile: :heart:',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'Named emojis with white spaces',
message: ' :smile: :heart: ',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'Named emojis with potential custom emojis',
message: ':smile: :heart: :valid_custom: :one:',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'Named emojis of 4 plus invalid :exceed: named emoji',
message: ':smile: :heart: :valid_custom: :one: :exceed:',
expected: {isEmojiOnly: false, shouldRenderJumboEmoji: false},
}, {
name: 'Named emojis greater than max of 4',
message: ':smile: :heart: :valid_custom: :one: :heart:',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: false},
}, {
name: 'Not valid named emoji',
message: 'smile',
expected: {isEmojiOnly: false, shouldRenderJumboEmoji: false},
}, {
name: 'Not valid named emoji',
message: 'smile:',
expected: {isEmojiOnly: false, shouldRenderJumboEmoji: false},
}, {
name: 'Not valid named emoji',
message: ':smile',
expected: {isEmojiOnly: false, shouldRenderJumboEmoji: false},
}, {
name: 'Not valid named emoji',
message: ':smile::',
expected: {isEmojiOnly: false, shouldRenderJumboEmoji: false},
}, {
name: 'Not valid named emoji',
message: '::smile:',
expected: {isEmojiOnly: false, shouldRenderJumboEmoji: false},
}, {
name: 'Mixed valid and invalid named emojis',
message: ' :smile: invalid :heart: ',
expected: {isEmojiOnly: false, shouldRenderJumboEmoji: false},
}, {
name: 'This should render a codeblock instead',
message: ' :D',
expected: {isEmojiOnly: false, shouldRenderJumboEmoji: false},
}];
const customEmojis = new Map([['valid_custom', 0]]);
for (const testCase of testCases) {
it(`${testCase.name} - ${testCase.message}`, () => {
expect(hasEmojisOnly(testCase.message, customEmojis)).toEqual(testCase.expected);
});
}
});
describe('hasEmojisOnly with unicode emojis', () => {
const testCases = [{
name: 'Unicode emoji',
message: '👍',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'Unicode emoji',
message: '🙌',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'Unicode emoji',
message: '🤟',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'Unicode emojis',
message: '🙌 👏',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'Unicode emojis without whitespace in between',
message: '🙌👏',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'Unicode emojis without whitespace in between',
message: '🙌🤟',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'Unicode emojis with white spaces',
message: ' 😣 😖 ',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'Unicode emojis with white spaces',
message: ' 😣 🤟 ',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: '4 unicode emojis',
message: '😣 😖 🙌 👏',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'Unicode emojis greater than max of 4',
message: '😣 😖 🙌 👏 💩',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: false},
}, {
name: 'Unicode emoji',
message: '\ud83d\udd5f',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'Not valid unicode emoji',
message: '\ud83d\udd5fnotvalid',
expected: {isEmojiOnly: false, shouldRenderJumboEmoji: false},
}, {
name: 'Mixed valid and invalid unicode emojis',
message: '😣 invalid 😖',
expected: {isEmojiOnly: false, shouldRenderJumboEmoji: false},
}];
const customEmojis = new Map();
for (const testCase of testCases) {
it(`${testCase.name} - ${testCase.message}`, () => {
expect(hasEmojisOnly(testCase.message, customEmojis)).toEqual(testCase.expected);
});
}
});
describe('hasEmojisOnly with emoticons', () => {
const testCases = [{
name: 'Emoticon',
message: ':)',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'Emoticon',
message: ':+1:',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'Emoticons',
message: ':) :-o',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'Emoticons with white spaces',
message: ' :) :-o ',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: '4 emoticons',
message: ':) :-o :+1: :|',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'Emoticons greater than max of 4',
message: ':) :-o :+1: :| :p',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: false},
}, {
name: 'Not valid emoticon',
message: ':|:p',
expected: {isEmojiOnly: false, shouldRenderJumboEmoji: false},
}, {
name: 'Not valid named emoji',
message: ':) :-o :+1::|',
expected: {isEmojiOnly: false, shouldRenderJumboEmoji: false},
}, {
name: 'Mixed valid and invalid named emojis',
message: ':) :-o invalid :|',
expected: {isEmojiOnly: false, shouldRenderJumboEmoji: false},
}];
const customEmojis = new Map();
for (const testCase of testCases) {
it(`${testCase.name} - ${testCase.message}`, () => {
expect(hasEmojisOnly(testCase.message, customEmojis)).toEqual(testCase.expected);
});
}
});
describe('hasEmojisOnly with empty and mixed emojis', () => {
const testCases = [{
name: 'not with empty message',
message: '',
expected: {isEmojiOnly: false, shouldRenderJumboEmoji: false},
}, {
name: 'not with empty message',
message: ' ',
expected: {isEmojiOnly: false, shouldRenderJumboEmoji: false},
}, {
name: 'not with no emoji pattern',
message: 'smile',
expected: {isEmojiOnly: false, shouldRenderJumboEmoji: false},
}, {
name: 'with invalid custom emoji',
message: ':smile: :) :invalid_custom:',
expected: {isEmojiOnly: false, shouldRenderJumboEmoji: false},
}, {
name: 'with named emoji and emoticon',
message: ':smile: :) :valid_custom:',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'with unicode emoji and emoticon',
message: '👍 :)',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'with unicode emoji and emoticon',
message: '🤟 :)',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'with named and unicode emojis',
message: ':smile: 👍',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'with named and unicode emojis',
message: ':smile: 🤟',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'with named & unicode emojis and emoticon',
message: ':smile: 👍 :)',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'with named & unicode emojis and emoticon',
message: ':smile: 🤟 :)',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'with 4 named & unicode emojis and emoticon',
message: ':smile: 👍 :) :heart:',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: true},
}, {
name: 'with named & unicode emojis and emoticon greater than max of 4',
message: ':smile: 👍 :) :heart: 👏',
expected: {isEmojiOnly: true, shouldRenderJumboEmoji: false},
}];
const customEmojis = new Map([['valid_custom', 0]]);
for (const testCase of testCases) {
it(`${testCase.name} - ${testCase.message}`, () => {
expect(hasEmojisOnly(testCase.message, customEmojis)).toEqual(testCase.expected);
});
}
});
describe('doesMatchNamedEmoji', () => {
const testCases = [{
input: ':named_emoji:',
output: true,
}, {
input: 'named_emoji',
output: false,
}, {
input: ':named_emoji',
output: false,
}, {
input: 'named_emoji:',
output: false,
}, {
input: '::named_emoji:',
output: false,
}, {
input: 'named emoji',
output: false,
}, {
input: ':named emoji:',
output: false,
}, {
input: ':named_emoji:!',
output: false,
}, {
input: ':named_emoji:aa',
output: false,
}];
for (const testCase of testCases) {
it(`test for - ${testCase.input}`, () => {
expect(doesMatchNamedEmoji(testCase.input)).toEqual(testCase.output);
});
}
});