mock.js 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. (function (root, factory) {
  2. define("mock", [], factory);
  3. }(this, function () {
  4. const _ = converse.env._;
  5. const Promise = converse.env.Promise;
  6. const Strophe = converse.env.Strophe;
  7. const moment = converse.env.moment;
  8. const $iq = converse.env.$iq;
  9. const u = converse.env.utils;
  10. window.libsignal = {
  11. 'SignalProtocolAddress': function (name, device_id) {
  12. this.name = name;
  13. this.deviceId = device_id;
  14. },
  15. 'SessionCipher': function (storage, remote_address) {
  16. this.remoteAddress = remote_address;
  17. this.storage = storage;
  18. this.encrypt = () => Promise.resolve({
  19. 'type': 1,
  20. 'body': 'c1ph3R73X7',
  21. 'registrationId': '1337'
  22. });
  23. this.decryptPreKeyWhisperMessage = (key_and_tag) => {
  24. return Promise.resolve(key_and_tag);
  25. };
  26. this.decryptWhisperMessage = (key_and_tag) => {
  27. return Promise.resolve(key_and_tag);
  28. }
  29. },
  30. 'SessionBuilder': function (storage, remote_address) {
  31. this.processPreKey = function () {
  32. return Promise.resolve();
  33. }
  34. },
  35. 'KeyHelper': {
  36. 'generateIdentityKeyPair': function () {
  37. return Promise.resolve({
  38. 'pubKey': new TextEncoder('utf-8').encode('1234'),
  39. 'privKey': new TextEncoder('utf-8').encode('4321')
  40. });
  41. },
  42. 'generateRegistrationId': function () {
  43. return '123456789';
  44. },
  45. 'generatePreKey': function (keyid) {
  46. return Promise.resolve({
  47. 'keyId': keyid,
  48. 'keyPair': {
  49. 'pubKey': new TextEncoder('utf-8').encode('1234'),
  50. 'privKey': new TextEncoder('utf-8').encode('4321')
  51. }
  52. });
  53. },
  54. 'generateSignedPreKey': function (identity_keypair, keyid) {
  55. return Promise.resolve({
  56. 'signature': new TextEncoder('utf-8').encode('11112222333344445555'),
  57. 'keyId': keyid,
  58. 'keyPair': {
  59. 'pubKey': new TextEncoder('utf-8').encode('1234'),
  60. 'privKey': new TextEncoder('utf-8').encode('4321')
  61. }
  62. });
  63. }
  64. }
  65. };
  66. const mock = {};
  67. mock.view_mode = 'overlayed';
  68. // Names from http://www.fakenamegenerator.com/
  69. mock.req_names = [
  70. 'Louw Spekman', 'Mohamad Stet', 'Dominik Beyer'
  71. ];
  72. mock.pend_names = [
  73. 'Suleyman van Beusichem', 'Nanja van Yperen', 'Nicole Diederich'
  74. ];
  75. mock.cur_names = [
  76. 'Max Frankfurter', 'Candice van der Knijff', 'Irini Vlastuin', 'Rinse Sommer', 'Annegreet Gomez',
  77. 'Robin Schook', 'Marcel Eberhardt', 'Simone Brauer', 'Asmaa Haakman', 'Felix Amsel',
  78. 'Lena Grunewald', 'Laura Grunewald', 'Mandy Seiler', 'Sven Bosch', 'Nuriye Cuypers'
  79. ];
  80. mock.num_contacts = mock.req_names.length + mock.pend_names.length + mock.cur_names.length;
  81. mock.groups = {
  82. 'colleagues': 3,
  83. 'friends & acquaintences': 3,
  84. 'Family': 4,
  85. 'ænemies': 3,
  86. 'Ungrouped': 2
  87. };
  88. mock.chatroom_names = [
  89. 'Dyon van de Wege', 'Thomas Kalb', 'Dirk Theissen', 'Felix Hofmann', 'Ka Lek', 'Anne Ebersbacher'
  90. ];
  91. // TODO: need to also test other roles and affiliations
  92. mock.chatroom_roles = {
  93. 'Anne Ebersbacher': { affiliation: "owner", role: "moderator" },
  94. 'Dirk Theissen': { affiliation: "admin", role: "moderator" },
  95. 'Dyon van de Wege': { affiliation: "member", role: "occupant" },
  96. 'Felix Hofmann': { affiliation: "member", role: "occupant" },
  97. 'Ka Lek': { affiliation: "member", role: "occupant" },
  98. 'Thomas Kalb': { affiliation: "member", role: "occupant" }
  99. };
  100. mock.event = {
  101. 'preventDefault': function () {}
  102. };
  103. mock.mock_connection = function () { // eslint-disable-line wrap-iife
  104. return function () {
  105. Strophe.Bosh.prototype._processRequest = function () {}; // Don't attempt to send out stanzas
  106. const c = new Strophe.Connection('jasmine tests');
  107. const sendIQ = c.sendIQ;
  108. c.IQ_stanzas = [];
  109. c.IQ_ids = [];
  110. c.sendIQ = function (iq, callback, errback) {
  111. this.IQ_stanzas.push(iq);
  112. const id = sendIQ.bind(this)(iq, callback, errback);
  113. this.IQ_ids.push(id);
  114. return id;
  115. }
  116. const send = c.send;
  117. c.sent_stanzas = [];
  118. c.send = function (stanza) {
  119. if (_.isElement(stanza)) {
  120. this.sent_stanzas.push(stanza);
  121. } else {
  122. this.sent_stanzas.push(stanza.nodeTree);
  123. }
  124. return send.apply(this, arguments);
  125. }
  126. c.features = Strophe.xmlHtmlNode(
  127. '<stream:features xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client">'+
  128. '<ver xmlns="urn:xmpp:features:rosterver"/>'+
  129. '<csi xmlns="urn:xmpp:csi:0"/>'+
  130. '<c xmlns="http://jabber.org/protocol/caps" ver="UwBpfJpEt3IoLYfWma/o/p3FFRo=" hash="sha-1" node="http://prosody.im"/>'+
  131. '<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">'+
  132. '<required/>'+
  133. '</bind>'+
  134. '<session xmlns="urn:ietf:params:xml:ns:xmpp-session">'+
  135. '<optional/>'+
  136. '</session>'+
  137. '</stream:features>').firstChild;
  138. c._proto._connect = function () {
  139. c.authenticated = true;
  140. c.connected = true;
  141. c.mock = true;
  142. c.jid = 'dummy@localhost/resource';
  143. c._changeConnectStatus(Strophe.Status.CONNECTED);
  144. };
  145. return c;
  146. };
  147. }();
  148. async function initConverse (settings, spies, promises) {
  149. window.localStorage.clear();
  150. window.sessionStorage.clear();
  151. const el = document.querySelector('#conversejs');
  152. if (el) {
  153. el.parentElement.removeChild(el);
  154. }
  155. const connection = mock.mock_connection();
  156. if (!_.isNil(spies)) {
  157. _.forEach(spies.connection, method => spyOn(connection, method));
  158. }
  159. const _converse = await converse.initialize(_.extend({
  160. 'i18n': 'en',
  161. 'auto_subscribe': false,
  162. 'play_sounds': false,
  163. 'bosh_service_url': 'localhost',
  164. 'connection': connection,
  165. 'animate': false,
  166. 'use_emojione': false,
  167. 'no_trimming': true,
  168. 'view_mode': mock.view_mode,
  169. 'debug': false
  170. }, settings || {}));
  171. if (!_.isNil(spies)) {
  172. _.forEach(spies._converse, method => spyOn(_converse, method).and.callThrough());
  173. }
  174. _converse.ChatBoxViews.prototype.trimChat = function () {};
  175. _converse.api.vcard.get = function (model, force) {
  176. return new Promise((resolve, reject) => {
  177. let jid;
  178. if (_.isString(model)) {
  179. jid = model;
  180. } else if (!model.get('vcard_updated') || force) {
  181. jid = model.get('jid') || model.get('muc_jid');
  182. }
  183. let fullname;
  184. if (!jid || jid == 'dummy@localhost') {
  185. jid = 'dummy@localhost';
  186. fullname = 'Max Mustermann' ;
  187. } else {
  188. const name = jid.split('@')[0].replace(/\./g, ' ').split(' ');
  189. const last = name.length-1;
  190. name[0] = name[0].charAt(0).toUpperCase()+name[0].slice(1);
  191. name[last] = name[last].charAt(0).toUpperCase()+name[last].slice(1);
  192. fullname = name.join(' ');
  193. }
  194. const vcard = $iq().c('vCard').c('FN').t(fullname).nodeTree;
  195. const result = {
  196. 'vcard': vcard,
  197. 'fullname': _.get(vcard.querySelector('FN'), 'textContent'),
  198. 'image': _.get(vcard.querySelector('PHOTO BINVAL'), 'textContent'),
  199. 'image_type': _.get(vcard.querySelector('PHOTO TYPE'), 'textContent'),
  200. 'url': _.get(vcard.querySelector('URL'), 'textContent'),
  201. 'vcard_updated': moment().format(),
  202. 'vcard_error': undefined
  203. };
  204. resolve(result);
  205. }).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
  206. };
  207. if (_.get(settings, 'auto_login') !== false) {
  208. _converse.api.user.login({
  209. 'jid': 'dummy@localhost',
  210. 'password': 'secret'
  211. });
  212. }
  213. window.converse_disable_effects = true;
  214. return _converse;
  215. }
  216. mock.initConverse = function (spies, promise_names=null, settings=null, func) {
  217. if (_.isFunction(spies)) {
  218. func = spies;
  219. spies = null;
  220. promise_names = null
  221. settings = null;
  222. }
  223. return async done => {
  224. const _converse = await initConverse(settings, spies);
  225. const promises = _.map(promise_names, _converse.api.waitUntil);
  226. await Promise.all(promises);
  227. func(done, _converse);
  228. }
  229. };
  230. return mock;
  231. }));