set_global('$', global.make_zjquery()); set_global('page_params', { emojiset: 'google', realm_emoji: {}, }); set_global('upload_widget', {}); set_global('blueslip', global.make_zblueslip()); set_global('emoji_codes', zrequire('emoji_codes', 'generated/emoji/emoji_codes')); zrequire('emoji'); zrequire('markdown'); zrequire('util'); run_test('build_emoji_upload_widget', () => { let build_widget_stub = false; upload_widget.build_widget = function ( get_file_input, file_name_field, input_error, clear_button, upload_button ) { assert.deepEqual(get_file_input(), $('#emoji_file_input')); assert.deepEqual(file_name_field, $('#emoji-file-name')); assert.deepEqual(input_error, $('#emoji_file_input_error')); assert.deepEqual(clear_button, $('#emoji_image_clear_button')); assert.deepEqual(upload_button, $('#emoji_upload_button')); build_widget_stub = true; }; emoji.build_emoji_upload_widget(); assert(build_widget_stub); }); run_test('initialize', () => { let image_stub = false; let urls = []; let calls = 0; class Image { set src(data) { image_stub = true; urls.push(data); calls += 1; } } set_global('Image', Image); emoji.initialize(); assert(image_stub); assert.equal(calls, 2); assert.deepEqual(urls, ['/static/generated/emoji/sheet-google-64.png', '/static/generated/emoji/images-google-64/1f419.png']); // Check initialization sequence for `text` emojiset. page_params.emojiset = 'text'; image_stub = false; urls = []; calls = 0; emoji.initialize(); assert(image_stub); assert.equal(calls, 2); assert.deepEqual(urls, ['/static/generated/emoji/sheet-google-blob-64.png', '/static/generated/emoji/images-google-blob-64/1f419.png']); }); run_test('get_canonical_name', () => { emoji.active_realm_emojis = new Map(Object.entries({ realm_emoji: 'TBD', })); let canonical_name = emoji.get_canonical_name('realm_emoji'); assert.equal(canonical_name, 'realm_emoji'); const orig_emoji_codes = global.emoji_codes; global.emoji_codes = { name_to_codepoint: { '+1': '1f44d', }, codepoint_to_name: { '1f44d': 'thumbs_up', }, }; canonical_name = emoji.get_canonical_name('+1'); assert.equal(canonical_name, 'thumbs_up'); emoji.active_realm_emojis = new Map(Object.entries({ '+1': 'TBD', })); canonical_name = emoji.get_canonical_name('+1'); assert.equal(canonical_name, '+1'); blueslip.set_test_data('error', 'Invalid emoji name: non_existent'); emoji.get_canonical_name('non_existent'); assert.equal(blueslip.get_test_logs('error').length, 1); blueslip.clear_test_data(); global.emoji_codes = orig_emoji_codes; }); run_test('translate_emoticons_to_names', () => { // Simple test const test_text = 'Testing :)'; const expected = 'Testing :slight_smile:'; const result = emoji.translate_emoticons_to_names(test_text); assert.equal(expected, result); // Extensive tests. // The following code loops over the test cases and each emoticon conversion // to generate multiple test cases. const testcases = [ {name: 'only emoticon', original: '', expected: ''}, {name: 'space at start', original: ' ', expected: ' '}, {name: 'space at end', original: ' ', expected: ' '}, {name: 'symbol at end', original: '!', expected: '!'}, {name: 'symbol at start', original: 'Hello,', expected: 'Hello,'}, {name: 'after a word', original: 'Hello', expected: 'Hello'}, {name: 'between words', original: 'HelloWorld', expected: 'HelloWorld'}, {name: 'end of sentence', original: 'End of sentence. ', expected: 'End of sentence. '}, {name: 'between symbols', original: 'Hello.! World.', expected: 'Hello.! World.'}, {name: 'before end of sentence', original: 'Hello !', expected: 'Hello !'}, ]; for (const [shortcut, full_name] of Object.entries(emoji_codes.emoticon_conversions)) { _.each(testcases, (t) => { const converted_value = full_name; let original = t.original; let expected = t.expected; original = original.replace(/()/g, shortcut); expected = expected.replace(/()/g, shortcut) .replace(/()/g, converted_value); const result = emoji.translate_emoticons_to_names(original); assert.equal(result, expected); }); } });