From fc3a08400ea1acc63e615908fba2e5882f6f0c20 Mon Sep 17 00:00:00 2001 From: JC Brand Date: Sun, 3 Nov 2013 22:28:44 +0200 Subject: [PATCH] Add tests for the chat toolbar. Including the emoticon menu and the OTR menu. More tests needed for OTR in particular. --- converse.js | 8 ++-- spec/ChatBoxSpec.js | 101 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 104 insertions(+), 5 deletions(-) diff --git a/converse.js b/converse.js index d0721c122..8ff74bf21 100644 --- a/converse.js +++ b/converse.js @@ -639,7 +639,7 @@ 'click .close-chatbox-button': 'closeChat', 'keypress textarea.chat-textarea': 'keyPressed', 'click .toggle-smiley': 'toggleEmoticonMenu', - 'click .toggle-smiley ul li': 'addEmoticon', + 'click .toggle-smiley ul li': 'insertEmoticon', 'click .toggle-otr': 'toggleOTRMenu', 'click .start-otr': 'startOTRFromToolbar', 'click .end-otr': 'endOTR', @@ -678,7 +678,7 @@ '
  • '+ '
  • '+ '
  • '+ - '
  • '+ + '
  • '+ '
  • '+ '
  • '+ '
  • '+ @@ -990,7 +990,7 @@ } }, - addEmoticon: function (ev) { + insertEmoticon: function (ev) { ev.stopPropagation(); this.$el.find('.toggle-smiley ul').slideToggle(200); var $textbox = this.$el.find('textarea.chat-textarea'); @@ -1719,7 +1719,7 @@ 'click a.close-chatbox-button': 'closeChat', 'click a.configure-chatroom-button': 'configureChatRoom', 'click .toggle-smiley': 'toggleEmoticonMenu', - 'click .toggle-smiley ul li': 'addEmoticon', + 'click .toggle-smiley ul li': 'insertEmoticon', 'keypress textarea.chat-textarea': 'keyPressed' }, info_template: _.template('
    {{message}}
    '), diff --git a/spec/ChatBoxSpec.js b/spec/ChatBoxSpec.js index 2ae54007f..1b2e6e11b 100644 --- a/spec/ChatBoxSpec.js +++ b/spec/ChatBoxSpec.js @@ -91,6 +91,105 @@ expect(newchatboxes.length).toEqual(0); }, 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 () { it("can be received which will open a chatbox and be displayed inside it", $.proxy(function () { var message = 'This is a received message'; @@ -233,7 +332,7 @@ // (e.g for when this test is run on its own). view.$el.find('.chat-textarea').val(message).text(message); 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(); message = '/clear';