Browse Source

Add tests for the chat toolbar.

Including the emoticon menu and the OTR menu.
More tests needed for OTR in particular.
JC Brand 11 years ago
parent
commit
fc3a08400e
2 changed files with 104 additions and 5 deletions
  1. 4 4
      converse.js
  2. 100 1
      spec/ChatBoxSpec.js

+ 4 - 4
converse.js

@@ -639,7 +639,7 @@
                 'click .close-chatbox-button': 'closeChat',
                 'click .close-chatbox-button': 'closeChat',
                 'keypress textarea.chat-textarea': 'keyPressed',
                 'keypress textarea.chat-textarea': 'keyPressed',
                 'click .toggle-smiley': 'toggleEmoticonMenu',
                 'click .toggle-smiley': 'toggleEmoticonMenu',
-                'click .toggle-smiley ul li': 'addEmoticon',
+                'click .toggle-smiley ul li': 'insertEmoticon',
                 'click .toggle-otr': 'toggleOTRMenu',
                 'click .toggle-otr': 'toggleOTRMenu',
                 'click .start-otr': 'startOTRFromToolbar',
                 'click .start-otr': 'startOTRFromToolbar',
                 'click .end-otr': 'endOTR',
                 'click .end-otr': 'endOTR',
@@ -678,7 +678,7 @@
                             '<li><a class="icon-cool" href="#" data-emoticon="8)"></a></li>'+
                             '<li><a class="icon-cool" href="#" data-emoticon="8)"></a></li>'+
                             '<li><a class="icon-evil" href="#" data-emoticon=">:)"></a></li>'+
                             '<li><a class="icon-evil" href="#" data-emoticon=">:)"></a></li>'+
                             '<li><a class="icon-confused" href="#" data-emoticon=":S"></a></li>'+
                             '<li><a class="icon-confused" href="#" data-emoticon=":S"></a></li>'+
-                            '<li><a class="icon-wondering" href="#" data-emoticon=":\"></a></li>'+
+                            '<li><a class="icon-wondering" href="#" data-emoticon=":\\"></a></li>'+
                             '<li><a class="icon-angry" href="#" data-emoticon=">:("></a></li>'+
                             '<li><a class="icon-angry" href="#" data-emoticon=">:("></a></li>'+
                             '<li><a class="icon-sad" href="#" data-emoticon=":("></a></li>'+
                             '<li><a class="icon-sad" href="#" data-emoticon=":("></a></li>'+
                             '<li><a class="icon-shocked" href="#" data-emoticon=":O"></a></li>'+
                             '<li><a class="icon-shocked" href="#" data-emoticon=":O"></a></li>'+
@@ -990,7 +990,7 @@
                 }
                 }
             },
             },
 
 
-            addEmoticon: function (ev) {
+            insertEmoticon: function (ev) {
                 ev.stopPropagation();
                 ev.stopPropagation();
                 this.$el.find('.toggle-smiley ul').slideToggle(200);
                 this.$el.find('.toggle-smiley ul').slideToggle(200);
                 var $textbox = this.$el.find('textarea.chat-textarea');
                 var $textbox = this.$el.find('textarea.chat-textarea');
@@ -1719,7 +1719,7 @@
                 'click a.close-chatbox-button': 'closeChat',
                 'click a.close-chatbox-button': 'closeChat',
                 'click a.configure-chatroom-button': 'configureChatRoom',
                 'click a.configure-chatroom-button': 'configureChatRoom',
                 'click .toggle-smiley': 'toggleEmoticonMenu',
                 'click .toggle-smiley': 'toggleEmoticonMenu',
-                'click .toggle-smiley ul li': 'addEmoticon',
+                'click .toggle-smiley ul li': 'insertEmoticon',
                 'keypress textarea.chat-textarea': 'keyPressed'
                 'keypress textarea.chat-textarea': 'keyPressed'
             },
             },
             info_template: _.template('<div class="chat-info">{{message}}</div>'),
             info_template: _.template('<div class="chat-info">{{message}}</div>'),

+ 100 - 1
spec/ChatBoxSpec.js

@@ -91,6 +91,105 @@
                 expect(newchatboxes.length).toEqual(0);
                 expect(newchatboxes.length).toEqual(0);
             }, converse));
             }, converse));
 
 
