diff --git a/.eslintignore.errorfiles b/.eslintignore.errorfiles index c3bb34ae26..36b03b121c 100644 --- a/.eslintignore.errorfiles +++ b/.eslintignore.errorfiles @@ -57,7 +57,6 @@ src/utils/Receipt.js src/Velociraptor.js test/components/structures/MessagePanel-test.js test/components/views/dialogs/InteractiveAuthDialog-test.js -test/components/views/rooms/MessageComposerInput-test.js test/mock-clock.js test/notifications/ContentRules-test.js test/notifications/PushRuleVectorState-test.js diff --git a/test/components/views/rooms/MessageComposerInput-test.js b/test/components/views/rooms/MessageComposerInput-test.js deleted file mode 100644 index 518e7e06ac..0000000000 --- a/test/components/views/rooms/MessageComposerInput-test.js +++ /dev/null @@ -1,303 +0,0 @@ -import React from 'react'; -import ReactTestUtils from 'react-dom/test-utils'; -import ReactDOM from 'react-dom'; -import expect from 'expect'; -import sinon from 'sinon'; -import * as testUtils from '../../../test-utils'; -import sdk from 'matrix-react-sdk'; -const MessageComposerInput = sdk.getComponent('views.rooms.MessageComposerInput'); -import MatrixClientPeg from '../../../../src/MatrixClientPeg'; -import {sleep} from "../../../../src/utils/promise"; - -function addTextToDraft(text) { - const components = document.getElementsByClassName('public-DraftEditor-content'); - if (components && components.length) { - const textarea = components[0]; - const textEvent = document.createEvent('TextEvent'); - textEvent.initTextEvent('textInput', true, true, null, text); - textarea.dispatchEvent(textEvent); - } -} - -// FIXME: These tests need to be updated from Draft to CIDER. - -xdescribe('MessageComposerInput', () => { - let parentDiv = null, - sandbox = null, - client = null, - mci = null, - room = testUtils.mkStubRoom('!DdJkzRliezrwpNebLk:matrix.org'); - - beforeEach(function() { - testUtils.beforeEach(this); - sandbox = testUtils.stubClient(sandbox); - client = MatrixClientPeg.get(); - client.credentials = {userId: '@me:domain.com'}; - - parentDiv = document.createElement('div'); - document.body.appendChild(parentDiv); - mci = ReactDOM.render( - , - parentDiv); - }); - - afterEach((done) => { - // hack: let the component finish mounting before unmounting, to avoid - // warnings - // (please can we make the components not setState() after - // they are unmounted?) - sleep(10).done(() => { - if (parentDiv) { - ReactDOM.unmountComponentAtNode(parentDiv); - parentDiv.remove(); - parentDiv = null; - } - sandbox.restore(); - done(); - }); - }); - - // XXX this fails - xit('should change mode if indicator is clicked', (done) => { - mci.enableRichtext(true); - - setTimeout(() => { - const indicator = ReactTestUtils.findRenderedDOMComponentWithClass( - mci, - 'mx_MessageComposer_input_markdownIndicator'); - ReactTestUtils.Simulate.click(indicator); - - expect(mci.state.isRichTextEnabled).toEqual(false, 'should have changed mode'); - done(); - }); - }); - - it('should not send messages when composer is empty', () => { - const spy = sinon.spy(client, 'sendMessage'); - mci.enableRichtext(true); - mci.handleReturn(sinon.stub()); - - expect(spy.calledOnce).toEqual(false, 'should not send message'); - }); - - it('should not change content unnecessarily on RTE -> Markdown conversion', () => { - const spy = sinon.spy(client, 'sendMessage'); - mci.enableRichtext(true); - addTextToDraft('a'); - mci.handleKeyCommand('toggle-mode'); - mci.handleReturn(sinon.stub()); - - expect(spy.calledOnce).toEqual(true); - expect(spy.args[0][1].body).toEqual('a'); - }); - - it('should not change content unnecessarily on Markdown -> RTE conversion', () => { - const spy = sinon.spy(client, 'sendMessage'); - mci.enableRichtext(false); - addTextToDraft('a'); - mci.handleKeyCommand('toggle-mode'); - mci.handleReturn(sinon.stub()); - - expect(spy.calledOnce).toEqual(true); - expect(spy.args[0][1].body).toEqual('a'); - }); - - it('should send emoji messages when rich text is enabled', () => { - const spy = sinon.spy(client, 'sendMessage'); - mci.enableRichtext(true); - addTextToDraft('☹'); - mci.handleReturn(sinon.stub()); - - expect(spy.calledOnce).toEqual(true, 'should send message'); - }); - - it('should send emoji messages when Markdown is enabled', () => { - const spy = sinon.spy(client, 'sendMessage'); - mci.enableRichtext(false); - addTextToDraft('☹'); - mci.handleReturn(sinon.stub()); - - expect(spy.calledOnce).toEqual(true, 'should send message'); - }); - - // FIXME - // it('should convert basic Markdown to rich text correctly', () => { - // const spy = sinon.spy(client, 'sendHtmlMessage'); - // mci.enableRichtext(false); - // addTextToDraft('*abc*'); - // mci.handleKeyCommand('toggle-mode'); - // mci.handleReturn(sinon.stub()); - // console.error(spy.args[0][2]); - // expect(spy.args[0][2]).toContain('abc'); - // }); - // - // it('should convert basic rich text to Markdown correctly', () => { - // const spy = sinon.spy(client, 'sendHtmlMessage'); - // mci.enableRichtext(true); - // process.nextTick(() => { - // - // }); - // mci.handleKeyCommand('italic'); - // addTextToDraft('abc'); - // mci.handleKeyCommand('toggle-mode'); - // mci.handleReturn(sinon.stub()); - // expect(['_abc_', '*abc*']).toContain(spy.args[0][1]); - // }); - - it('should insert formatting characters in Markdown mode', () => { - const spy = sinon.spy(client, 'sendMessage'); - mci.enableRichtext(false); - mci.handleKeyCommand('italic'); - mci.handleReturn(sinon.stub()); - expect(['__', '**']).toContain(spy.args[0][1].body); - }); - - it('should not entity-encode " in Markdown mode', () => { - const spy = sinon.spy(client, 'sendMessage'); - mci.enableRichtext(false); - addTextToDraft('"'); - mci.handleReturn(sinon.stub()); - - expect(spy.calledOnce).toEqual(true); - expect(spy.args[0][1].body).toEqual('"'); - }); - - it('should escape characters without other markup in Markdown mode', () => { - const spy = sinon.spy(client, 'sendMessage'); - mci.enableRichtext(false); - addTextToDraft('\\*escaped\\*'); - mci.handleReturn(sinon.stub()); - - expect(spy.calledOnce).toEqual(true); - expect(spy.args[0][1].body).toEqual('*escaped*'); - }); - - it('should escape characters with other markup in Markdown mode', () => { - const spy = sinon.spy(client, 'sendMessage'); - mci.enableRichtext(false); - addTextToDraft('\\*escaped\\* *italic*'); - mci.handleReturn(sinon.stub()); - - expect(spy.calledOnce).toEqual(true); - expect(spy.args[0][1].body).toEqual('\\*escaped\\* *italic*'); - expect(spy.args[0][1].formatted_body).toEqual('*escaped* italic'); - }); - - it('should not convert -_- into a horizontal rule in Markdown mode', () => { - const spy = sinon.spy(client, 'sendMessage'); - mci.enableRichtext(false); - addTextToDraft('-_-'); - mci.handleReturn(sinon.stub()); - - expect(spy.calledOnce).toEqual(true); - expect(spy.args[0][1].body).toEqual('-_-'); - }); - - it('should not strip tags in Markdown mode', () => { - const spy = sinon.spy(client, 'sendMessage'); - mci.enableRichtext(false); - addTextToDraft('striked-out'); - mci.handleReturn(sinon.stub()); - - expect(spy.calledOnce).toEqual(true); - expect(spy.args[0][1].body).toEqual('striked-out'); - expect(spy.args[0][1].formatted_body).toEqual('striked-out'); - }); - - it('should not strike-through ~~~ in Markdown mode', () => { - const spy = sinon.spy(client, 'sendMessage'); - mci.enableRichtext(false); - addTextToDraft('~~~striked-out~~~'); - mci.handleReturn(sinon.stub()); - - expect(spy.calledOnce).toEqual(true); - expect(spy.args[0][1].body).toEqual('~~~striked-out~~~'); - }); - - it('should not mark single unmarkedup paragraphs as HTML in Markdown mode', () => { - const spy = sinon.spy(client, 'sendMessage'); - mci.enableRichtext(false); - addTextToDraft('Lorem ipsum dolor sit amet, consectetur adipiscing elit.'); - mci.handleReturn(sinon.stub()); - - expect(spy.calledOnce).toEqual(true); - expect(spy.args[0][1].body).toEqual('Lorem ipsum dolor sit amet, consectetur adipiscing elit.'); - }); - - it('should not mark two unmarkedup paragraphs as HTML in Markdown mode', () => { - const spy = sinon.spy(client, 'sendMessage'); - mci.enableRichtext(false); - addTextToDraft('Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n\nFusce congue sapien sed neque molestie volutpat.'); - mci.handleReturn(sinon.stub()); - - expect(spy.calledOnce).toEqual(true); - expect(spy.args[0][1].body).toEqual('Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n\nFusce congue sapien sed neque molestie volutpat.'); - }); - - it('should strip tab-completed mentions so that only the display name is sent in the plain body in Markdown mode', () => { - // Sending a HTML message because we have entities in the composer (because of completions) - const spy = sinon.spy(client, 'sendMessage'); - mci.enableRichtext(false); - mci.setDisplayedCompletion({ - completion: 'Some Member', - selection: mci.state.editorState.getSelection(), - href: `https://matrix.to/#/@some_member:domain.bla`, - }); - - mci.handleReturn(sinon.stub()); - - expect(spy.args[0][1].body).toEqual( - 'Some Member', - 'the plaintext body should only include the display name', - ); - expect(spy.args[0][1].formatted_body).toEqual( - 'Some Member', - 'the html body should contain an anchor tag with a matrix.to href and display name text', - ); - }); - - it('should strip tab-completed mentions so that only the display name is sent in the plain body in RTE mode', () => { - // Sending a HTML message because we have entities in the composer (because of completions) - const spy = sinon.spy(client, 'sendMessage'); - mci.enableRichtext(true); - mci.setDisplayedCompletion({ - completion: 'Some Member', - selection: mci.state.editorState.getSelection(), - href: `https://matrix.to/#/@some_member:domain.bla`, - }); - - mci.handleReturn(sinon.stub()); - - expect(spy.args[0][1].body).toEqual('Some Member'); - expect(spy.args[0][1].formatted_body).toEqual('Some Member'); - }); - - it('should not strip non-tab-completed mentions when manually typing MD', () => { - // Sending a HTML message because we have entities in the composer (because of completions) - const spy = sinon.spy(client, 'sendMessage'); - // Markdown mode enabled - mci.enableRichtext(false); - addTextToDraft('[My Not-Tab-Completed Mention](https://matrix.to/#/@some_member:domain.bla)'); - - mci.handleReturn(sinon.stub()); - - expect(spy.args[0][1].body).toEqual('[My Not-Tab-Completed Mention](https://matrix.to/#/@some_member:domain.bla)'); - expect(spy.args[0][1].formatted_body).toEqual('My Not-Tab-Completed Mention'); - }); - - it('should not strip arbitrary typed (i.e. not tab-completed) MD links', () => { - // Sending a HTML message because we have entities in the composer (because of completions) - const spy = sinon.spy(client, 'sendMessage'); - // Markdown mode enabled - mci.enableRichtext(false); - addTextToDraft('[Click here](https://some.lovely.url)'); - - mci.handleReturn(sinon.stub()); - - expect(spy.args[0][1].body).toEqual('[Click here](https://some.lovely.url)'); - expect(spy.args[0][1].formatted_body).toEqual('Click here'); - }); -});