import { expect } from 'chai'; import { search } from '../../../app/javascript/mastodon/features/emoji/emoji_mart_search_light'; import { emojiIndex } from 'emoji-mart'; import { pick } from 'lodash'; const trimEmojis = emoji => pick(emoji, ['id', 'unified', 'native', 'custom']); // hack to fix https://github.com/chaijs/type-detect/issues/98 // see: https://github.com/chaijs/type-detect/issues/98#issuecomment-325010785 import jsdom from 'jsdom'; global.window = new jsdom.JSDOM().window; global.document = window.document; global.HTMLElement = window.HTMLElement; describe('emoji_index', () => { it('should give same result for emoji_index_light and emoji-mart', () => { let expected = [{ id: 'pineapple', unified: '1f34d', native: '🍍', }]; expect(search('pineapple').map(trimEmojis)).to.deep.equal(expected); expect(emojiIndex.search('pineapple').map(trimEmojis)).to.deep.equal(expected); }); it('orders search results correctly', () => { let expected = [{ id: 'apple', unified: '1f34e', native: '🍎', }, { id: 'pineapple', unified: '1f34d', native: '🍍', }, { id: 'green_apple', unified: '1f34f', native: '🍏', }, { id: 'iphone', unified: '1f4f1', native: '📱', }]; expect(search('apple').map(trimEmojis)).to.deep.equal(expected); expect(emojiIndex.search('apple').map(trimEmojis)).to.deep.equal(expected); }); it('handles custom emoji', () => { let custom = [{ id: 'mastodon', name: 'mastodon', short_names: ['mastodon'], text: '', emoticons: [], keywords: ['mastodon'], imageUrl: 'http://example.com', custom: true, }]; search('', { custom }); emojiIndex.search('', { custom }); let expected = [ { id: 'mastodon', custom: true } ]; expect(search('masto').map(trimEmojis)).to.deep.equal(expected); expect(emojiIndex.search('masto').map(trimEmojis)).to.deep.equal(expected); }); it('should filter only emojis we care about, exclude pineapple', () => { let emojisToShowFilter = (unified) => unified !== '1F34D'; expect(search('apple', { emojisToShowFilter }).map((obj) => obj.id)) .not.to.contain('pineapple'); expect(emojiIndex.search('apple', { emojisToShowFilter }).map((obj) => obj.id)) .not.to.contain('pineapple'); }); it('can include/exclude categories', () => { expect(search('flag', { include: ['people'] })) .to.deep.equal([]); expect(emojiIndex.search('flag', { include: ['people'] })) .to.deep.equal([]); }); it('does an emoji whose unified name is irregular', () => { let expected = [{ 'id': 'water_polo', 'unified': '1f93d', 'native': '🤽', }, { 'id': 'man-playing-water-polo', 'unified': '1f93d-200d-2642-fe0f', 'native': '🤽‍♂️', }, { 'id': 'woman-playing-water-polo', 'unified': '1f93d-200d-2640-fe0f', 'native': '🤽‍♀️', }]; expect(search('polo').map(trimEmojis)).to.deep.equal(expected); expect(emojiIndex.search('polo').map(trimEmojis)).to.deep.equal(expected); }); });