autocomplete.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. (function (root, factory) {
  2. define([
  3. "jasmine",
  4. "mock",
  5. "test-utils"
  6. ], factory);
  7. } (this, function (jasmine, mock, test_utils) {
  8. "use strict";
  9. const _ = converse.env._;
  10. const $iq = converse.env.$iq;
  11. const $msg = converse.env.$msg;
  12. const $pres = converse.env.$pres;
  13. const Strophe = converse.env.Strophe;
  14. const u = converse.env.utils;
  15. return describe("A groupchat textarea", function () {
  16. it("autocompletes when the user presses tab",
  17. mock.initConverseWithPromises(
  18. null, ['rosterGroupsFetched'], {},
  19. function (done, _converse) {
  20. test_utils.openAndEnterChatRoom(_converse, 'lounge', 'localhost', 'dummy')
  21. .then(() => {
  22. const view = _converse.chatboxviews.get('lounge@localhost');
  23. expect(view.model.occupants.length).toBe(1);
  24. let presence = $pres({
  25. 'to': 'dummy@localhost/resource',
  26. 'from': 'lounge@localhost/some1'
  27. })
  28. .c('x', {xmlns: Strophe.NS.MUC_USER})
  29. .c('item', {
  30. 'affiliation': 'none',
  31. 'jid': 'some1@localhost/resource',
  32. 'role': 'participant'
  33. });
  34. _converse.connection._dataRecv(test_utils.createRequest(presence));
  35. expect(view.model.occupants.length).toBe(2);
  36. const textarea = view.el.querySelector('textarea.chat-textarea');
  37. textarea.value = "hello som";
  38. // Press tab
  39. const tab_event = {
  40. 'target': textarea,
  41. 'preventDefault': _.noop,
  42. 'keyCode': 9
  43. }
  44. view.keyPressed(tab_event);
  45. view.keyUp(tab_event);
  46. expect(view.el.querySelector('.suggestion-box__results').hidden).toBeFalsy();
  47. expect(view.el.querySelectorAll('.suggestion-box__results li').length).toBe(1);
  48. expect(view.el.querySelector('.suggestion-box__results li').textContent).toBe('some1');
  49. const backspace_event = {
  50. 'target': textarea,
  51. 'preventDefault': _.noop,
  52. 'keyCode': 8
  53. }
  54. for (var i=0; i<3; i++) {
  55. // Press backspace 3 times to remove "som"
  56. view.keyPressed(backspace_event);
  57. textarea.value = textarea.value.slice(0, textarea.value.length-1)
  58. view.keyUp(backspace_event);
  59. }
  60. expect(view.el.querySelector('.suggestion-box__results').hidden).toBeTruthy();
  61. presence = $pres({
  62. 'to': 'dummy@localhost/resource',
  63. 'from': 'lounge@localhost/some2'
  64. })
  65. .c('x', {xmlns: Strophe.NS.MUC_USER})
  66. .c('item', {
  67. 'affiliation': 'none',
  68. 'jid': 'some2@localhost/resource',
  69. 'role': 'participant'
  70. });
  71. _converse.connection._dataRecv(test_utils.createRequest(presence));
  72. textarea.value = "hello s s";
  73. view.keyPressed(tab_event);
  74. view.keyUp(tab_event);
  75. expect(view.el.querySelector('.suggestion-box__results').hidden).toBeFalsy();
  76. expect(view.el.querySelectorAll('.suggestion-box__results li').length).toBe(2);
  77. const up_arrow_event = {
  78. 'target': textarea,
  79. 'preventDefault': () => (up_arrow_event.defaultPrevented = true),
  80. 'stopPropagation': _.noop,
  81. 'keyCode': 38
  82. }
  83. view.keyPressed(up_arrow_event);
  84. view.keyUp(up_arrow_event);
  85. expect(view.el.querySelectorAll('.suggestion-box__results li').length).toBe(2);
  86. expect(view.el.querySelector('.suggestion-box__results li[aria-selected="false"]').textContent).toBe('some1');
  87. expect(view.el.querySelector('.suggestion-box__results li[aria-selected="true"]').textContent).toBe('some2');
  88. view.keyPressed({
  89. 'target': textarea,
  90. 'preventDefault': _.noop,
  91. 'stopPropagation': _.noop,
  92. 'keyCode': 13
  93. });
  94. expect(textarea.value).toBe('hello s some2');
  95. done();
  96. }).catch(_.partial(console.error, _));
  97. }));
  98. });
  99. }));