Просмотр исходного кода

Fix failing test for emoji picker

JC Brand 8 лет назад
Родитель
Сommit
cf1e8f2921
5 измененных файлов с 60 добавлено и 40 удалено
  1. 31 25
      spec/chatbox.js
  2. 5 1
      src/converse-chatview.js
  3. 1 1
      src/templates/emojis.html
  4. 19 10
      src/utils.js
  5. 4 3
      tests/mock.js

+ 31 - 25
spec/chatbox.js

@@ -385,36 +385,42 @@
                     test_utils.openControlBox();
                     test_utils.openControlBox();
                     test_utils.openContactsPanel(_converse);
                     test_utils.openContactsPanel(_converse);
 
 
-                    test_utils.waitUntil(function () {
-                            return _converse.rosterview.$el.find('dt').length;
-                        }, 300)
-                    .then(function () {
-                        var contact_jid = mock.cur_names[2].replace(/ /g,'.').toLowerCase() + '@localhost',
-                            view, $toolbar, $textarea;
-                        test_utils.openChatBoxFor(_converse, contact_jid);
-                        view = _converse.chatboxviews.get(contact_jid);
-                        $toolbar = view.$el.find('ul.chat-toolbar');
-                        $textarea = view.$el.find('textarea.chat-textarea');
-                        expect($toolbar.children('li.toggle-smiley').length).toBe(1);
-                        // Register spies
-                        spyOn(view, 'toggleEmojiMenu').and.callThrough();
-                        spyOn(view, 'insertEmoji');
-                        view.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
-                        $toolbar.children('li.toggle-smiley').click();
+                    var contact_jid = mock.cur_names[2].replace(/ /g,'.').toLowerCase() + '@localhost',
+                        view, $toolbar, $textarea;
+                    test_utils.openChatBoxFor(_converse, contact_jid);
+                    view = _converse.chatboxviews.get(contact_jid);
+                    $toolbar = view.$el.find('ul.chat-toolbar');
+                    $textarea = view.$el.find('textarea.chat-textarea');
+                    expect($toolbar.children('li.toggle-smiley').length).toBe(1);
+                    // Register spies
+                    spyOn(view, 'toggleEmojiMenu').and.callThrough();
+                    spyOn(view, 'insertEmoji').and.callThrough();
 
 
+                    view.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
+                    $toolbar.children('li.toggle-smiley').click();
+
+                    test_utils.waitUntil(function () {
+                        var $picker = view.$el.find('.toggle-smiley .emoji-picker-container');
+                        return $picker.is(':visible');
+                    }, 300).then(function () {
                         var $picker = view.$el.find('.toggle-smiley .emoji-picker-container');
                         var $picker = view.$el.find('.toggle-smiley .emoji-picker-container');
-                        // expect($picker.is(':visible')).toBeTruthy();
-                        // expect(view.toggleEmojiMenu).toHaveBeenCalled();
                         var $items = $picker.find('.emoji-picker li');
                         var $items = $picker.find('.emoji-picker li');
                         $items.first().click();
                         $items.first().click();
                         expect(view.insertEmoji).toHaveBeenCalled();
                         expect(view.insertEmoji).toHaveBeenCalled();
-                        expect(view.$el.find('.toggle-smiley ul').is(':visible')).toBeFalsy();
-                        $toolbar.children('li.toggle-smiley').click();
-                        expect(view.toggleEmojiMenu).toHaveBeenCalled();
-                        view.$el.find('.toggle-smiley ul').children('li').last().click();
-                        expect(view.insertEmoji).toHaveBeenCalled();
-                        expect(view.$el.find('.toggle-smiley ul').is(':visible')).toBeFalsy();
-                        done();
+                        test_utils.waitUntil(function () {
+                            return !view.el.querySelector('.toggle-smiley .toolbar-menu').offsetHeight;
+                        }, 300).then(function () {
+                            $toolbar.children('li.toggle-smiley').click();
+                            expect(view.toggleEmojiMenu).toHaveBeenCalled();
+                            test_utils.waitUntil(function () {
+                                var $picker = view.$el.find('.toggle-smiley .emoji-picker-container');
+                                return $picker.is(':visible');
+                            }, 300).then(function () {
+                                view.$el.find('.toggle-smiley ul').children('li').last().click();
+                                expect(view.insertEmoji).toHaveBeenCalled();
+                                done();
+                            });
+                        });
                     });
                     });
                 }));
                 }));
 
 

+ 5 - 1
src/converse-chatview.js

