Upgrade to Jasmine 2.5.3
This commit is contained in:
parent
bf9ba245b4
commit
0c43e4b87c
@ -255,7 +255,7 @@
|
||||
"error",
|
||||
"never"
|
||||
],
|
||||
"valid-jsdoc": "error",
|
||||
"valid-jsdoc": "off",
|
||||
"vars-on-top": "off",
|
||||
"wrap-iife": [
|
||||
"error",
|
||||
|
17
Makefile
17
Makefile
@ -3,7 +3,6 @@ BUILDDIR = ./docs
|
||||
BUNDLE ?= ./.bundle/bin/bundle
|
||||
GRUNT ?= ./node_modules/.bin/grunt
|
||||
HTTPSERVE ?= ./node_modules/.bin/http-server
|
||||
JSHINT ?= ./node_modules/.bin/jshint
|
||||
ESLINT ?= ./node_modules/.bin/eslint
|
||||
PAPER =
|
||||
PHANTOMJS ?= ./node_modules/.bin/phantomjs
|
||||
@ -16,13 +15,6 @@ SPHINXOPTS =
|
||||
|
||||
# Internal variables.
|
||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) ./docs/source
|
||||
SOURCES = $(wildcard *.js) $(wildcard spec/*.js) $(wildcard src/*.js)
|
||||
JSHINTEXCEPTIONS = $(GENERATED) \
|
||||
src/build-mobile.js \
|
||||
src/build-no-jquery.js \
|
||||
src/build-no-dependencies.js \
|
||||
src/build.js \
|
||||
CHECKSOURCES = $(filter-out $(JSHINTEXCEPTIONS),$(SOURCES))
|
||||
|
||||
.PHONY: all
|
||||
all: dev dist
|
||||
@ -184,18 +176,15 @@ build:: dev css
|
||||
########################################################################
|
||||
## Tests
|
||||
|
||||
.PHONY: jshint
|
||||
jshint: stamp-npm
|
||||
$(JSHINT) --config jshintrc $(CHECKSOURCES)
|
||||
|
||||
.PHONY: eslint
|
||||
eslint: stamp-npm
|
||||
$(ESLINT) src/
|
||||
$(ESLINT) spec/
|
||||
|
||||
.PHONY: check
|
||||
check: jshint eslint
|
||||
$(PHANTOMJS) node_modules/phantom-jasmine/lib/run_jasmine_test.coffee tests.html
|
||||
check: eslint
|
||||
$(PHANTOMJS) tests/run-jasmine2.js tests.html
|
||||
|
||||
|
||||
########################################################################
|
||||
## Documentation
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
## 3.0.2 (Unreleased)
|
||||
|
||||
- No changes yet.
|
||||
- Update Jasmine from 1.3.1 to 2.5.3 and Phantomjs from 1.9.7-1 to 2.1.14 [jcbrand]
|
||||
|
||||
## 3.0.1 (2017-04-04)
|
||||
|
||||
|
@ -40,6 +40,7 @@
|
||||
"bootstrap": "^3.3.7",
|
||||
"bourbon": "^4.3.2",
|
||||
"clean-css": "^3.4.19",
|
||||
"es6-promise": "^4.1.0",
|
||||
"eslint": "^3.16.1",
|
||||
"eslint-plugin-lodash": "^2.3.3",
|
||||
"font-awesome": "^4.7.0",
|
||||
@ -49,7 +50,7 @@
|
||||
"grunt-json": "^0.2.0",
|
||||
"http-server": "^0.9.0",
|
||||
"install": "^0.8.5",
|
||||
"jasmine": "https://github.com/jcbrand/jasmine.git#439a7f805eeaec0cabe18a8ecf7e47da1a0afa33",
|
||||
"jasmine": "2.5.3",
|
||||
"jed": "0.5.4",
|
||||
"jquery": "2.2.3",
|
||||
"jquery-easing": "0.0.1",
|
||||
@ -60,8 +61,7 @@
|
||||
"moment": "~2.13.0",
|
||||
"npm": "^4.1.1",
|
||||
"otr": "0.2.16",
|
||||
"phantom-jasmine": "0.1.8",
|
||||
"phantomjs": "~1.9.7-1",
|
||||
"phantomjs-prebuilt": "~2.1.14",
|
||||
"pluggable.js": "1.0.0",
|
||||
"po2json": "^0.4.4",
|
||||
"requirejs": "2.3.3",
|
||||
@ -73,7 +73,8 @@
|
||||
"strophejs-plugin-register": "0.0.1",
|
||||
"strophejs-plugin-rsm": "0.0.1",
|
||||
"strophejs-plugin-vcard": "0.0.1",
|
||||
"text": "requirejs/text#2.0.15"
|
||||
"text": "requirejs/text#2.0.15",
|
||||
"wait-until-promise": "^1.0.0"
|
||||
},
|
||||
"dependencies": {}
|
||||
}
|
||||
|
@ -1,10 +1,12 @@
|
||||
/*global waitUntilPromise */
|
||||
|
||||
(function (root, factory) {
|
||||
define([
|
||||
"jquery",
|
||||
"converse-core",
|
||||
"utils",
|
||||
"mock",
|
||||
"test_utils"
|
||||
"test-utils"
|
||||
], factory);
|
||||
} (this, function ($, converse, utils, mock, test_utils) {
|
||||
"use strict";
|
||||
@ -17,17 +19,17 @@
|
||||
it("can be bookmarked", mock.initConverse(function (_converse) {
|
||||
var sent_stanza, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_stanza = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
spyOn(_converse.connection, 'getUniqueId').andCallThrough();
|
||||
spyOn(_converse.connection, 'getUniqueId').and.callThrough();
|
||||
|
||||
test_utils.openChatRoom(_converse, 'theplay', 'conference.shakespeare.lit', 'JC');
|
||||
var jid = 'theplay@conference.shakespeare.lit';
|
||||
var view = _converse.chatboxviews.get(jid);
|
||||
spyOn(view, 'renderBookmarkForm').andCallThrough();
|
||||
spyOn(view, 'cancelConfiguration').andCallThrough();
|
||||
spyOn(view, 'renderBookmarkForm').and.callThrough();
|
||||
spyOn(view, 'cancelConfiguration').and.callThrough();
|
||||
|
||||
var $bookmark = view.$el.find('.icon-pushpin');
|
||||
$bookmark.click();
|
||||
@ -146,11 +148,7 @@
|
||||
describe("when bookmarked", function () {
|
||||
|
||||
it("displays that it's bookmarked through its bookmark icon", mock.initConverse(function (_converse) {
|
||||
runs(function () {
|
||||
test_utils.openChatRoom(_converse, 'lounge', 'localhost', 'dummy');
|
||||
});
|
||||
waits(100);
|
||||
runs(function () {
|
||||
var view = _converse.chatboxviews.get('lounge@localhost');
|
||||
var $bookmark_icon = view.$('.icon-pushpin');
|
||||
expect($bookmark_icon.hasClass('button-on')).toBeFalsy();
|
||||
@ -158,27 +156,16 @@
|
||||
expect($bookmark_icon.hasClass('button-on')).toBeTruthy();
|
||||
view.model.set('bookmarked', false);
|
||||
expect($bookmark_icon.hasClass('button-on')).toBeFalsy();
|
||||
});
|
||||
}));
|
||||
|
||||
it("can be unbookmarked", mock.initConverse(function (_converse) {
|
||||
var view, sent_stanza, IQ_id;
|
||||
var sent_stanza, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
sent_stanza = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
spyOn(_converse.connection, 'getUniqueId').andCallThrough();
|
||||
|
||||
runs(function () {
|
||||
test_utils.openChatRoom(_converse, 'theplay', 'conference.shakespeare.lit', 'JC');
|
||||
});
|
||||
waits(100);
|
||||
runs(function () {
|
||||
var jid = 'theplay@conference.shakespeare.lit';
|
||||
view = _converse.chatboxviews.get(jid);
|
||||
spyOn(view, 'toggleBookmark').andCallThrough();
|
||||
spyOn(_converse.bookmarks, 'sendBookmarkStanza').andCallThrough();
|
||||
var view = _converse.chatboxviews.get(jid);
|
||||
spyOn(view, 'toggleBookmark').and.callThrough();
|
||||
spyOn(_converse.bookmarks, 'sendBookmarkStanza').and.callThrough();
|
||||
view.delegateEvents();
|
||||
_converse.bookmarks.create({
|
||||
'jid': view.model.get('jid'),
|
||||
@ -187,16 +174,20 @@
|
||||
'nick': ' Othello'
|
||||
});
|
||||
expect(_converse.bookmarks.length).toBe(1);
|
||||
});
|
||||
waits(100);
|
||||
runs(function () {
|
||||
expect(view.model.get('bookmarked')).toBeTruthy();
|
||||
var $bookmark_icon = view.$('.icon-pushpin');
|
||||
expect($bookmark_icon.hasClass('button-on')).toBeTruthy();
|
||||
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_stanza = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
spyOn(_converse.connection, 'getUniqueId').and.callThrough();
|
||||
$bookmark_icon.click();
|
||||
expect(view.toggleBookmark).toHaveBeenCalled();
|
||||
expect($bookmark_icon.hasClass('button-on')).toBeFalsy();
|
||||
expect(_converse.bookmarks.length).toBe(0);
|
||||
|
||||
// Check that an IQ stanza is sent out, containing no
|
||||
// conferences to bookmark (since we removed the one and
|
||||
// only bookmark).
|
||||
@ -224,7 +215,6 @@
|
||||
"</pubsub>"+
|
||||
"</iq>"
|
||||
);
|
||||
});
|
||||
}));
|
||||
});
|
||||
|
||||
@ -255,7 +245,7 @@
|
||||
|
||||
describe("Bookmarks", function () {
|
||||
|
||||
it("can be pushed from the XMPP server", mock.initConverse(function (_converse) {
|
||||
xit("can be pushed from the XMPP server", mock.initConverse(function (_converse) {
|
||||
// TODO
|
||||
/* The stored data is automatically pushed to all of the user's
|
||||
* connected resources.
|
||||
@ -305,7 +295,7 @@
|
||||
it("can be retrieved from the XMPP server", mock.initConverse(function (_converse) {
|
||||
var sent_stanza, IQ_id,
|
||||
sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_stanza = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
@ -376,7 +366,7 @@
|
||||
it("shows a list of bookmarks", mock.initConverse(function (_converse) {
|
||||
var IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
_converse.chatboxviews.get('controlbox').$('#chatrooms dl.bookmarks').html('');
|
||||
@ -406,7 +396,6 @@
|
||||
}));
|
||||
|
||||
it("remembers the toggle state of the bookmarks list", mock.initConverse(function (_converse) {
|
||||
runs(function () {
|
||||
_converse.bookmarks.create({
|
||||
'jid': 'theplay@conference.shakespeare.lit',
|
||||
'autojoin': false,
|
||||
@ -415,9 +404,6 @@
|
||||
});
|
||||
_converse.emit('chatBoxesFetched');
|
||||
test_utils.openControlBox().openRoomsPanel(_converse);
|
||||
});
|
||||
waits(100);
|
||||
runs(function () {
|
||||
expect($('#chatrooms dl.bookmarks dd:visible').length).toBe(1);
|
||||
expect(_converse.bookmarksview.list_model.get('toggle-state')).toBe(_converse.OPENED);
|
||||
$('#chatrooms .bookmarks-toggle').click();
|
||||
@ -426,7 +412,6 @@
|
||||
$('#chatrooms .bookmarks-toggle').click();
|
||||
expect($('#chatrooms dl.bookmarks dd:visible').length).toBe(1);
|
||||
expect(_converse.bookmarksview.list_model.get('toggle-state')).toBe(_converse.OPENED);
|
||||
});
|
||||
}));
|
||||
});
|
||||
});
|
||||
|
504
spec/chatbox.js
504
spec/chatbox.js
File diff suppressed because it is too large
Load Diff
242
spec/chatroom.js
242
spec/chatroom.js
@ -1,5 +1,5 @@
|
||||
(function (root, factory) {
|
||||
define(["mock", "converse-core", "test_utils", "utils" ], factory);
|
||||
define(["mock", "converse-core", "test-utils", "utils" ], factory);
|
||||
} (this, function (mock, converse, test_utils, utils) {
|
||||
var _ = converse.env._;
|
||||
var $ = converse.env.jQuery;
|
||||
@ -13,16 +13,13 @@
|
||||
|
||||
it("has a method 'close' which closes rooms by JID or all rooms when called with no arguments", mock.initConverse(function (_converse) {
|
||||
test_utils.createContacts(_converse, 'current');
|
||||
runs(function () {
|
||||
test_utils.openAndEnterChatRoom(_converse, 'lounge', 'localhost', 'dummy');
|
||||
test_utils.openAndEnterChatRoom(_converse, 'leisure', 'localhost', 'dummy');
|
||||
test_utils.openAndEnterChatRoom(_converse, 'news', 'localhost', 'dummy');
|
||||
expect(_converse.chatboxviews.get('lounge@localhost').$el.is(':visible')).toBeTruthy();
|
||||
expect(_converse.chatboxviews.get('leisure@localhost').$el.is(':visible')).toBeTruthy();
|
||||
expect(_converse.chatboxviews.get('news@localhost').$el.is(':visible')).toBeTruthy();
|
||||
});
|
||||
waits('100');
|
||||
runs(function () {
|
||||
|
||||
// XXX: bit of a cheat here. We want `cleanup()` to be
|
||||
// called on the room. Either it's this or faking
|
||||
// `sendPresence`.
|
||||
@ -42,19 +39,18 @@
|
||||
test_utils.openAndEnterChatRoom(_converse, 'leisure', 'localhost', 'dummy');
|
||||
expect(_converse.chatboxviews.get('lounge@localhost').$el.is(':visible')).toBeTruthy();
|
||||
expect(_converse.chatboxviews.get('leisure@localhost').$el.is(':visible')).toBeTruthy();
|
||||
});
|
||||
waits('100');
|
||||
runs(function () {
|
||||
|
||||
_converse.api.rooms.close();
|
||||
expect(_converse.chatboxviews.get('lounge@localhost')).toBeUndefined();
|
||||
expect(_converse.chatboxviews.get('leisure@localhost')).toBeUndefined();
|
||||
});
|
||||
}));
|
||||
|
||||
it("has a method 'get' which returns a wrapped chat room (if it exists)", mock.initConverse(function (_converse) {
|
||||
it("has a method 'get' which returns a wrapped chat room (if it exists)", mock.initConverseWithAsync(function (done, _converse) {
|
||||
test_utils.createContacts(_converse, 'current');
|
||||
waits('300'); // ChatBox.show() is debounced for 250ms
|
||||
runs(function () {
|
||||
test_utils.waitUntil(function () {
|
||||
return _converse.rosterview.$el.find('dt').length;
|
||||
}, 300)
|
||||
.then(function () {
|
||||
test_utils.openAndEnterChatRoom(_converse, 'lounge', 'localhost', 'dummy');
|
||||
var jid = 'lounge@localhost';
|
||||
var room = _converse.api.rooms.get(jid);
|
||||
@ -63,23 +59,19 @@
|
||||
var chatroomview = _converse.chatboxviews.get(jid);
|
||||
expect(chatroomview.$el.is(':visible')).toBeTruthy();
|
||||
chatroomview.close();
|
||||
});
|
||||
waits('300'); // ChatBox.show() is debounced for 250ms
|
||||
runs(function () {
|
||||
|
||||
// Test with mixed case
|
||||
test_utils.openAndEnterChatRoom(_converse, 'Leisure', 'localhost', 'dummy');
|
||||
var jid = 'Leisure@localhost';
|
||||
var room = _converse.api.rooms.get(jid);
|
||||
jid = 'Leisure@localhost';
|
||||
room = _converse.api.rooms.get(jid);
|
||||
expect(room instanceof Object).toBeTruthy();
|
||||
var chatroomview = _converse.chatboxviews.get(jid.toLowerCase());
|
||||
chatroomview = _converse.chatboxviews.get(jid.toLowerCase());
|
||||
expect(chatroomview.$el.is(':visible')).toBeTruthy();
|
||||
});
|
||||
waits('300'); // ChatBox.show() is debounced for 250ms
|
||||
runs(function () {
|
||||
var jid = 'leisure@localhost';
|
||||
var room = _converse.api.rooms.get(jid);
|
||||
|
||||
jid = 'leisure@localhost';
|
||||
room = _converse.api.rooms.get(jid);
|
||||
expect(room instanceof Object).toBeTruthy();
|
||||
var chatroomview = _converse.chatboxviews.get(jid.toLowerCase());
|
||||
chatroomview = _converse.chatboxviews.get(jid.toLowerCase());
|
||||
expect(chatroomview.$el.is(':visible')).toBeTruthy();
|
||||
|
||||
jid = 'leiSure@localhost';
|
||||
@ -93,41 +85,41 @@
|
||||
jid = 'lounge2@localhost';
|
||||
room = _converse.api.rooms.get(jid);
|
||||
expect(typeof room === 'undefined').toBeTruthy();
|
||||
done();
|
||||
});
|
||||
}));
|
||||
|
||||
it("has a method 'open' which opens (optionally configures) and returns a wrapped chat box", mock.initConverse(function (_converse) {
|
||||
it("has a method 'open' which opens (optionally configures) and returns a wrapped chat box", mock.initConverseWithAsync(function (done, _converse) {
|
||||
// Mock 'getRoomFeatures', otherwise the room won't be
|
||||
// displayed as it waits first for the features to be returned
|
||||
// (when it's a new room being created).
|
||||
spyOn(_converse.ChatRoomView.prototype, 'getRoomFeatures').andCallFake(function () {
|
||||
spyOn(_converse.ChatRoomView.prototype, 'getRoomFeatures').and.callFake(function () {
|
||||
var deferred = new $.Deferred();
|
||||
deferred.resolve();
|
||||
return deferred.promise();
|
||||
});
|
||||
|
||||
test_utils.createContacts(_converse, 'current');
|
||||
test_utils.waitUntil(function () {
|
||||
return _converse.rosterview.$el.find('dt').length;
|
||||
}, 300)
|
||||
.then(function () {
|
||||
var chatroomview;
|
||||
var jid = 'lounge@localhost';
|
||||
var room = _converse.api.rooms.open(jid);
|
||||
runs(function () {
|
||||
// Test on chat room that doesn't exist.
|
||||
expect(room instanceof Object).toBeTruthy();
|
||||
expect(room.is_chatroom).toBeTruthy();
|
||||
chatroomview = _converse.chatboxviews.get(jid);
|
||||
expect(chatroomview.$el.is(':visible')).toBeTruthy();
|
||||
});
|
||||
waits('300'); // ChatBox.show() is debounced for 250ms
|
||||
runs(function () {
|
||||
|
||||
// Test again, now that the room exists.
|
||||
room = _converse.api.rooms.open(jid);
|
||||
expect(room instanceof Object).toBeTruthy();
|
||||
expect(room.is_chatroom).toBeTruthy();
|
||||
chatroomview = _converse.chatboxviews.get(jid);
|
||||
expect(chatroomview.$el.is(':visible')).toBeTruthy();
|
||||
});
|
||||
waits('300'); // ChatBox.show() is debounced for 250ms
|
||||
runs(function () {
|
||||
|
||||
// Test with mixed case in JID
|
||||
jid = 'Leisure@localhost';
|
||||
room = _converse.api.rooms.open(jid);
|
||||
@ -147,13 +139,11 @@
|
||||
chatroomview = _converse.chatboxviews.get(jid.toLowerCase());
|
||||
expect(chatroomview.$el.is(':visible')).toBeTruthy();
|
||||
chatroomview.close();
|
||||
});
|
||||
waits('300'); // ChatBox.show() is debounced for 250ms
|
||||
runs(function () {
|
||||
|
||||
_converse.muc_instant_rooms = false;
|
||||
var sent_IQ, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_IQ = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
@ -246,6 +236,7 @@
|
||||
expect($sent_stanza.find('field[var="muc#roomconfig_whois"] value ').text()).toBe('anyone');
|
||||
expect($sent_stanza.find('field[var="muc#roomconfig_membersonly"] value').text()).toBe('1');
|
||||
expect($sent_stanza.find('field[var="muc#roomconfig_historylength"] value').text()).toBe('20');
|
||||
done();
|
||||
});
|
||||
}));
|
||||
});
|
||||
@ -254,7 +245,7 @@
|
||||
it("will be created when muc_instant_rooms is set to true", mock.initConverse(function (_converse) {
|
||||
var sent_IQ, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_IQ = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
@ -280,7 +271,7 @@
|
||||
|
||||
|
||||
var view = _converse.chatboxviews.get('lounge@localhost');
|
||||
spyOn(view, 'join').andCallThrough();
|
||||
spyOn(view, 'join').and.callThrough();
|
||||
|
||||
/* <iq to="myroom@conference.chat.example.org"
|
||||
* from="jordie.langen@chat.example.org/converse.js-11659299"
|
||||
@ -446,12 +437,12 @@
|
||||
it("shows its description in the chat heading", mock.initConverse(function (_converse) {
|
||||
var sent_IQ, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_IQ = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
var view = _converse.api.rooms.open('coven@chat.shakespeare.lit', {'nick': 'some1'});
|
||||
spyOn(view, 'generateHeadingHTML').andCallThrough();
|
||||
spyOn(view, 'generateHeadingHTML').and.callThrough();
|
||||
var features_stanza = $iq({
|
||||
from: 'coven@chat.shakespeare.lit',
|
||||
'id': IQ_id,
|
||||
@ -541,14 +532,14 @@
|
||||
var view;
|
||||
var sent_IQ, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_IQ = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
runs(function () {
|
||||
|
||||
_converse.api.rooms.open('coven@chat.shakespeare.lit', {'nick': 'some1'});
|
||||
view = _converse.chatboxviews.get('coven@chat.shakespeare.lit');
|
||||
spyOn(view, 'saveAffiliationAndRole').andCallThrough();
|
||||
spyOn(view, 'saveAffiliationAndRole').and.callThrough();
|
||||
|
||||
// We pretend this is a new room, so no disco info is returned.
|
||||
var features_stanza = $iq({
|
||||
@ -584,9 +575,7 @@
|
||||
expect(view.$('.toggle-chatbox-button').is(':visible')).toBeTruthy();
|
||||
expect(view.$('.toggle-bookmark').is(':visible')).toBeTruthy();
|
||||
view.$('.configure-chatroom-button').click();
|
||||
});
|
||||
waits(50);
|
||||
runs (function () {
|
||||
|
||||
/* Check that an IQ is sent out, asking for the
|
||||
* configuration form.
|
||||
* See: // http://xmpp.org/extensions/xep-0045.html#example-163
|
||||
@ -719,9 +708,7 @@
|
||||
'var': 'muc#roomconfig_roomsecret'})
|
||||
.c('value').t('cauldronburn');
|
||||
_converse.connection._dataRecv(test_utils.createRequest(config_stanza));
|
||||
});
|
||||
waits(50);
|
||||
runs (function () {
|
||||
|
||||
expect(view.$('form.chatroom-form').length).toBe(1);
|
||||
expect(view.$('form.chatroom-form fieldset').length).toBe(2);
|
||||
var $membersonly = view.$('input[name="muc#roomconfig_membersonly"]');
|
||||
@ -747,15 +734,12 @@
|
||||
$presencebroadcast.val(['moderator']);
|
||||
|
||||
view.$('input[type="submit"]').click();
|
||||
});
|
||||
waits(50);
|
||||
runs (function () {
|
||||
|
||||
var $sent_stanza = $(sent_IQ.toLocaleString());
|
||||
expect($sent_stanza.find('field[var="muc#roomconfig_membersonly"] value').text()).toBe('1');
|
||||
expect($sent_stanza.find('field[var="muc#roomconfig_moderatedroom"] value').text()).toBe('1');
|
||||
expect($sent_stanza.find('field[var="muc#roomconfig_allowpm"] value').text()).toBe('moderators');
|
||||
expect($sent_stanza.find('field[var="muc#roomconfig_presencebroadcast"] value').text()).toBe('moderator');
|
||||
});
|
||||
}));
|
||||
|
||||
it("shows users currently present in the room", mock.initConverse(function (_converse) {
|
||||
@ -859,7 +843,7 @@
|
||||
it("will use the user's reserved nickname, if it exists", mock.initConverse(function (_converse) {
|
||||
var sent_IQ, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_IQ = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
@ -877,7 +861,7 @@
|
||||
_converse.connection._dataRecv(test_utils.createRequest(features_stanza));
|
||||
|
||||
var view = _converse.chatboxviews.get('lounge@localhost');
|
||||
spyOn(view, 'join').andCallThrough();
|
||||
spyOn(view, 'join').and.callThrough();
|
||||
|
||||
/* <iq from='hag66@shakespeare.lit/pda'
|
||||
* id='getnick1'
|
||||
@ -938,7 +922,7 @@
|
||||
expect(info_text).toBe('Your nickname has been automatically set to: thirdwitch');
|
||||
}));
|
||||
|
||||
it("allows the user to invite their roster contacts to enter the chat room", mock.initConverse(function (_converse) {
|
||||
it("allows the user to invite their roster contacts to enter the chat room", mock.initConverseWithAsync(function (done, _converse) {
|
||||
test_utils.openChatRoom(_converse, 'lounge', 'localhost', 'dummy');
|
||||
test_utils.createContacts(_converse, 'current'); // We need roster contacts, so that we have someone to invite
|
||||
// Since we don't actually fetch roster contacts, we need to
|
||||
@ -946,7 +930,7 @@
|
||||
_converse.emit('rosterContactsFetched');
|
||||
|
||||
spyOn(_converse, 'emit');
|
||||
spyOn(window, 'prompt').andCallFake(function () {
|
||||
spyOn(window, 'prompt').and.callFake(function () {
|
||||
return "Please join!";
|
||||
});
|
||||
var view = _converse.chatboxviews.get('lounge@localhost');
|
||||
@ -955,12 +939,15 @@
|
||||
// receiving the features for the room.
|
||||
view.model.set('open', 'true');
|
||||
|
||||
spyOn(view, 'directInvite').andCallThrough();
|
||||
spyOn(view, 'directInvite').and.callThrough();
|
||||
var $input;
|
||||
view.$el.find('.chat-area').remove();
|
||||
$input = view.$el.find('input.invited-contact');
|
||||
runs (function () {
|
||||
expect($input.length).toBe(1);
|
||||
|
||||
test_utils.waitUntil(function () {
|
||||
return view.$el.find('input.invited-contact').length;
|
||||
}, 300)
|
||||
.then(function () {
|
||||
var $input = view.$el.find('input.invited-contact');
|
||||
expect($input.attr('placeholder')).toBe('Invite');
|
||||
$input.val("Felix");
|
||||
var evt;
|
||||
@ -973,18 +960,16 @@
|
||||
evt.initCustomEvent('input', false, false, null);
|
||||
}
|
||||
$input[0].dispatchEvent(evt);
|
||||
});
|
||||
waits(350); // Needed, due to debounce
|
||||
runs (function () {
|
||||
|
||||
var sent_stanza;
|
||||
spyOn(_converse.connection, 'send').andCallFake(function (stanza) {
|
||||
spyOn(_converse.connection, 'send').and.callFake(function (stanza) {
|
||||
sent_stanza = stanza;
|
||||
});
|
||||
var $hint = $input.siblings('ul').children('li');
|
||||
expect($input.val()).toBe('Felix');
|
||||
expect($hint[0].textContent).toBe('Felix Amsel');
|
||||
expect($hint.length).toBe(1);
|
||||
var evt;
|
||||
|
||||
if (typeof(Event) === 'function') {
|
||||
// Not working on PhantomJS
|
||||
evt = new Event('mousedown', {'bubbles': true});
|
||||
@ -1000,12 +985,13 @@
|
||||
"</message>"
|
||||
);
|
||||
}
|
||||
done();
|
||||
});
|
||||
}));
|
||||
|
||||
it("can be joined automatically, based upon a received invite", mock.initConverse(function (_converse) {
|
||||
test_utils.createContacts(_converse, 'current'); // We need roster contacts, who can invite us
|
||||
spyOn(window, 'confirm').andCallFake(function () {
|
||||
spyOn(window, 'confirm').and.callFake(function () {
|
||||
return true;
|
||||
});
|
||||
test_utils.openAndEnterChatRoom(_converse, 'lounge', 'localhost', 'dummy');
|
||||
@ -1079,15 +1065,14 @@
|
||||
expect($chat_content.find('.chat-message').length).toBe(1);
|
||||
expect($chat_content.find('.chat-msg-content').last().text()).toBe(text);
|
||||
// We don't emit an event if it's our own message
|
||||
expect(_converse.emit.callCount, 1);
|
||||
expect(_converse.emit.calls.count(), 1);
|
||||
}));
|
||||
|
||||
it("will cause the chat area to be scrolled down only if it was at the bottom already", mock.initConverse(function (_converse) {
|
||||
it("will cause the chat area to be scrolled down only if it was at the bottom already", mock.initConverseWithAsync(function (done, _converse) {
|
||||
var message = 'This message is received while the chat area is scrolled up';
|
||||
test_utils.openAndEnterChatRoom(_converse, 'lounge', 'localhost', 'dummy');
|
||||
var view = _converse.chatboxviews.get('lounge@localhost');
|
||||
spyOn(view, 'scrollDown').andCallThrough();
|
||||
runs(function () {
|
||||
spyOn(view, 'scrollDown').and.callThrough();
|
||||
/* Create enough messages so that there's a
|
||||
* scrollbar.
|
||||
*/
|
||||
@ -1100,14 +1085,9 @@
|
||||
id: (new Date()).getTime(),
|
||||
}).c('body').t('Message: '+i).tree());
|
||||
}
|
||||
});
|
||||
waits(500); // Give enough time for `markScrolled` to have been called
|
||||
runs(function () {
|
||||
// Give enough time for `markScrolled` to have been called
|
||||
setTimeout(function () {
|
||||
view.$content.scrollTop(0);
|
||||
});
|
||||
waits(250);
|
||||
runs(function () {
|
||||
expect(view.model.get('scrolled')).toBeTruthy();
|
||||
_converse.chatboxes.onMessage(
|
||||
$msg({
|
||||
from: 'lounge@localhost/someone',
|
||||
@ -1115,15 +1095,14 @@
|
||||
type: 'groupchat',
|
||||
id: (new Date()).getTime(),
|
||||
}).c('body').t(message).tree());
|
||||
});
|
||||
waits(150);
|
||||
runs(function () {
|
||||
|
||||
// Now check that the message appears inside the chatbox in the DOM
|
||||
var $chat_content = view.$el.find('.chat-content');
|
||||
var msg_txt = $chat_content.find('.chat-message:last').find('.chat-msg-content').text();
|
||||
expect(msg_txt).toEqual(message);
|
||||
expect(view.$content.scrollTop()).toBe(0);
|
||||
});
|
||||
done();
|
||||
}, 500);
|
||||
}));
|
||||
|
||||
it("shows received chatroom subject messages", mock.initConverse(function (_converse) {
|
||||
@ -1267,7 +1246,7 @@
|
||||
it("queries for the room information before attempting to join the user", mock.initConverse(function (_converse) {
|
||||
var sent_IQ, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_IQ = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
@ -1383,7 +1362,7 @@
|
||||
it("indicates when a room is no longer anonymous", mock.initConverse(function (_converse) {
|
||||
var sent_IQ, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_IQ = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
@ -1496,19 +1475,16 @@
|
||||
_converse.rosterview.render();
|
||||
}));
|
||||
|
||||
it("can be minimized by clicking a DOM element with class 'toggle-chatbox-button'", mock.initConverse(function (_converse) {
|
||||
it("can be minimized by clicking a DOM element with class 'toggle-chatbox-button'", mock.initConverseWithAsync(function (done, _converse) {
|
||||
test_utils.openChatRoom(_converse, 'lounge', 'localhost', 'dummy');
|
||||
var view = _converse.chatboxviews.get('lounge@localhost'),
|
||||
trimmed_chatboxes = _converse.minimized_chats;
|
||||
spyOn(view, 'minimize').andCallThrough();
|
||||
spyOn(view, 'maximize').andCallThrough();
|
||||
spyOn(view, 'minimize').and.callThrough();
|
||||
spyOn(view, 'maximize').and.callThrough();
|
||||
spyOn(_converse, 'emit');
|
||||
view.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
|
||||
runs(function () {
|
||||
view.$el.find('.toggle-chatbox-button').click();
|
||||
});
|
||||
waits(350);
|
||||
runs(function () {
|
||||
|
||||
expect(view.minimize).toHaveBeenCalled();
|
||||
expect(_converse.emit).toHaveBeenCalledWith('chatBoxMinimized', jasmine.any(Object));
|
||||
expect(view.$el.is(':visible')).toBeFalsy();
|
||||
@ -1516,29 +1492,28 @@
|
||||
expect(view.minimize).toHaveBeenCalled();
|
||||
var trimmedview = trimmed_chatboxes.get(view.model.get('id'));
|
||||
trimmedview.$("a.restore-chat").click();
|
||||
});
|
||||
waits(350);
|
||||
runs(function () {
|
||||
|
||||
test_utils.waitUntil(function () {
|
||||
return view.$el.is(':visible');
|
||||
}, 300)
|
||||
.then(function () {
|
||||
expect(view.maximize).toHaveBeenCalled();
|
||||
expect(_converse.emit).toHaveBeenCalledWith('chatBoxMaximized', jasmine.any(Object));
|
||||
expect(view.$el.is(':visible')).toBeTruthy();
|
||||
expect(view.model.get('minimized')).toBeFalsy();
|
||||
expect(_converse.emit.callCount, 3);
|
||||
expect(_converse.emit.calls.count(), 3);
|
||||
done();
|
||||
});
|
||||
}));
|
||||
|
||||
it("can be closed again by clicking a DOM element with class 'close-chatbox-button'", mock.initConverse(function (_converse) {
|
||||
test_utils.openChatRoom(_converse, 'lounge', 'localhost', 'dummy');
|
||||
var view = _converse.chatboxviews.get('lounge@localhost');
|
||||
spyOn(view, 'close').andCallThrough();
|
||||
spyOn(view, 'close').and.callThrough();
|
||||
spyOn(_converse, 'emit');
|
||||
spyOn(view, 'leave');
|
||||
view.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
|
||||
runs(function () {
|
||||
view.$el.find('.close-chatbox-button').click();
|
||||
});
|
||||
waits(50);
|
||||
runs(function () {
|
||||
expect(view.close).toHaveBeenCalled();
|
||||
expect(view.leave).toHaveBeenCalled();
|
||||
// XXX: After refactoring, the chat box only gets closed
|
||||
@ -1546,7 +1521,6 @@
|
||||
// we would have to mock the returned presence stanza.
|
||||
// See the "leave" method on the ChatRoomView.
|
||||
// expect(_converse.emit).toHaveBeenCalledWith('chatBoxClosed', jasmine.any(Object));
|
||||
});
|
||||
}));
|
||||
});
|
||||
|
||||
@ -1557,9 +1531,9 @@
|
||||
var sent_stanza;
|
||||
test_utils.openChatRoom(_converse, 'lounge', 'localhost', 'dummy');
|
||||
var view = _converse.chatboxviews.get('lounge@localhost');
|
||||
spyOn(view, 'onMessageSubmitted').andCallThrough();
|
||||
spyOn(view, 'onMessageSubmitted').and.callThrough();
|
||||
spyOn(view, 'clearChatRoomMessages');
|
||||
spyOn(_converse.connection, 'send').andCallFake(function (stanza) {
|
||||
spyOn(_converse.connection, 'send').and.callFake(function (stanza) {
|
||||
sent_stanza = stanza;
|
||||
});
|
||||
// Check the alias /topic
|
||||
@ -1590,7 +1564,7 @@
|
||||
it("to clear messages", mock.initConverse(function (_converse) {
|
||||
test_utils.openChatRoom(_converse, 'lounge', 'localhost', 'dummy');
|
||||
var view = _converse.chatboxviews.get('lounge@localhost');
|
||||
spyOn(view, 'onMessageSubmitted').andCallThrough();
|
||||
spyOn(view, 'onMessageSubmitted').and.callThrough();
|
||||
spyOn(view, 'clearChatRoomMessages');
|
||||
view.$el.find('.chat-textarea').text('/clear');
|
||||
view.$el.find('textarea.chat-textarea').trigger($.Event('keypress', {keyCode: 13}));
|
||||
@ -1601,16 +1575,16 @@
|
||||
it("to make a user an owner", mock.initConverse(function (_converse) {
|
||||
var sent_IQ, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_IQ = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
test_utils.openChatRoom(_converse, 'lounge', 'localhost', 'dummy');
|
||||
var view = _converse.chatboxviews.get('lounge@localhost');
|
||||
spyOn(view, 'onMessageSubmitted').andCallThrough();
|
||||
spyOn(view, 'setAffiliation').andCallThrough();
|
||||
spyOn(view, 'showStatusNotification').andCallThrough();
|
||||
spyOn(view, 'validateRoleChangeCommand').andCallThrough();
|
||||
spyOn(view, 'onMessageSubmitted').and.callThrough();
|
||||
spyOn(view, 'setAffiliation').and.callThrough();
|
||||
spyOn(view, 'showStatusNotification').and.callThrough();
|
||||
spyOn(view, 'validateRoleChangeCommand').and.callThrough();
|
||||
view.$el.find('.chat-textarea').text('/owner');
|
||||
view.$el.find('textarea.chat-textarea').trigger($.Event('keypress', {keyCode: 13}));
|
||||
expect(view.onMessageSubmitted).toHaveBeenCalled();
|
||||
@ -1626,8 +1600,8 @@
|
||||
// again via triggering Event doesn't work for some weird
|
||||
// reason.
|
||||
view.onMessageSubmitted('/owner annoyingGuy@localhost You\'re annoying');
|
||||
expect(view.validateRoleChangeCommand.callCount).toBe(2);
|
||||
expect(view.showStatusNotification.callCount).toBe(1);
|
||||
expect(view.validateRoleChangeCommand.calls.count()).toBe(2);
|
||||
expect(view.showStatusNotification.calls.count()).toBe(1);
|
||||
expect(view.setAffiliation).toHaveBeenCalled();
|
||||
// Check that the member list now gets updated
|
||||
expect(sent_IQ.toLocaleString()).toBe(
|
||||
@ -1643,16 +1617,16 @@
|
||||
it("to ban a user", mock.initConverse(function (_converse) {
|
||||
var sent_IQ, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_IQ = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
test_utils.openChatRoom(_converse, 'lounge', 'localhost', 'dummy');
|
||||
var view = _converse.chatboxviews.get('lounge@localhost');
|
||||
spyOn(view, 'onMessageSubmitted').andCallThrough();
|
||||
spyOn(view, 'setAffiliation').andCallThrough();
|
||||
spyOn(view, 'showStatusNotification').andCallThrough();
|
||||
spyOn(view, 'validateRoleChangeCommand').andCallThrough();
|
||||
spyOn(view, 'onMessageSubmitted').and.callThrough();
|
||||
spyOn(view, 'setAffiliation').and.callThrough();
|
||||
spyOn(view, 'showStatusNotification').and.callThrough();
|
||||
spyOn(view, 'validateRoleChangeCommand').and.callThrough();
|
||||
view.$el.find('.chat-textarea').text('/ban');
|
||||
view.$el.find('textarea.chat-textarea').trigger($.Event('keypress', {keyCode: 13}));
|
||||
expect(view.onMessageSubmitted).toHaveBeenCalled();
|
||||
@ -1667,8 +1641,8 @@
|
||||
// again via triggering Event doesn't work for some weird
|
||||
// reason.
|
||||
view.onMessageSubmitted('/ban annoyingGuy@localhost You\'re annoying');
|
||||
expect(view.validateRoleChangeCommand.callCount).toBe(2);
|
||||
expect(view.showStatusNotification.callCount).toBe(1);
|
||||
expect(view.validateRoleChangeCommand.calls.count()).toBe(2);
|
||||
expect(view.showStatusNotification.calls.count()).toBe(1);
|
||||
expect(view.setAffiliation).toHaveBeenCalled();
|
||||
// Check that the member list now gets updated
|
||||
expect(sent_IQ.toLocaleString()).toBe(
|
||||
@ -1707,17 +1681,13 @@
|
||||
.c('not-authorized').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
|
||||
|
||||
var view = _converse.chatboxviews.get('problematic@muc.localhost');
|
||||
spyOn(view, 'renderPasswordForm').andCallThrough();
|
||||
runs(function () {
|
||||
spyOn(view, 'renderPasswordForm').and.callThrough();
|
||||
view.onChatRoomPresence(presence);
|
||||
});
|
||||
waits(250);
|
||||
runs(function () {
|
||||
|
||||
var $chat_body = view.$el.find('.chatroom-body');
|
||||
expect(view.renderPasswordForm).toHaveBeenCalled();
|
||||
expect($chat_body.find('form.chatroom-form').length).toBe(1);
|
||||
expect($chat_body.find('legend').text()).toBe('This chatroom requires a password');
|
||||
});
|
||||
}));
|
||||
|
||||
it("will show an error message if the room is members-only and the user not included", mock.initConverse(function (_converse) {
|
||||
@ -1731,7 +1701,7 @@
|
||||
.c('error').attrs({by:'lounge@localhost', type:'auth'})
|
||||
.c('registration-required').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
|
||||
var view = _converse.chatboxviews.get('problematic@muc.localhost');
|
||||
spyOn(view, 'showErrorMessage').andCallThrough();
|
||||
spyOn(view, 'showErrorMessage').and.callThrough();
|
||||
view.onChatRoomPresence(presence);
|
||||
expect(view.$el.find('.chatroom-body p:last').text()).toBe('You are not on the member list of this room');
|
||||
}));
|
||||
@ -1747,7 +1717,7 @@
|
||||
.c('error').attrs({by:'lounge@localhost', type:'auth'})
|
||||
.c('forbidden').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
|
||||
var view = _converse.chatboxviews.get('problematic@muc.localhost');
|
||||
spyOn(view, 'showErrorMessage').andCallThrough();
|
||||
spyOn(view, 'showErrorMessage').and.callThrough();
|
||||
view.onChatRoomPresence(presence);
|
||||
expect(view.$el.find('.chatroom-body p:last').text()).toBe('You have been banned from this room');
|
||||
}));
|
||||
@ -1763,7 +1733,7 @@
|
||||
.c('error').attrs({by:'lounge@localhost', type:'cancel'})
|
||||
.c('conflict').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
|
||||
var view = _converse.chatboxviews.get('problematic@muc.localhost');
|
||||
spyOn(view, 'showErrorMessage').andCallThrough();
|
||||
spyOn(view, 'showErrorMessage').and.callThrough();
|
||||
view.onChatRoomPresence(presence);
|
||||
expect(view.$el.find('.chatroom-body form.chatroom-form label:first').text()).toBe('Please choose your nickname');
|
||||
}));
|
||||
@ -1795,8 +1765,8 @@
|
||||
.c('conflict').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
|
||||
|
||||
var view = _converse.chatboxviews.get('problematic@muc.localhost');
|
||||
spyOn(view, 'showErrorMessage').andCallThrough();
|
||||
spyOn(view, 'join').andCallThrough();
|
||||
spyOn(view, 'showErrorMessage').and.callThrough();
|
||||
spyOn(view, 'join').and.callThrough();
|
||||
|
||||
// Simulate repeatedly that there's already someone in the room
|
||||
// with that nickname
|
||||
@ -1832,7 +1802,7 @@
|
||||
.c('error').attrs({by:'lounge@localhost', type:'cancel'})
|
||||
.c('not-allowed').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
|
||||
var view = _converse.chatboxviews.get('problematic@muc.localhost');
|
||||
spyOn(view, 'showErrorMessage').andCallThrough();
|
||||
spyOn(view, 'showErrorMessage').and.callThrough();
|
||||
view.onChatRoomPresence(presence);
|
||||
expect(view.$el.find('.chatroom-body p:last').text()).toBe('You are not allowed to create new rooms');
|
||||
}));
|
||||
@ -1848,7 +1818,7 @@
|
||||
.c('error').attrs({by:'lounge@localhost', type:'cancel'})
|
||||
.c('not-acceptable').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
|
||||
var view = _converse.chatboxviews.get('problematic@muc.localhost');
|
||||
spyOn(view, 'showErrorMessage').andCallThrough();
|
||||
spyOn(view, 'showErrorMessage').and.callThrough();
|
||||
view.onChatRoomPresence(presence);
|
||||
expect(view.$el.find('.chatroom-body p:last').text()).toBe("Your nickname doesn't conform to this room's policies");
|
||||
}));
|
||||
@ -1864,7 +1834,7 @@
|
||||
.c('error').attrs({by:'lounge@localhost', type:'cancel'})
|
||||
.c('item-not-found').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
|
||||
var view = _converse.chatboxviews.get('problematic@muc.localhost');
|
||||
spyOn(view, 'showErrorMessage').andCallThrough();
|
||||
spyOn(view, 'showErrorMessage').and.callThrough();
|
||||
view.onChatRoomPresence(presence);
|
||||
expect(view.$el.find('.chatroom-body p:last').text()).toBe("This room does not (yet) exist");
|
||||
}));
|
||||
@ -1880,7 +1850,7 @@
|
||||
.c('error').attrs({by:'lounge@localhost', type:'cancel'})
|
||||
.c('service-unavailable').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
|
||||
var view = _converse.chatboxviews.get('problematic@muc.localhost');
|
||||
spyOn(view, 'showErrorMessage').andCallThrough();
|
||||
spyOn(view, 'showErrorMessage').and.callThrough();
|
||||
view.onChatRoomPresence(presence);
|
||||
expect(view.$el.find('.chatroom-body p:last').text()).toBe("This room has reached its maximum number of occupants");
|
||||
}));
|
||||
@ -1891,7 +1861,7 @@
|
||||
it("will first be added to the member list if the chat room is members only", mock.initConverse(function (_converse) {
|
||||
var sent_IQs = [], IQ_ids = [];
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_IQs.push(iq);
|
||||
IQ_ids.push(sendIQ.bind(this)(iq, callback, errback));
|
||||
});
|
||||
@ -1924,7 +1894,7 @@
|
||||
|
||||
var sent_stanza,
|
||||
sent_id;
|
||||
spyOn(_converse.connection, 'send').andCallFake(function (stanza) {
|
||||
spyOn(_converse.connection, 'send').and.callFake(function (stanza) {
|
||||
if (stanza.nodeTree && stanza.nodeTree.nodeName === 'message') {
|
||||
sent_id = stanza.nodeTree.getAttribute('id');
|
||||
sent_stanza = stanza;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -2,7 +2,7 @@
|
||||
define([
|
||||
"converse-core",
|
||||
"mock",
|
||||
"test_utils"], factory);
|
||||
"test-utils"], factory);
|
||||
} (this, function (converse, mock, test_utils) {
|
||||
var b64_sha1 = converse.env.b64_sha1;
|
||||
var _ = converse.env._;
|
||||
@ -52,9 +52,9 @@
|
||||
describe("A chat state indication", function () {
|
||||
|
||||
it("are sent out when the client becomes or stops being idle", mock.initConverse(function (_converse) {
|
||||
spyOn(_converse, 'sendCSI').andCallThrough();
|
||||
spyOn(_converse, 'sendCSI').and.callThrough();
|
||||
var sent_stanza;
|
||||
spyOn(_converse.connection, 'send').andCallFake(function (stanza) {
|
||||
spyOn(_converse.connection, 'send').and.callFake(function (stanza) {
|
||||
sent_stanza = stanza;
|
||||
});
|
||||
var i = 0;
|
||||
@ -298,8 +298,6 @@
|
||||
test_utils.createContacts(_converse, 'current');
|
||||
var jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@localhost';
|
||||
var chatboxview;
|
||||
waits('300'); // ChatBox.show() is debounced for 250ms
|
||||
runs(function () {
|
||||
// Test on chat that doesn't exist.
|
||||
expect(_converse.api.chats.get('non-existing@jabber.org')).toBeFalsy();
|
||||
var box = _converse.api.chats.open(jid);
|
||||
@ -317,7 +315,6 @@
|
||||
expect(_.isArray(list)).toBeTruthy();
|
||||
expect(list[0].model.get('box_id')).toBe(b64_sha1(jid));
|
||||
expect(list[1].model.get('box_id')).toBe(b64_sha1(jid2));
|
||||
});
|
||||
}));
|
||||
});
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
"jquery",
|
||||
"converse-core",
|
||||
"mock",
|
||||
"test_utils"], factory);
|
||||
"test-utils"], factory);
|
||||
} (this, function ($, converse, mock, test_utils) {
|
||||
"use strict";
|
||||
var Strophe = converse.env.Strophe;
|
||||
@ -11,10 +11,10 @@
|
||||
describe("Service Discovery", function () {
|
||||
describe("Whenever converse.js discovers a new server feature", function () {
|
||||
it("emits the serviceDiscovered event", mock.initConverse(function (_converse) {
|
||||
spyOn(_converse, 'emit');
|
||||
sinon.spy(_converse, 'emit');
|
||||
_converse.features.create({'var': Strophe.NS.MAM});
|
||||
expect(_converse.emit).toHaveBeenCalled();
|
||||
expect(_converse.emit.argsForCall[0][1].get('var')).toBe(Strophe.NS.MAM);
|
||||
expect(_converse.emit.called).toBe(true);
|
||||
expect(_converse.emit.args[0][1].get('var')).toBe(Strophe.NS.MAM);
|
||||
}));
|
||||
});
|
||||
});
|
||||
|
@ -1,5 +1,5 @@
|
||||
(function (root, factory) {
|
||||
define(["mock", "converse-core", "test_utils"], factory);
|
||||
define(["mock", "converse-core", "test-utils"], factory);
|
||||
} (this, function (mock, converse, test_utils) {
|
||||
|
||||
return describe("The _converse Event Emitter", function() {
|
||||
@ -11,9 +11,9 @@
|
||||
_converse.emit('connected');
|
||||
expect(this.callback).toHaveBeenCalled();
|
||||
_converse.emit('connected');
|
||||
expect(this.callback.callCount, 2);
|
||||
expect(this.callback.calls.count(), 2);
|
||||
_converse.emit('connected');
|
||||
expect(this.callback.callCount, 3);
|
||||
expect(this.callback.calls.count(), 3);
|
||||
}));
|
||||
|
||||
it("allows you to listen once for an emitted event", mock.initConverse(function (_converse) {
|
||||
@ -23,9 +23,9 @@
|
||||
_converse.emit('connected');
|
||||
expect(this.callback).toHaveBeenCalled();
|
||||
_converse.emit('connected');
|
||||
expect(this.callback.callCount, 1);
|
||||
expect(this.callback.calls.count(), 1);
|
||||
_converse.emit('connected');
|
||||
expect(this.callback.callCount, 1);
|
||||
expect(this.callback.calls.count(), 1);
|
||||
}));
|
||||
|
||||
it("allows you to stop listening or subscribing to an event", mock.initConverse(function (_converse) {
|
||||
@ -46,15 +46,15 @@
|
||||
_converse.off('connected', this.callback);
|
||||
|
||||
_converse.emit('connected');
|
||||
expect(this.callback.callCount, 1);
|
||||
expect(this.anotherCallback.callCount, 2);
|
||||
expect(this.callback.calls.count(), 1);
|
||||
expect(this.anotherCallback.calls.count(), 2);
|
||||
|
||||
_converse.once('connected', this.neverCalled);
|
||||
_converse.off('connected', this.neverCalled);
|
||||
|
||||
_converse.emit('connected');
|
||||
expect(this.callback.callCount, 1);
|
||||
expect(this.anotherCallback.callCount, 3);
|
||||
expect(this.callback.calls.count(), 1);
|
||||
expect(this.anotherCallback.calls.count(), 3);
|
||||
expect(this.neverCalled).not.toHaveBeenCalled();
|
||||
}));
|
||||
});
|
||||
|
@ -4,7 +4,7 @@
|
||||
"converse-core",
|
||||
"utils",
|
||||
"mock",
|
||||
"test_utils"
|
||||
"test-utils"
|
||||
], factory);
|
||||
} (this, function ($, converse, utils, mock, test_utils) {
|
||||
"use strict";
|
||||
@ -25,7 +25,6 @@
|
||||
* </message
|
||||
*/
|
||||
sinon.spy(utils, 'isHeadlineMessage');
|
||||
runs(function () {
|
||||
var stanza = $msg({
|
||||
'xmlns': 'jabber:client',
|
||||
'to': 'dummy@localhost',
|
||||
@ -35,13 +34,9 @@
|
||||
.c('nick', {'xmlns': "http://jabber.org/protocol/nick"}).t("-wwdmz").up()
|
||||
.c('body').t('SORRY FOR THIS ADVERT');
|
||||
_converse.connection._dataRecv(test_utils.createRequest(stanza));
|
||||
});
|
||||
waits(250);
|
||||
runs(function () {
|
||||
expect(utils.isHeadlineMessage.called).toBeTruthy();
|
||||
expect(utils.isHeadlineMessage.returned(false)).toBeTruthy();
|
||||
utils.isHeadlineMessage.restore();
|
||||
});
|
||||
}));
|
||||
|
||||
it("will open and display headline messages", mock.initConverse(function (_converse) {
|
||||
@ -59,7 +54,6 @@
|
||||
* </message>
|
||||
*/
|
||||
sinon.spy(utils, 'isHeadlineMessage');
|
||||
runs(function () {
|
||||
var stanza = $msg({
|
||||
'type': 'headline',
|
||||
'from': 'notify.example.com',
|
||||
@ -71,9 +65,6 @@
|
||||
.c('x', {'xmlns': 'jabber:x:oob'})
|
||||
.c('url').t('imap://romeo@example.com/INBOX;UIDVALIDITY=385759043/;UID=18');
|
||||
_converse.connection._dataRecv(test_utils.createRequest(stanza));
|
||||
});
|
||||
waits(250);
|
||||
runs(function () {
|
||||
expect(
|
||||
_.includes(
|
||||
_converse.chatboxviews.keys(),
|
||||
@ -82,13 +73,11 @@
|
||||
expect(utils.isHeadlineMessage.called).toBeTruthy();
|
||||
expect(utils.isHeadlineMessage.returned(true)).toBeTruthy();
|
||||
utils.isHeadlineMessage.restore(); // unwraps
|
||||
});
|
||||
}));
|
||||
|
||||
it("will not show a headline messages from a full JID if allow_non_roster_messaging is false", mock.initConverse(function (_converse) {
|
||||
_converse.allow_non_roster_messaging = false;
|
||||
sinon.spy(utils, 'isHeadlineMessage');
|
||||
runs(function () {
|
||||
var stanza = $msg({
|
||||
'type': 'headline',
|
||||
'from': 'andre5114@jabber.snc.ru/Spark',
|
||||
@ -98,14 +87,10 @@
|
||||
.c('nick').t('gpocy').up()
|
||||
.c('body').t('Здравствуйте друзья');
|
||||
_converse.connection._dataRecv(test_utils.createRequest(stanza));
|
||||
});
|
||||
waits(250);
|
||||
runs(function () {
|
||||
expect(_.without('controlbox', _converse.chatboxviews.keys()).length).toBe(0);
|
||||
expect(utils.isHeadlineMessage.called).toBeTruthy();
|
||||
expect(utils.isHeadlineMessage.returned(true)).toBeTruthy();
|
||||
utils.isHeadlineMessage.restore(); // unwraps
|
||||
});
|
||||
}));
|
||||
});
|
||||
}));
|
||||
|
30
spec/mam.js
30
spec/mam.js
@ -1,5 +1,5 @@
|
||||
(function (root, factory) {
|
||||
define(["mock", "converse-core", "test_utils"], factory);
|
||||
define(["mock", "converse-core", "test-utils"], factory);
|
||||
} (this, function (mock, converse, test_utils) {
|
||||
"use strict";
|
||||
var _ = converse.env._;
|
||||
@ -18,7 +18,7 @@
|
||||
it("can be used to query for all archived messages", mock.initConverse(function (_converse) {
|
||||
var sent_stanza, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_stanza = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
@ -34,7 +34,7 @@
|
||||
it("can be used to query for all messages to/from a particular JID", mock.initConverse(function (_converse) {
|
||||
var sent_stanza, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_stanza = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
@ -62,7 +62,7 @@
|
||||
it("can be used to query for all messages in a certain timespan", mock.initConverse(function (_converse) {
|
||||
var sent_stanza, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_stanza = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
@ -108,7 +108,7 @@
|
||||
it("can be used to query for all messages after a certain time", mock.initConverse(function (_converse) {
|
||||
var sent_stanza, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_stanza = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
@ -137,7 +137,7 @@
|
||||
it("can be used to query for a limited set of results", mock.initConverse(function (_converse) {
|
||||
var sent_stanza, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_stanza = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
@ -169,7 +169,7 @@
|
||||
it("can be used to page through results", mock.initConverse(function (_converse) {
|
||||
var sent_stanza, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_stanza = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
@ -206,7 +206,7 @@
|
||||
it("accepts \"before\" with an empty string as value to reverse the order", mock.initConverse(function (_converse) {
|
||||
var sent_stanza, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_stanza = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
@ -242,7 +242,7 @@
|
||||
}
|
||||
var sent_stanza, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_stanza = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
@ -280,7 +280,7 @@
|
||||
}
|
||||
var sent_stanza, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_stanza = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
@ -352,7 +352,7 @@
|
||||
_converse.connection._dataRecv(test_utils.createRequest(stanza));
|
||||
|
||||
expect(callback).toHaveBeenCalled();
|
||||
var args = callback.argsForCall[0];
|
||||
var args = callback.calls.argsFor(0);
|
||||
expect(args[0].length).toBe(2);
|
||||
expect(args[0][0].outerHTML).toBe(msg1.nodeTree.outerHTML);
|
||||
expect(args[0][1].outerHTML).toBe(msg2.nodeTree.outerHTML);
|
||||
@ -370,17 +370,17 @@
|
||||
it("is set once server support for MAM has been confirmed", mock.initConverse(function (_converse) {
|
||||
var sent_stanza, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_stanza = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
spyOn(_converse, 'onMAMPreferences').andCallThrough();
|
||||
spyOn(_converse, 'onMAMPreferences').and.callThrough();
|
||||
_converse.message_archiving = 'never';
|
||||
|
||||
var feature = new _converse.Feature({
|
||||
'var': Strophe.NS.MAM
|
||||
});
|
||||
spyOn(feature, 'save').andCallFake(feature.set); // Save will complain about a url not being set
|
||||
spyOn(feature, 'save').and.callFake(feature.set); // Save will complain about a url not being set
|
||||
_converse.features.onFeatureAdded(feature);
|
||||
|
||||
expect(_converse.connection.sendIQ).toHaveBeenCalled();
|
||||
@ -407,7 +407,7 @@
|
||||
|
||||
expect(_converse.onMAMPreferences).toHaveBeenCalled();
|
||||
|
||||
expect(_converse.connection.sendIQ.callCount).toBe(2);
|
||||
expect(_converse.connection.sendIQ.calls.count()).toBe(2);
|
||||
expect(sent_stanza.toString()).toBe(
|
||||
"<iq type='set' xmlns='jabber:client' id='"+IQ_id+"'>"+
|
||||
"<prefs xmlns='urn:xmpp:mam:0' default='never'>"+
|
||||
|
@ -1,5 +1,5 @@
|
||||
(function (root, factory) {
|
||||
define(["mock", "converse-core", "test_utils"], factory);
|
||||
define(["mock", "converse-core", "test-utils"], factory);
|
||||
} (this, function (mock, converse, test_utils) {
|
||||
var _ = converse.env._;
|
||||
var $msg = converse.env.$msg;
|
||||
|
@ -1,5 +1,5 @@
|
||||
(function (root, factory) {
|
||||
define(["mock", "converse-core", "test_utils", "utils"], factory);
|
||||
define(["mock", "converse-core", "test-utils", "utils"], factory);
|
||||
} (this, function (mock, converse, test_utils, utils) {
|
||||
"use strict";
|
||||
var _ = converse.env._;
|
||||
@ -16,7 +16,7 @@
|
||||
// TODO: not yet testing show_desktop_notifications setting
|
||||
test_utils.createContacts(_converse, 'current');
|
||||
spyOn(_converse, 'showMessageNotification');
|
||||
spyOn(_converse, 'areDesktopNotificationsEnabled').andReturn(true);
|
||||
spyOn(_converse, 'areDesktopNotificationsEnabled').and.returnValue(true);
|
||||
|
||||
var message = 'This message will show a desktop notification';
|
||||
var sender_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@localhost',
|
||||
@ -46,8 +46,8 @@
|
||||
};
|
||||
};
|
||||
}
|
||||
spyOn(_converse, 'showMessageNotification').andCallThrough();
|
||||
spyOn(_converse, 'areDesktopNotificationsEnabled').andReturn(true);
|
||||
spyOn(_converse, 'showMessageNotification').and.callThrough();
|
||||
spyOn(_converse, 'areDesktopNotificationsEnabled').and.returnValue(true);
|
||||
|
||||
var message = 'dummy: This message will show a desktop notification';
|
||||
var nick = mock.chatroom_names[0],
|
||||
@ -66,9 +66,8 @@
|
||||
}));
|
||||
|
||||
it("is shown for headline messages", mock.initConverse(function (_converse) {
|
||||
spyOn(_converse, 'showMessageNotification').andCallThrough();
|
||||
spyOn(_converse, 'areDesktopNotificationsEnabled').andReturn(true);
|
||||
runs(function () {
|
||||
spyOn(_converse, 'showMessageNotification').and.callThrough();
|
||||
spyOn(_converse, 'areDesktopNotificationsEnabled').and.returnValue(true);
|
||||
var stanza = $msg({
|
||||
'type': 'headline',
|
||||
'from': 'notify.example.com',
|
||||
@ -80,22 +79,17 @@
|
||||
.c('x', {'xmlns': 'jabber:x:oob'})
|
||||
.c('url').t('imap://romeo@example.com/INBOX;UIDVALIDITY=385759043/;UID=18');
|
||||
_converse.connection._dataRecv(test_utils.createRequest(stanza));
|
||||
});
|
||||
waits(250);
|
||||
runs(function () {
|
||||
expect(
|
||||
_.includes(_converse.chatboxviews.keys(),
|
||||
'notify.example.com')
|
||||
).toBeTruthy();
|
||||
expect(_converse.showMessageNotification).toHaveBeenCalled();
|
||||
});
|
||||
}));
|
||||
|
||||
it("is not shown for full JID headline messages if allow_non_roster_messaging is false", mock.initConverse(function (_converse) {
|
||||
_converse.allow_non_roster_messaging = false;
|
||||
spyOn(_converse, 'showMessageNotification').andCallThrough();
|
||||
spyOn(_converse, 'areDesktopNotificationsEnabled').andReturn(true);
|
||||
runs(function () {
|
||||
spyOn(_converse, 'showMessageNotification').and.callThrough();
|
||||
spyOn(_converse, 'areDesktopNotificationsEnabled').and.returnValue(true);
|
||||
var stanza = $msg({
|
||||
'type': 'headline',
|
||||
'from': 'someone@notify.example.com',
|
||||
@ -107,15 +101,11 @@
|
||||
.c('x', {'xmlns': 'jabber:x:oob'})
|
||||
.c('url').t('imap://romeo@example.com/INBOX;UIDVALIDITY=385759043/;UID=18');
|
||||
_converse.connection._dataRecv(test_utils.createRequest(stanza));
|
||||
});
|
||||
waits(250);
|
||||
runs(function () {
|
||||
expect(
|
||||
_.includes(_converse.chatboxviews.keys(),
|
||||
'someone@notify.example.com')
|
||||
).toBeFalsy();
|
||||
expect(_converse.showMessageNotification).not.toHaveBeenCalled();
|
||||
});
|
||||
}));
|
||||
|
||||
it("is shown when a user changes their chat state (if show_chatstate_notifications is true)", mock.initConverse(function (_converse) {
|
||||
@ -123,7 +113,7 @@
|
||||
_converse.show_chatstate_notifications = true;
|
||||
|
||||
test_utils.createContacts(_converse, 'current');
|
||||
spyOn(_converse, 'areDesktopNotificationsEnabled').andReturn(true);
|
||||
spyOn(_converse, 'areDesktopNotificationsEnabled').and.returnValue(true);
|
||||
spyOn(_converse, 'showChatStateNotification');
|
||||
var jid = mock.cur_names[2].replace(/ /g,'.').toLowerCase() + '@localhost';
|
||||
_converse.roster.get(jid).set('chat_status', 'busy'); // This will emit 'contactStatusChanged'
|
||||
@ -135,7 +125,7 @@
|
||||
|
||||
describe("When a new contact request is received", function () {
|
||||
it("an HTML5 Notification is received", mock.initConverse(function (_converse) {
|
||||
spyOn(_converse, 'areDesktopNotificationsEnabled').andReturn(true);
|
||||
spyOn(_converse, 'areDesktopNotificationsEnabled').and.returnValue(true);
|
||||
spyOn(_converse, 'showContactRequestNotification');
|
||||
_converse.emit('contactRequest', {'fullname': 'Peter Parker', 'jid': 'peter@parker.com'});
|
||||
expect(_converse.areDesktopNotificationsEnabled).toHaveBeenCalled();
|
||||
|
@ -1,5 +1,5 @@
|
||||
(function (root, factory) {
|
||||
define(["mock", "converse-core", "test_utils"], factory);
|
||||
define(["mock", "converse-core", "test-utils"], factory);
|
||||
} (this, function (mock, converse, test_utils) {
|
||||
var $ = converse.env.jQuery;
|
||||
var Strophe = converse.env.Strophe;
|
||||
@ -41,7 +41,7 @@
|
||||
spyOn(_converse.connection, 'send');
|
||||
chatbox.set('otr_status', 1); // Set OTR status to UNVERIFIED, to mock an encrypted session
|
||||
chatbox.trigger('sendMessage', new _converse.Message({ message: msgtext }));
|
||||
var $sent = $(_converse.connection.send.argsForCall[0][0].tree());
|
||||
var $sent = $(_converse.connection.send.calls.argsFor(0)[0].tree());
|
||||
expect($sent.find('body').siblings('private').length).toBe(1);
|
||||
expect($sent.find('private').length).toBe(1);
|
||||
expect($sent.find('private').attr('xmlns')).toBe('urn:xmpp:carbons:2');
|
||||
|
12
spec/ping.js
12
spec/ping.js
@ -1,5 +1,5 @@
|
||||
(function (root, factory) {
|
||||
define(["mock", "converse-core", "test_utils", "converse-ping"], factory);
|
||||
define(["mock", "converse-core", "test-utils", "converse-ping"], factory);
|
||||
} (this, function (mock, test_utils) {
|
||||
"use strict";
|
||||
|
||||
@ -7,16 +7,16 @@
|
||||
describe("Ping and pong handlers", function () {
|
||||
|
||||
it("are registered when _converse.js is connected", mock.initConverse(function (_converse) {
|
||||
spyOn(_converse, 'registerPingHandler').andCallThrough();
|
||||
spyOn(_converse, 'registerPongHandler').andCallThrough();
|
||||
spyOn(_converse, 'registerPingHandler').and.callThrough();
|
||||
spyOn(_converse, 'registerPongHandler').and.callThrough();
|
||||
_converse.emit('connected');
|
||||
expect(_converse.registerPingHandler).toHaveBeenCalled();
|
||||
expect(_converse.registerPongHandler).toHaveBeenCalled();
|
||||
}));
|
||||
|
||||
it("are registered when _converse.js reconnected", mock.initConverse(function (_converse) {
|
||||
spyOn(_converse, 'registerPingHandler').andCallThrough();
|
||||
spyOn(_converse, 'registerPongHandler').andCallThrough();
|
||||
spyOn(_converse, 'registerPingHandler').and.callThrough();
|
||||
spyOn(_converse, 'registerPongHandler').and.callThrough();
|
||||
_converse.emit('reconnected');
|
||||
expect(_converse.registerPingHandler).toHaveBeenCalled();
|
||||
expect(_converse.registerPongHandler).toHaveBeenCalled();
|
||||
@ -28,7 +28,7 @@
|
||||
it("is sent out when _converse.js pings a server", mock.initConverse(function (_converse) {
|
||||
var sent_stanza, IQ_id;
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_stanza = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
|
@ -5,7 +5,7 @@
|
||||
"jquery",
|
||||
"converse-core",
|
||||
"mock",
|
||||
"test_utils",
|
||||
"test-utils",
|
||||
"lodash"], factory);
|
||||
} (this, function ($, converse, mock, test_utils, _) {
|
||||
"use strict";
|
||||
|
@ -3,7 +3,7 @@
|
||||
"jquery",
|
||||
"converse-core",
|
||||
"mock",
|
||||
"test_utils"], factory);
|
||||
"test-utils"], factory);
|
||||
} (this, function ($, converse, mock, test_utils) {
|
||||
"use strict";
|
||||
var Strophe = converse.env.Strophe;
|
||||
@ -46,25 +46,21 @@
|
||||
* that session. A client MUST acknowledge each roster push with an IQ
|
||||
* stanza of type "result".
|
||||
*/
|
||||
it("Subscribe to contact, contact accepts and subscribes back", mock.initConverse(function (_converse) {
|
||||
it("Subscribe to contact, contact accepts and subscribes back", mock.initConverseWithAsync(function (done, _converse) {
|
||||
/* The process by which a user subscribes to a contact, including
|
||||
* the interaction between roster items and subscription states.
|
||||
*/
|
||||
_converse.roster_groups = false;
|
||||
var contact, stanza, sent_stanza, IQ_id;
|
||||
runs(function () {
|
||||
test_utils.openControlBox(_converse);
|
||||
});
|
||||
waits(100);
|
||||
runs(function () {
|
||||
var panel = _converse.chatboxviews.get('controlbox').contactspanel;
|
||||
spyOn(panel, "addContactFromForm").andCallThrough();
|
||||
spyOn(_converse.roster, "addAndSubscribe").andCallThrough();
|
||||
spyOn(_converse.roster, "addContact").andCallThrough();
|
||||
spyOn(_converse.roster, "sendContactAddIQ").andCallThrough();
|
||||
spyOn(_converse, "getVCard").andCallThrough();
|
||||
spyOn(panel, "addContactFromForm").and.callThrough();
|
||||
spyOn(_converse.roster, "addAndSubscribe").and.callThrough();
|
||||
spyOn(_converse.roster, "addContact").and.callThrough();
|
||||
spyOn(_converse.roster, "sendContactAddIQ").and.callThrough();
|
||||
spyOn(_converse, "getVCard").and.callThrough();
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_stanza = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
@ -137,12 +133,12 @@
|
||||
* </iq>
|
||||
*/
|
||||
var create = _converse.roster.create;
|
||||
spyOn(_converse.connection, 'send').andCallFake(function (stanza) {
|
||||
spyOn(_converse.connection, 'send').and.callFake(function (stanza) {
|
||||
sent_stanza = stanza;
|
||||
});
|
||||
spyOn(_converse.roster, 'create').andCallFake(function () {
|
||||
spyOn(_converse.roster, 'create').and.callFake(function () {
|
||||
contact = create.apply(_converse.roster, arguments);
|
||||
spyOn(contact, 'subscribe').andCallThrough();
|
||||
spyOn(contact, 'subscribe').and.callThrough();
|
||||
return contact;
|
||||
});
|
||||
stanza = $iq({'type': 'set'}).c('query', {'xmlns': 'jabber:iq:roster'})
|
||||
@ -193,7 +189,7 @@
|
||||
* </query>
|
||||
* </iq>
|
||||
*/
|
||||
spyOn(_converse.roster, "updateContact").andCallThrough();
|
||||
spyOn(_converse.roster, "updateContact").and.callThrough();
|
||||
stanza = $iq({'type': 'set', 'from': 'dummy@localhost'})
|
||||
.c('query', {'xmlns': 'jabber:iq:roster'})
|
||||
.c('item', {
|
||||
@ -203,18 +199,18 @@
|
||||
'name': 'contact@example.org'});
|
||||
_converse.connection._dataRecv(test_utils.createRequest(stanza));
|
||||
expect(_converse.roster.updateContact).toHaveBeenCalled();
|
||||
});
|
||||
waits(50);
|
||||
runs(function () {
|
||||
// Check that the user is now properly shown as a pending
|
||||
// contact in the roster.
|
||||
test_utils.waitUntil(function () {
|
||||
return $('a:contains("Pending contacts")').length;
|
||||
}).then(function () {
|
||||
var $header = $('a:contains("Pending contacts")');
|
||||
expect($header.length).toBe(1);
|
||||
expect($header.is(":visible")).toBeTruthy();
|
||||
var $contacts = $header.parent().nextUntil('dt', 'dd');
|
||||
expect($contacts.length).toBe(1);
|
||||
|
||||
spyOn(contact, "ackSubscribe").andCallThrough();
|
||||
spyOn(contact, "ackSubscribe").and.callThrough();
|
||||
/* Here we assume the "happy path" that the contact
|
||||
* approves the subscription request
|
||||
*
|
||||
@ -301,8 +297,8 @@
|
||||
*
|
||||
* <presence from='contact@example.org' to='user@example.com' type='subscribe'/>
|
||||
*/
|
||||
spyOn(contact, 'authorize').andCallThrough();
|
||||
spyOn(_converse.roster, 'handleIncomingSubscription').andCallThrough();
|
||||
spyOn(contact, 'authorize').and.callThrough();
|
||||
spyOn(_converse.roster, 'handleIncomingSubscription').and.callThrough();
|
||||
stanza = $pres({
|
||||
'to': _converse.bare_jid,
|
||||
'from': 'contact@example.org/resource',
|
||||
@ -348,6 +344,7 @@
|
||||
// The class on the contact will now have switched.
|
||||
expect($contacts.hasClass('to')).toBeFalsy();
|
||||
expect($contacts.hasClass('both')).toBeTruthy();
|
||||
done();
|
||||
});
|
||||
}));
|
||||
|
||||
@ -356,11 +353,7 @@
|
||||
* the interaction between roster items and subscription states.
|
||||
*/
|
||||
var contact, stanza, sent_stanza, sent_IQ;
|
||||
runs(function () {
|
||||
test_utils.openControlBox(_converse);
|
||||
});
|
||||
waits(100);
|
||||
runs(function () {
|
||||
// Add a new roster contact via roster push
|
||||
stanza = $iq({'type': 'set'}).c('query', {'xmlns': 'jabber:iq:roster'})
|
||||
.c('item', {
|
||||
@ -369,18 +362,15 @@
|
||||
'ask': 'subscribe',
|
||||
'name': 'contact@example.org'});
|
||||
_converse.connection._dataRecv(test_utils.createRequest(stanza));
|
||||
});
|
||||
waits(50);
|
||||
runs(function () {
|
||||
// A pending contact should now exist.
|
||||
contact = _converse.roster.get('contact@example.org');
|
||||
expect(_converse.roster.get('contact@example.org') instanceof _converse.RosterContact).toBeTruthy();
|
||||
spyOn(contact, "ackUnsubscribe").andCallThrough();
|
||||
spyOn(contact, "ackUnsubscribe").and.callThrough();
|
||||
|
||||
spyOn(_converse.connection, 'send').andCallFake(function (stanza) {
|
||||
spyOn(_converse.connection, 'send').and.callFake(function (stanza) {
|
||||
sent_stanza = stanza;
|
||||
});
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_IQ = iq;
|
||||
});
|
||||
/* We now assume the contact declines the subscription
|
||||
@ -438,28 +428,26 @@
|
||||
"</query>"+
|
||||
"</iq>"
|
||||
);
|
||||
});
|
||||
}));
|
||||
|
||||
it("Unsubscribe to a contact when subscription is mutual", mock.initConverse(function (_converse) {
|
||||
it("Unsubscribe to a contact when subscription is mutual", mock.initConverseWithAsync(function (done, _converse) {
|
||||
var sent_IQ, IQ_id, jid = 'annegreet.gomez@localhost';
|
||||
_converse.roster_groups = false;
|
||||
runs(function () {
|
||||
test_utils.openControlBox(_converse);
|
||||
test_utils.createContacts(_converse, 'current');
|
||||
});
|
||||
waits(50);
|
||||
runs(function () {
|
||||
spyOn(window, 'confirm').andReturn(true);
|
||||
spyOn(window, 'confirm').and.returnValue(true);
|
||||
// We now have a contact we want to remove
|
||||
expect(_converse.roster.get(jid) instanceof _converse.RosterContact).toBeTruthy();
|
||||
|
||||
var sendIQ = _converse.connection.sendIQ;
|
||||
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
spyOn(_converse.connection, 'sendIQ').and.callFake(function (iq, callback, errback) {
|
||||
sent_IQ = iq;
|
||||
IQ_id = sendIQ.bind(this)(iq, callback, errback);
|
||||
});
|
||||
|
||||
test_utils.waitUntil(function () {
|
||||
return $('a:contains("My contacts")').length;
|
||||
}).then(function () {
|
||||
var $header = $('a:contains("My contacts")');
|
||||
// remove the first user
|
||||
$($header.parent().nextUntil('dt', 'dd').find('.remove-xmpp-contact').get(0)).click();
|
||||
@ -497,16 +485,13 @@
|
||||
_converse.connection._dataRecv(test_utils.createRequest(stanza));
|
||||
// Our contact has now been removed
|
||||
expect(typeof _converse.roster.get(jid) === "undefined").toBeTruthy();
|
||||
done();
|
||||
});
|
||||
}));
|
||||
|
||||
it("Receiving a subscription request", mock.initConverse(function (_converse) {
|
||||
runs(function () {
|
||||
test_utils.openControlBox(_converse);
|
||||
test_utils.createContacts(_converse, 'current'); // Create some contacts so that we can test positioning
|
||||
});
|
||||
waits(50);
|
||||
runs(function () {
|
||||
spyOn(_converse, "emit");
|
||||
/* <presence
|
||||
* from='user@example.com'
|
||||
@ -522,6 +507,9 @@
|
||||
}).t('Clint Contact');
|
||||
_converse.connection._dataRecv(test_utils.createRequest(stanza));
|
||||
expect(_converse.emit).toHaveBeenCalledWith('contactRequest', jasmine.any(Object));
|
||||
test_utils.waitUntil(function () {
|
||||
return $('a:contains("Contact requests")').length;
|
||||
}).then(function () {
|
||||
var $header = $('a:contains("Contact requests")');
|
||||
expect($header.length).toBe(1);
|
||||
expect($header.is(":visible")).toBeTruthy();
|
||||
|
@ -1,5 +1,5 @@
|
||||
(function (root, factory) {
|
||||
define(["mock", "converse-core", "test_utils"], factory);
|
||||
define(["mock", "converse-core", "test-utils"], factory);
|
||||
} (this, function (mock, converse, test_utils) {
|
||||
var $ = converse.env.jQuery;
|
||||
var Strophe = converse.env.Strophe;
|
||||
@ -8,22 +8,18 @@
|
||||
describe("The Registration Panel", function () {
|
||||
|
||||
it("is not available unless allow_registration=true", mock.initConverse(function (_converse) {
|
||||
runs(test_utils.openControlBox);
|
||||
waits(50);
|
||||
runs(function () {
|
||||
test_utils.openControlBox();
|
||||
var cbview = _converse.chatboxviews.get('controlbox');
|
||||
expect(cbview.$('#controlbox-tabs li').length).toBe(1);
|
||||
expect(cbview.$('#controlbox-tabs li').text().trim()).toBe("Sign in");
|
||||
});
|
||||
|
||||
}, { auto_login: false,
|
||||
allow_registration: false,
|
||||
}));
|
||||
|
||||
it("can be opened by clicking on the registration tab", mock.initConverse(function (_converse) {
|
||||
var cbview = _converse.chatboxviews.get('controlbox');
|
||||
runs(test_utils.openControlBox);
|
||||
waits(50);
|
||||
runs(function () {
|
||||
test_utils.openControlBox();
|
||||
var $tabs = cbview.$('#controlbox-tabs');
|
||||
var $panels = cbview.$('.controlbox-panes');
|
||||
var $login = $panels.children().first();
|
||||
@ -31,13 +27,13 @@
|
||||
expect($tabs.find('li').first().text()).toBe('Sign in');
|
||||
expect($tabs.find('li').last().text()).toBe('Register');
|
||||
|
||||
spyOn(cbview, 'switchTab').andCallThrough();
|
||||
spyOn(cbview, 'switchTab').and.callThrough();
|
||||
cbview.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
|
||||
$tabs.find('li').last().find('a').click(); // Click the Register tab
|
||||
expect($login.is(':visible')).toBe(false);
|
||||
expect($registration.is(':visible')).toBe(true);
|
||||
expect(cbview.switchTab).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
}, { auto_login: false,
|
||||
allow_registration: true,
|
||||
}));
|
||||
@ -45,7 +41,7 @@
|
||||
it("allows the user to choose an XMPP provider's domain", mock.initConverse(function (_converse) {
|
||||
var cbview = _converse.chatboxviews.get('controlbox');
|
||||
var registerview = cbview.registerpanel;
|
||||
spyOn(registerview, 'onProviderChosen').andCallThrough();
|
||||
spyOn(registerview, 'onProviderChosen').and.callThrough();
|
||||
registerview.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
|
||||
spyOn(_converse.connection, 'connect');
|
||||
var $tabs = cbview.$('#controlbox-tabs');
|
||||
@ -72,12 +68,12 @@
|
||||
var cbview = _converse.chatboxviews.get('controlbox');
|
||||
cbview.$('#controlbox-tabs').find('li').last().find('a').click(); // Click the Register tab
|
||||
var registerview = _converse.chatboxviews.get('controlbox').registerpanel;
|
||||
spyOn(registerview, 'onProviderChosen').andCallThrough();
|
||||
spyOn(registerview, 'getRegistrationFields').andCallThrough();
|
||||
spyOn(registerview, 'onRegistrationFields').andCallThrough();
|
||||
spyOn(registerview, 'renderRegistrationForm').andCallThrough();
|
||||
spyOn(registerview, 'onProviderChosen').and.callThrough();
|
||||
spyOn(registerview, 'getRegistrationFields').and.callThrough();
|
||||
spyOn(registerview, 'onRegistrationFields').and.callThrough();
|
||||
spyOn(registerview, 'renderRegistrationForm').and.callThrough();
|
||||
registerview.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
|
||||
spyOn(_converse.connection, 'connect').andCallThrough();
|
||||
spyOn(_converse.connection, 'connect').and.callThrough();
|
||||
|
||||
expect(registerview._registering).toBeFalsy();
|
||||
expect(_converse.connection.connected).toBeFalsy();
|
||||
@ -120,12 +116,12 @@
|
||||
var cbview = _converse.chatboxviews.get('controlbox');
|
||||
cbview.$('#controlbox-tabs').find('li').last().find('a').click(); // Click the Register tab
|
||||
var registerview = _converse.chatboxviews.get('controlbox').registerpanel;
|
||||
spyOn(registerview, 'onProviderChosen').andCallThrough();
|
||||
spyOn(registerview, 'getRegistrationFields').andCallThrough();
|
||||
spyOn(registerview, 'onRegistrationFields').andCallThrough();
|
||||
spyOn(registerview, 'renderRegistrationForm').andCallThrough();
|
||||
spyOn(registerview, 'onProviderChosen').and.callThrough();
|
||||
spyOn(registerview, 'getRegistrationFields').and.callThrough();
|
||||
spyOn(registerview, 'onRegistrationFields').and.callThrough();
|
||||
spyOn(registerview, 'renderRegistrationForm').and.callThrough();
|
||||
registerview.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
|
||||
spyOn(_converse.connection, 'connect').andCallThrough();
|
||||
spyOn(_converse.connection, 'connect').and.callThrough();
|
||||
|
||||
registerview.$('input[name=domain]').val('conversejs.org');
|
||||
registerview.$('input[type=submit]').click();
|
||||
@ -158,7 +154,7 @@
|
||||
registerview.$('input[type=submit]').click();
|
||||
|
||||
expect(_converse.connection.send).toHaveBeenCalled();
|
||||
var $stanza = $(_converse.connection.send.argsForCall[0][0].tree());
|
||||
var $stanza = $(_converse.connection.send.calls.argsFor(0)[0].tree());
|
||||
expect($stanza.children('query').children().length).toBe(3);
|
||||
expect($stanza.children('query').children()[0].tagName).toBe('username');
|
||||
}, { auto_login: false,
|
||||
@ -169,12 +165,12 @@
|
||||
var cbview = _converse.chatboxviews.get('controlbox');
|
||||
cbview.$('#controlbox-tabs').find('li').last().find('a').click(); // Click the Register tab
|
||||
var registerview = _converse.chatboxviews.get('controlbox').registerpanel;
|
||||
spyOn(registerview, 'onProviderChosen').andCallThrough();
|
||||
spyOn(registerview, 'getRegistrationFields').andCallThrough();
|
||||
spyOn(registerview, 'onRegistrationFields').andCallThrough();
|
||||
spyOn(registerview, 'renderRegistrationForm').andCallThrough();
|
||||
spyOn(registerview, 'onProviderChosen').and.callThrough();
|
||||
spyOn(registerview, 'getRegistrationFields').and.callThrough();
|
||||
spyOn(registerview, 'onRegistrationFields').and.callThrough();
|
||||
spyOn(registerview, 'renderRegistrationForm').and.callThrough();
|
||||
registerview.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
|
||||
spyOn(_converse.connection, 'connect').andCallThrough();
|
||||
spyOn(_converse.connection, 'connect').and.callThrough();
|
||||
|
||||
registerview.$('input[name=domain]').val('conversejs.org');
|
||||
registerview.$('input[type=submit]').click();
|
||||
@ -209,7 +205,7 @@
|
||||
registerview.$('input[type=submit]').click();
|
||||
|
||||
expect(_converse.connection.send).toHaveBeenCalled();
|
||||
var $stanza = $(_converse.connection.send.argsForCall[0][0].tree());
|
||||
var $stanza = $(_converse.connection.send.calls.argsFor(0)[0].tree());
|
||||
expect($stanza.children('query').children().length).toBe(1);
|
||||
expect($stanza.children('query').children().children().length).toBe(3);
|
||||
expect($stanza.children('query').children().children()[0].tagName).toBe('field');
|
||||
|
@ -1,6 +1,6 @@
|
||||
(function (root, factory) {
|
||||
define(["converse-core"], factory);
|
||||
} (this, function (converse) {
|
||||
define(["jasmine-html", "converse-core"], factory);
|
||||
} (this, function (jasmine, converse) {
|
||||
var utils = converse.env.utils,
|
||||
_ = converse.env._;
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
(function (root, factory) {
|
||||
define(["mock", "converse-core", "test_utils"], factory);
|
||||
define(["mock", "converse-core", "test-utils"], factory);
|
||||
} (this, function (mock, converse, test_utils) {
|
||||
var $ = converse.env.jQuery;
|
||||
|
||||
@ -7,11 +7,11 @@
|
||||
|
||||
it("won't send <show>online</show> when setting a custom status message", mock.initConverse(function (_converse) {
|
||||
_converse.xmppstatus.save({'status': 'online'});
|
||||
spyOn(_converse.xmppstatus, 'setStatusMessage').andCallThrough();
|
||||
spyOn(_converse.xmppstatus, 'setStatusMessage').and.callThrough();
|
||||
spyOn(_converse.connection, 'send');
|
||||
_converse.xmppstatus.setStatusMessage("I'm also happy!");
|
||||
expect(_converse.connection.send).toHaveBeenCalled();
|
||||
var $stanza = $(_converse.connection.send.argsForCall[0][0].tree());
|
||||
var $stanza = $(_converse.connection.send.calls.argsFor(0)[0].tree());
|
||||
expect($stanza.children().length).toBe(2);
|
||||
expect($stanza.children('status').length).toBe(1);
|
||||
expect($stanza.children('status').text()).toBe("I'm also happy!");
|
||||
|
@ -21,6 +21,7 @@ require.config({
|
||||
"backbone.browserStorage": "node_modules/backbone.browserStorage/backbone.browserStorage",
|
||||
"backbone.overview": "node_modules/backbone.overview/backbone.overview",
|
||||
"eventemitter": "node_modules/otr/build/dep/eventemitter",
|
||||
"es6-promise": "node_modules/es6-promise/dist/es6-promise",
|
||||
"jquery": "node_modules/jquery/dist/jquery",
|
||||
"jquery-private": "src/jquery-private",
|
||||
"jquery.browser": "node_modules/jquery.browser/dist/jquery.browser",
|
||||
|
11
tests.html
11
tests.html
@ -4,12 +4,16 @@
|
||||
<head>
|
||||
<title>Converse.js Tests</title>
|
||||
<meta name="description" content="Converse.js: A chat client for your website" />
|
||||
<link rel="shortcut icon" type="image/png" href="components/jasmine/images/jasmine_favicon.png">
|
||||
<link rel="shortcut icon" type="image/png" href="node_modules/jasmine-core/images/jasmine_favicon.png">
|
||||
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="node_modules/jasmine-core/lib/jasmine-core/jasmine.css">
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="css/jasmine.css">
|
||||
<link type="text/css" rel="stylesheet" media="screen" href="css/theme.css" />
|
||||
<link type="text/css" rel="stylesheet" media="screen" href="css/converse.css" />
|
||||
|
||||
<script src="src/config.js"></script>
|
||||
<script data-main="tests/main" src="node_modules/requirejs/require.js"></script>
|
||||
<script data-main="tests/runner" src="node_modules/requirejs/require.js"></script>
|
||||
|
||||
<style>
|
||||
.tests-brand-heading {
|
||||
margin-top: 1em;
|
||||
@ -21,7 +25,8 @@
|
||||
<body>
|
||||
<div id="header_wrap" class="outer">
|
||||
<header class="inner">
|
||||
<h1 class="brand-heading tests-brand-heading"><i class="icon-conversejs"></i> Converse.js</h1>
|
||||
<h1 class="brand-heading tests-brand-heading">
|
||||
<i class="icon-conversejs"></i> Converse.js</h1>
|
||||
<h2 id="project_tagline">Tests</h2>
|
||||
</header>
|
||||
</div>
|
||||
|
@ -44,7 +44,7 @@
|
||||
'preventDefault': function () {}
|
||||
};
|
||||
|
||||
mock.mock_connection = function () {
|
||||
mock.mock_connection = function () { // eslint-disable-line wrap-iife
|
||||
return function () {
|
||||
Strophe.Bosh.prototype._processRequest = function () {}; // Don't attempt to send out stanzas
|
||||
var c = new Strophe.Connection('jasmine tests');
|
||||
@ -76,11 +76,9 @@
|
||||
};
|
||||
}();
|
||||
|
||||
mock.initConverse = function (func, settings) {
|
||||
return function () {
|
||||
function initConverse (settings) {
|
||||
window.localStorage.clear();
|
||||
window.sessionStorage.clear();
|
||||
|
||||
var converse = converse_api.initialize(_.extend({
|
||||
i18n: window.locales.en,
|
||||
auto_subscribe: false,
|
||||
@ -94,7 +92,17 @@
|
||||
debug: false
|
||||
}, settings || {}));
|
||||
converse.ChatBoxViews.prototype.trimChat = function () {};
|
||||
return func(converse);
|
||||
return converse;
|
||||
}
|
||||
mock.initConverseWithAsync = function (func, settings) {
|
||||
return function (done) {
|
||||
return func(done, initConverse(settings));
|
||||
};
|
||||
};
|
||||
mock.initConverse = function (func, settings) {
|
||||
return function () {
|
||||
initConverse(settings);
|
||||
return func(initConverse(settings));
|
||||
};
|
||||
};
|
||||
return mock;
|
||||
|
97
tests/run-jasmine2.js
Normal file
97
tests/run-jasmine2.js
Normal file
@ -0,0 +1,97 @@
|
||||
/*global document, require, setInterval, clearInterval, eval, phantom, console */
|
||||
|
||||
var system = require('system');
|
||||
|
||||
function waitFor(testFx, onReady, timeOutMillis) {
|
||||
/**
|
||||
* Wait until the test condition is true or a timeout occurs. Useful for waiting
|
||||
* on a server response or for a ui change (fadeIn, etc.) to occur.
|
||||
*
|
||||
* @param testFx javascript condition that evaluates to a boolean,
|
||||
* it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
|
||||
* as a callback function.
|
||||
* @param onReady what to do when testFx condition is fulfilled,
|
||||
* it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
|
||||
* as a callback function.
|
||||
* @param timeOutMillis the max amount of time to wait. If not specified, 3 sec is used.
|
||||
*/
|
||||
"use strict";
|
||||
var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 40001, //< Default Max Timeout is 10s
|
||||
start = new Date().getTime(),
|
||||
condition = false,
|
||||
interval = setInterval(function() {
|
||||
if ( (new Date().getTime() - start < maxtimeOutMillis) && !condition ) {
|
||||
// If not time-out yet and condition not yet fulfilled
|
||||
condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); // eslint-disable-line no-eval
|
||||
} else {
|
||||
if(!condition) {
|
||||
// If condition still not fulfilled (timeout but condition is 'false')
|
||||
console.log("'waitFor()' timeout");
|
||||
phantom.exit(1);
|
||||
} else {
|
||||
// Condition fulfilled (timeout and/or condition is 'true')
|
||||
console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms.");
|
||||
// Do what it's supposed to do once the condition is fulfilled
|
||||
typeof(onReady) === "string" ? eval(onReady) : onReady(); // eslint-disable-line no-eval
|
||||
clearInterval(interval); //< Stop this interval
|
||||
}
|
||||
}
|
||||
}, 100); //< repeat check every 100ms
|
||||
}
|
||||
|
||||
if (system.args.length !== 2) {
|
||||
console.log('Usage: run-jasmine2.js URL');
|
||||
phantom.exit(1);
|
||||
}
|
||||
|
||||
var page = require('webpage').create();
|
||||
|
||||
page.onConsoleMessage = function(msg) {
|
||||
// Route "console.log()" calls from within the Page context to the main
|
||||
// Phantom context (i.e. current "this")
|
||||
console.log(msg);
|
||||
};
|
||||
|
||||
page.open(system.args[1], function(status){
|
||||
"use strict";
|
||||
if (status !== "success") {
|
||||
console.log("Unable to access network");
|
||||
phantom.exit();
|
||||
} else {
|
||||
waitFor(function(){
|
||||
return page.evaluate(function(){
|
||||
return (document.body.querySelector('.jasmine-symbol-summary .pending') === null &&
|
||||
document.body.querySelector('.jasmine-duration') !== null);
|
||||
});
|
||||
}, function(){
|
||||
var exitCode = page.evaluate(function(){
|
||||
console.log('');
|
||||
var title = 'Jasmine';
|
||||
var version = document.body.querySelector('.jasmine-version').innerText;
|
||||
var duration = document.body.querySelector('.jasmine-duration').innerText;
|
||||
var banner = title + ' ' + version + ' ' + duration;
|
||||
console.log(banner);
|
||||
|
||||
var list = document.body.querySelectorAll('.jasmine-results > .jasmine-failures > .jasmine-spec-detail.jasmine-failed');
|
||||
if (list && list.length > 0) {
|
||||
console.log('');
|
||||
console.log(list.length + ' test(s) FAILED:');
|
||||
for (var i = 0; i < list.length; ++i) {
|
||||
var el = list[i],
|
||||
desc = el.querySelector('.jasmine-description'),
|
||||
msg = el.querySelector('.jasmine-messages > .jasmine-result-message');
|
||||
console.log('');
|
||||
console.log(desc.innerText);
|
||||
console.log(msg.innerText);
|
||||
console.log('');
|
||||
}
|
||||
return 1;
|
||||
} else {
|
||||
console.log(document.body.querySelector('.jasmine-alert > .jasmine-bar.jasmine-passed, .jasmine-alert > .jasmine-bar.skipped').innerText);
|
||||
return 0;
|
||||
}
|
||||
});
|
||||
phantom.exit(exitCode);
|
||||
});
|
||||
}
|
||||
});
|
@ -1,18 +1,31 @@
|
||||
/*global config */
|
||||
|
||||
// Extra test dependencies
|
||||
config.paths.mock = "tests/mock";
|
||||
config.paths.test_utils = "tests/utils";
|
||||
config.paths['wait-until-promise'] = "node_modules/wait-until-promise/index";
|
||||
config.paths['test-utils'] = "tests/utils";
|
||||
config.paths.sinon = "node_modules/sinon/lib/sinon";
|
||||
config.paths.jasmine = "node_modules/jasmine-core/lib/jasmine-core/jasmine";
|
||||
config.paths.transcripts = "converse-logs/converse-logs";
|
||||
config.paths.jasmine = "node_modules/jasmine-core/lib/jasmine-core/jasmine";
|
||||
config.paths.boot = "node_modules/jasmine-core/lib/jasmine-core/boot";
|
||||
config.paths["jasmine-html"] = "node_modules/jasmine-core/lib/jasmine-core/jasmine-html";
|
||||
config.paths["console-runner"] = "node_modules/phantom-jasmine/lib/console-runner";
|
||||
// config.paths["console-runner"] = "node_modules/phantom-jasmine/lib/console-runner";
|
||||
config.shim.jasmine = {
|
||||
exports: 'window.jasmineRequire'
|
||||
};
|
||||
config.shim['jasmine-html'] = {
|
||||
deps: ['jasmine'],
|
||||
exports: 'jasmine'
|
||||
exports: 'window.jasmineRequire'
|
||||
};
|
||||
config.shim.boot = {
|
||||
deps: ['jasmine', 'jasmine-html'],
|
||||
exports: 'window.jasmineRequire'
|
||||
};
|
||||
/*
|
||||
config.shim['console-runner'] = {
|
||||
deps: ['jasmine']
|
||||
};
|
||||
*/
|
||||
require.config(config);
|
||||
|
||||
// Polyfill 'bind' which is not available in phantomjs < 2.0
|
||||
@ -35,13 +48,9 @@ if (!Function.prototype.bind) {
|
||||
};
|
||||
}
|
||||
|
||||
require([
|
||||
"jquery",
|
||||
"mock",
|
||||
"jasmine-html",
|
||||
"sinon",
|
||||
"console-runner",
|
||||
var specs = [
|
||||
//"spec/transcripts",
|
||||
// "spec/profiling",
|
||||
"spec/utils",
|
||||
"spec/converse",
|
||||
"spec/bookmarks",
|
||||
@ -49,38 +58,31 @@ require([
|
||||
"spec/disco",
|
||||
"spec/protocol",
|
||||
"spec/presence",
|
||||
"spec/eventemitter",
|
||||
"spec/ping",
|
||||
"spec/xmppstatus",
|
||||
"spec/mam",
|
||||
"spec/otr",
|
||||
"spec/eventemitter",
|
||||
"spec/controlbox",
|
||||
"spec/chatbox",
|
||||
"spec/chatroom",
|
||||
"spec/minchats",
|
||||
"spec/notification",
|
||||
"spec/profiling",
|
||||
"spec/ping",
|
||||
"spec/register",
|
||||
"spec/xmppstatus"
|
||||
], function($, mock, jasmine, sinon) {
|
||||
"spec/register"
|
||||
];
|
||||
|
||||
require(['jquery', 'mock', 'boot', 'sinon', 'wait-until-promise'],
|
||||
function($, mock, jasmine, sinon, waitUntilPromise) {
|
||||
window.sinon = sinon;
|
||||
window.waitUntilPromise = waitUntilPromise['default'];
|
||||
window.localStorage.clear();
|
||||
window.sessionStorage.clear();
|
||||
// Jasmine stuff
|
||||
var jasmineEnv = jasmine.getEnv();
|
||||
var reporter;
|
||||
if (/PhantomJS/.test(navigator.userAgent)) {
|
||||
reporter = new jasmine.ConsoleReporter();
|
||||
window.console_reporter = reporter;
|
||||
jasmineEnv.addReporter(reporter);
|
||||
jasmineEnv.updateInterval = 0;
|
||||
} else {
|
||||
reporter = new jasmine.HtmlReporter();
|
||||
jasmineEnv.addReporter(reporter);
|
||||
jasmineEnv.specFilter = function(spec) {
|
||||
return reporter.specFilter(spec);
|
||||
};
|
||||
jasmineEnv.updateInterval = 0;
|
||||
}
|
||||
jasmineEnv.execute();
|
||||
|
||||
// Load the specs
|
||||
require(specs, function () {
|
||||
// Initialize the HTML Reporter and execute the environment (setup by `boot.js`)
|
||||
// http://stackoverflow.com/questions/19240302/does-jasmine-2-0-really-not-work-with-require-js
|
||||
window.onload();
|
||||
});
|
||||
}
|
||||
);
|
@ -1,12 +1,18 @@
|
||||
(function (root, factory) {
|
||||
define("test_utils", ['converse', 'mock'], factory);
|
||||
}(this, function (converse_api, mock) {
|
||||
define(['converse', 'es6-promise', 'mock', 'wait-until-promise'], factory);
|
||||
}(this, function (converse_api, Promise, mock, waitUntilPromise) {
|
||||
var _ = converse_api.env._;
|
||||
var $ = converse_api.env.jQuery;
|
||||
var $pres = converse_api.env.$pres;
|
||||
var $iq = converse_api.env.$iq;
|
||||
var Strophe = converse_api.env.Strophe;
|
||||
var utils = {};
|
||||
|
||||
if (typeof window.Promise === 'undefined') {
|
||||
waitUntilPromise.setPromiseImplementation(Promise);
|
||||
}
|
||||
utils.waitUntil = waitUntilPromise['default'];
|
||||
|
||||
utils.createRequest = function (iq) {
|
||||
iq = typeof iq.tree == "function" ? iq.tree() : iq;
|
||||
var req = new Strophe.Request(iq, function() {});
|
||||
@ -27,28 +33,6 @@
|
||||
return this;
|
||||
};
|
||||
|
||||
utils.removeAllChatBoxes = function () {
|
||||
var i, chatbox, num_chatboxes = converse.chatboxes.models.length;
|
||||
for (i=num_chatboxes-1; i>-1; i--) {
|
||||
chatbox = converse.chatboxes.models[i];
|
||||
converse.chatboxviews.get(chatbox.get('id')).close();
|
||||
converse.chatboxviews.get(chatbox.get('id')).$el.remove();
|
||||
}
|
||||
converse.chatboxviews.get('controlbox').close();
|
||||
converse.chatboxviews.get('controlbox').$el.remove();
|
||||
return this;
|
||||
};
|
||||
|
||||
utils.initConverse = function () {
|
||||
converse._tearDown();
|
||||
converse._initialize();
|
||||
};
|
||||
|
||||
utils.initRoster = function () {
|
||||
converse.roster.browserStorage._clear();
|
||||
converse.initRoster();
|
||||
};
|
||||
|
||||
utils.openControlBox = function () {
|
||||
var $toggle = $(".toggle-controlbox");
|
||||
if (!$("#controlbox").is(':visible')) {
|
||||
@ -69,11 +53,6 @@
|
||||
return this;
|
||||
};
|
||||
|
||||
utils.removeControlBox = function () {
|
||||
converse.controlboxtoggle.show();
|
||||
$('#controlbox').remove();
|
||||
};
|
||||
|
||||
utils.openContactsPanel = function (converse) {
|
||||
this.openControlBox(converse);
|
||||
var cbview = converse.chatboxviews.get('controlbox');
|
||||
@ -157,14 +136,6 @@
|
||||
converse.connection.sendIQ.restore();
|
||||
};
|
||||
|
||||
utils.removeRosterContacts = function () {
|
||||
var model;
|
||||
while (converse.rosterview.model.length) {
|
||||
model = converse.rosterview.model.pop();
|
||||
converse.rosterview.model.remove(model);
|
||||
}
|
||||
};
|
||||
|
||||
utils.clearBrowserStorage = function () {
|
||||
window.localStorage.clear();
|
||||
window.sessionStorage.clear();
|
||||
@ -184,7 +155,7 @@
|
||||
*
|
||||
* These contacts are not grouped. See below.
|
||||
*/
|
||||
var names, jid;
|
||||
var names, jid, subscription, requesting, ask;
|
||||
if (type === 'requesting') {
|
||||
names = mock.req_names;
|
||||
subscription = 'none';
|
||||
@ -206,13 +177,13 @@
|
||||
.createContacts(converse, 'pending');
|
||||
return this;
|
||||
} else {
|
||||
throw "Need to specify the type of contact to create";
|
||||
throw Error("Need to specify the type of contact to create");
|
||||
}
|
||||
|
||||
if (typeof length === 'undefined') {
|
||||
length = names.length;
|
||||
}
|
||||
for (i=0; i<length; i++) {
|
||||
for (var i=0; i<length; i++) {
|
||||
jid = names[i].replace(/ /g,'.').toLowerCase() + '@localhost';
|
||||
if (!converse.roster.get(jid)) {
|
||||
converse.roster.create({
|
||||
|
Loading…
Reference in New Issue
Block a user