converse.js
Version:
Browser based XMPP chat client
117 lines (96 loc) • 4.82 kB
JavaScript
/*global mock, converse */
const { $msg, u } = converse.env;
describe("A Chat Message", function () {
it("Can be copied using a message action",
mock.initConverse(['chatBoxesFetched'], {}, async function (_converse) {
const { api } = _converse;
await mock.waitForRoster(_converse, 'current', 1);
await mock.openControlBox(_converse);
const contact_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@montague.lit';
await mock.openChatBoxFor(_converse, contact_jid);
const view = _converse.chatboxviews.get(contact_jid);
const textarea = view.querySelector('textarea.chat-textarea');
const firstMessageText = 'But soft, what light through yonder airlock breaks?';
textarea.value = firstMessageText;
const message_form = view.querySelector('converse-message-form');
message_form.onKeyDown({
target: textarea,
preventDefault: function preventDefault () {},
key: "Enter",
});
await u.waitUntil(() => view.querySelectorAll('.chat-msg__text').length === 1);
const spyClipboard = spyOn(navigator.clipboard, 'writeText');
let firstAction = view.querySelector('.chat-msg__action-copy');
expect(firstAction).not.toBeNull();
firstAction.click();
expect(spyClipboard).toHaveBeenCalledOnceWith(firstMessageText);
// Test messages from other users
const secondMessageText = 'Hello';
_converse.handleMessageStanza(
$msg({
'from': contact_jid,
'to': api.connection.get().jid,
'type': 'chat',
'id': u.getUniqueId()
}).c('body').t(secondMessageText).up()
.c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree()
);
await u.waitUntil(() => view.querySelectorAll('.chat-msg__text').length === 2);
const copyActions = view.querySelectorAll('.chat-msg__action-copy');
expect(copyActions.length).toBe(2);
let secondAction = copyActions[copyActions.length - 1];
expect(secondAction).not.toBeNull();
secondAction.click();
expect(spyClipboard).toHaveBeenCalledWith(secondMessageText);
}));
it("Can be quoted using a message action",
mock.initConverse(['chatBoxesFetched'], {}, async function (_converse) {
const { api } = _converse;
await mock.waitForRoster(_converse, 'current', 1);
await mock.openControlBox(_converse);
const contact_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@montague.lit';
await mock.openChatBoxFor(_converse, contact_jid);
const view = _converse.chatboxviews.get(contact_jid);
const textarea = view.querySelector('textarea.chat-textarea');
const firstMessageText = 'But soft, what light through yonder airlock breaks?';
textarea.value = firstMessageText;
const message_form = view.querySelector('converse-message-form');
message_form.onKeyDown({
target: textarea,
preventDefault: function preventDefault () {},
key: "Enter",
});
await u.waitUntil(() => view.querySelectorAll('.chat-msg__text').length === 1);
// Quote with empty text area
expect(textarea.value).toBe('');
let firstAction = view.querySelector('.chat-msg__action-quote');
expect(firstAction).not.toBeNull();
firstAction.click();
await u.waitUntil(() => textarea.value === `> ${firstMessageText}`);
// Quote with already-present text
textarea.value = 'Hi!';
textarea.dispatchEvent(new Event('change'));
firstAction.click();
await u.waitUntil(() => textarea.value === `Hi!\n> ${firstMessageText}\n`);
// Test messages from other users
textarea.value = '';
textarea.dispatchEvent(new Event('change'));
const secondMessageText = 'Hello';
_converse.handleMessageStanza(
$msg({
'from': contact_jid,
'to': api.connection.get().jid,
'type': 'chat',
'id': u.getUniqueId()
}).c('body').t(secondMessageText).up()
.c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree()
);
await u.waitUntil(() => view.querySelectorAll('.chat-msg__text').length === 2);
const quoteActions = view.querySelectorAll('.chat-msg__action-quote');
expect(quoteActions.length).toBe(2);
let secondAction = quoteActions[quoteActions.length - 1];
expect(secondAction).not.toBeNull();
secondAction.click();
await u.waitUntil(() => textarea.value === `> ${secondMessageText}`);
}));
});