@@ -55,7 +55,11 @@
             registerGlobalEventHandlers: function () {
             registerGlobalEventHandlers: function () {
                 this.__super__.registerGlobalEventHandlers();
                 this.__super__.registerGlobalEventHandlers();
                 document.addEventListener(
                 document.addEventListener(
-                    'click', function () {
+                    'click', function (ev) {
+                        if (_.includes(ev.target.classList, 'toggle-toolbar-menu') ||
+                            _.includes(ev.target.classList, 'insert-emoji')) {
+                            return;
+                        }
                         utils.slideInAllElements(
                         utils.slideInAllElements(
                             document.querySelectorAll('.toolbar-menu')
                             document.querySelectorAll('.toolbar-menu')
                         )
                         )

+ 1 - 1
src/templates/emojis.html

@@ -1,7 +1,7 @@
 {[ _.forEach(emojis_by_category, function (obj, category) { ]}
 {[ _.forEach(emojis_by_category, function (obj, category) { ]}
     <ul class="emoji-picker emoji-picker-{{{category}}} {[ if (current_category !== category) { ]} hidden {[ } ]}">
     <ul class="emoji-picker emoji-picker-{{{category}}} {[ if (current_category !== category) { ]} hidden {[ } ]}">
         {[ _.forEach(emojis_by_category[category], function (emoji) { ]}
         {[ _.forEach(emojis_by_category[category], function (emoji) { ]}
-            <li class="emoji" data-emoji="{{{emoji._shortname}}}">
+            <li class="emoji insert-emoji" data-emoji="{{{emoji._shortname}}}">
                 <a href="#" data-emoji="{{{emoji._shortname}}}"> {{ emojione.shortnameToUnicode(emoji._shortname) }}  </a>
                 <a href="#" data-emoji="{{{emoji._shortname}}}"> {{ emojione.shortnameToUnicode(emoji._shortname) }}  </a>
         </li>
         </li>
         {[ }); ]}
         {[ }); ]}

+ 19 - 10
src/utils.js

@@ -208,17 +208,25 @@
                 const err = "Undefined or null element passed into slideOut"
                 const err = "Undefined or null element passed into slideOut"
                 console.warn(err);
                 console.warn(err);
                 reject(new Error(err));
                 reject(new Error(err));
+                return;
             }
             }
             let interval_marker = el.getAttribute('data-slider-marker');
             let interval_marker = el.getAttribute('data-slider-marker');
             if (interval_marker) {
             if (interval_marker) {
+                el.removeAttribute('data-slider-marker');
                 window.clearInterval(interval_marker);
                 window.clearInterval(interval_marker);
             }
             }
-            const end_height = _.reduce(el.children, function (result, child) {
-                return result + child.offsetHeight;
-            }, 0);
+            const end_height = _.reduce(
+                    el.children,
+                    (result, child) => result + child.offsetHeight, 0
+                );
+            if ($.fx.off) { // Effects are disabled (for tests)
+                el.style.height = end_height + 'px';
+                resolve();
+                return;
+            }
+
             const step = calculateSlideStep(end_height),
             const step = calculateSlideStep(end_height),
                   interval = end_height/duration*step;
                   interval = end_height/duration*step;
-
             let h = 0;
             let h = 0;
             interval_marker = window.setInterval(function () {
             interval_marker = window.setInterval(function () {
                 h += step;
                 h += step;
@@ -227,7 +235,6 @@
                 } else {
                 } else {
                     el.style.height = end_height + 'px';
                     el.style.height = end_height + 'px';
                     window.clearInterval(interval_marker);
                     window.clearInterval(interval_marker);
-                    el.style.overflow = '';
                     el.removeAttribute('data-slider-marker');
                     el.removeAttribute('data-slider-marker');
                     resolve();
                     resolve();
                 }
                 }
@@ -242,14 +249,16 @@
             if (_.isNil(el)) {
             if (_.isNil(el)) {
                 const err = "Undefined or null element passed into slideIn";
                 const err = "Undefined or null element passed into slideIn";
                 console.warn(err);
                 console.warn(err);
-                reject(new Error(err));
-            }
-            if (!el.offsetHeight) {
-                resolve();
-                return;
+                return reject(new Error(err));
+            } else if (!el.offsetHeight) {
+                return resolve();
+            } else if ($.fx.off) { // Effects are disabled (for tests)
+                el.style.height = 0 + 'px';
+                return resolve();
             }
             }
             let interval_marker = el.getAttribute('data-slider-marker');
             let interval_marker = el.getAttribute('data-slider-marker');
             if (interval_marker) {
             if (interval_marker) {
+                el.removeAttribute('data-slider-marker');
                 window.clearInterval(interval_marker);
                 window.clearInterval(interval_marker);
             }
             }
             let h = el.offsetHeight;
             let h = el.offsetHeight;

+ 4 - 3
tests/mock.js

@@ -88,7 +88,7 @@
             });
             });
         }
         }
 
 
-        var converse = converse_api.initialize(_.extend({
+        var _converse = converse_api.initialize(_.extend({
             'i18n': 'en',
             'i18n': 'en',
             'auto_subscribe': false,
             'auto_subscribe': false,
             'play_sounds': false,
             'play_sounds': false,
@@ -101,9 +101,10 @@
             'password': 'secret',
             'password': 'secret',
             'debug': false
             'debug': false
         }, settings || {}));
         }, settings || {}));
-        converse.ChatBoxViews.prototype.trimChat = function () {};
+        _converse.ChatBoxViews.prototype.trimChat = function () {};
+        _converse.disable_effects = true;
         $.fx.off = true;
         $.fx.off = true;
-        return converse;
+        return _converse;
     }
     }
 
 
     mock.initConverseWithPromises = function (spies, promise_names, settings, func) {
     mock.initConverseWithPromises = function (spies, promise_names, settings, func) {