+            describe("A chat toolbar", $.proxy(function () {
+                it("can be found on each chat box", $.proxy(function () {
+                    var contact_jid = mock.cur_names[2].replace(' ','.').toLowerCase() + '@localhost';
+                    utils.openChatBoxFor(contact_jid);
+                    var chatbox = this.chatboxes.get(contact_jid);
+                    var view = this.chatboxesview.views[contact_jid];
+                    expect(chatbox).toBeDefined();
+                    expect(view).toBeDefined();
+                    var $toolbar = view.$el.find('ul.chat-toolbar');
+                    expect($toolbar.length).toBe(1);
+                    expect($toolbar.children('li').length).toBe(2);
+                }, converse));
+
+                it("contains a button for inserting emoticons", $.proxy(function () {
+                    var contact_jid = mock.cur_names[2].replace(' ','.').toLowerCase() + '@localhost';
+                    utils.openChatBoxFor(contact_jid);
+                    var chatbox = this.chatboxes.get(contact_jid);
+                    var view = this.chatboxesview.views[contact_jid];
+                    var $toolbar = view.$el.find('ul.chat-toolbar');
+                    var $textarea = view.$el.find('textarea.chat-textarea');
+                    expect($toolbar.children('li.toggle-smiley').length).toBe(1);
+                    // Register spies
+                    spyOn(view, 'toggleEmoticonMenu').andCallThrough();
+                    spyOn(view, 'insertEmoticon').andCallThrough();
+                    view.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
+
+                    runs(function () {
+                        $toolbar.children('li.toggle-smiley').click();
+                    });
+                    waits(250);
+                    runs(function () {
+                        expect(view.toggleEmoticonMenu).toHaveBeenCalled();
+                        var $menu = view.$el.find('.toggle-smiley ul');
+                        var $items = $menu.children('li');
+                        expect($menu.is(':visible')).toBeTruthy();
+                        expect($items.length).toBe(13);
+                        expect($($items[0]).children('a').data('emoticon')).toBe(':)');
+                        expect($($items[1]).children('a').data('emoticon')).toBe(';)');
+                        expect($($items[2]).children('a').data('emoticon')).toBe(':D');
+                        expect($($items[3]).children('a').data('emoticon')).toBe(':P');
+                        expect($($items[4]).children('a').data('emoticon')).toBe('8)');
+                        expect($($items[5]).children('a').data('emoticon')).toBe('>:)');
+                        expect($($items[6]).children('a').data('emoticon')).toBe(':S');
+                        expect($($items[7]).children('a').data('emoticon')).toBe(':\\');
+                        expect($($items[8]).children('a').data('emoticon')).toBe('>:(');
+                        expect($($items[9]).children('a').data('emoticon')).toBe(':(');
+                        expect($($items[10]).children('a').data('emoticon')).toBe(':O');
+                        expect($($items[11]).children('a').data('emoticon')).toBe('(^.^)b');
+                        expect($($items[12]).children('a').data('emoticon')).toBe('<3');
+
+                        $items[0].click();
+                    });
+                    waits(250);
+                    runs(function () {
+                        expect(view.insertEmoticon).toHaveBeenCalled();
+                        expect($textarea.val()).toBe(':) ');
+                        expect(view.$el.find('.toggle-smiley ul').is(':visible')).toBeFalsy();
+                        $toolbar.children('li.toggle-smiley').click();
+                    });
+                    waits(250);
+                    runs(function () {
+                        expect(view.toggleEmoticonMenu).toHaveBeenCalled();
+                        expect(view.$el.find('.toggle-smiley ul').is(':visible')).toBeTruthy();
+                        view.$el.find('.toggle-smiley ul').children('li').last().click();
+                    });
+                    waits(250);
+                    runs(function () {
+                        expect(view.insertEmoticon).toHaveBeenCalled();
+                        expect(view.$el.find('.toggle-smiley ul').is(':visible')).toBeFalsy();
+                        expect($textarea.val()).toBe(':) <3 ');
+                    });
+                }, converse));
+
+                it("contains a button for starting an encrypted chat session", $.proxy(function () {
+                    // TODO: More tests can be added here...
+                    var contact_jid = mock.cur_names[2].replace(' ','.').toLowerCase() + '@localhost';
+                    utils.openChatBoxFor(contact_jid);
+                    var chatbox = this.chatboxes.get(contact_jid);
+                    var view = this.chatboxesview.views[contact_jid];
+                    var $toolbar = view.$el.find('ul.chat-toolbar');
+                    expect($toolbar.children('li.toggle-otr').length).toBe(1);
+                    // Register spies
+                    spyOn(view, 'toggleOTRMenu').andCallThrough();
+                    view.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
+
+                    runs(function () {
+                        $toolbar.children('li.toggle-otr').click();
+                    });
+                    waits(250);
+                    runs(function () {
+                        expect(view.toggleOTRMenu).toHaveBeenCalled();
+                        var $menu = view.$el.find('.toggle-otr ul');
+                        expect($menu.is(':visible')).toBeTruthy();
+                        expect($menu.children('li').length).toBe(2);
+                    });
+
+                }, converse));
+            }, converse));
+
             describe("A Chat Message", $.proxy(function () {
             describe("A Chat Message", $.proxy(function () {
                 it("can be received which will open a chatbox and be displayed inside it", $.proxy(function () {
                 it("can be received which will open a chatbox and be displayed inside it", $.proxy(function () {
                     var message = 'This is a received message';
                     var message = 'This is a received message';
@@ -233,7 +332,7 @@
                 // (e.g for when this test is run on its own).
                 // (e.g for when this test is run on its own).
                 view.$el.find('.chat-textarea').val(message).text(message);
                 view.$el.find('.chat-textarea').val(message).text(message);
                 view.$el.find('textarea.chat-textarea').trigger($.Event('keypress', {keyCode: 13}));
                 view.$el.find('textarea.chat-textarea').trigger($.Event('keypress', {keyCode: 13}));
-                expect(view.model.messages.length > 0).toBeTruthy(); 
+                expect(view.model.messages.length > 0).toBeTruthy();
                 expect(view.model.messages.localStorage.records.length > 0).toBeTruthy();
                 expect(view.model.messages.localStorage.records.length > 0).toBeTruthy();
 
 
                 message = '/clear';
                 message = '/clear';