proxyquire = require 'proxyquire' React = require "react" ReactDOM = require "react-dom" ReactTestUtils = require('react-dom/test-utils') {Contact, Message, File, AttachmentStore, MessageBodyProcessor} = require "nylas-exports" EmailFrameStub = React.createClass({render: ->
}) {InjectedComponent} = require 'nylas-component-kit' file = new File id: 'file_1_id' filename: 'a.png' contentType: 'image/png' size: 10 file_not_downloaded = new File id: 'file_2_id' filename: 'b.png' contentType: 'image/png' size: 10 file_inline = new File id: 'file_inline_id' filename: 'c.png' contentId: 'file_inline_id' contentType: 'image/png' size: 10 file_inline_downloading = new File id: 'file_inline_downloading_id' filename: 'd.png' contentId: 'file_inline_downloading_id' contentType: 'image/png' size: 10 file_inline_not_downloaded = new File id: 'file_inline_not_downloaded_id' filename: 'e.png' contentId: 'file_inline_not_downloaded_id' contentType: 'image/png' size: 10 file_cid_but_not_referenced = new File id: 'file_cid_but_not_referenced' filename: 'f.png' contentId: 'file_cid_but_not_referenced' contentType: 'image/png' size: 10 file_cid_but_not_referenced_or_image = new File id: 'file_cid_but_not_referenced_or_image' filename: 'ansible notes.txt' contentId: 'file_cid_but_not_referenced_or_image' contentType: 'text/plain' size: 300 file_without_filename = new File id: 'file_without_filename' contentType: 'image/png' size: 10 download = fileId: 'file_1_id' download_inline = fileId: 'file_inline_downloading_id' user_1 = new Contact name: "User One" email: "user1@nylas.com" user_2 = new Contact name: "User Two" email: "user2@nylas.com" user_3 = new Contact name: "User Three" email: "user3@nylas.com" user_4 = new Contact name: "User Four" email: "user4@nylas.com" MessageItemBody = proxyquire '../lib/message-item-body', './email-frame': {default: EmailFrameStub} xdescribe "MessageItem", -> beforeEach -> spyOn(AttachmentStore, 'pathForFile').andCallFake (f) -> return '/fake/path.png' if f.id is file.id return '/fake/path-inline.png' if f.id is file_inline.id return '/fake/path-downloading.png' if f.id is file_inline_downloading.id return null spyOn(MessageBodyProcessor, '_addToCache').andCallFake -> @downloads = 'file_1_id': download, 'file_inline_downloading_id': download_inline @message = new Message id: "111" from: [user_1] to: [user_2] cc: [user_3, user_4] bcc: null body: "Body One" date: new Date(1415814587) draft: false files: [] unread: false snippet: "snippet one..." subject: "Subject One" threadId: "thread_12345" accountId: window.TEST_ACCOUNT_ID # Generate the test component. Should be called after @message is configured # for the test, since MessageItem assumes attributes of the message will not # change after getInitialState runs. @createComponent = ({collapsed} = {}) => collapsed ?= false @component = ReactTestUtils.renderIntoDocument( ) advanceClock() describe "when the message contains attachments", -> beforeEach -> @message.files = [ file, file_not_downloaded, file_cid_but_not_referenced, file_cid_but_not_referenced_or_image, file_inline, file_inline_downloading, file_inline_not_downloaded, file_without_filename ] describe "inline", -> beforeEach -> @message.body = """ \"A\" \"B\" \"C\" Hello world! """ @createComponent() waitsFor => ReactTestUtils.scryRenderedComponentsWithType(@component, EmailFrameStub).length it "should never leave src=cid: in the message body", -> runs => body = ReactTestUtils.findRenderedComponentWithType(@component, EmailFrameStub).props.content expect(body.indexOf('cid')).toEqual(-1) it "should replace cid: with the AttachmentStore's path for the file", -> runs => body = ReactTestUtils.findRenderedComponentWithType(@component, EmailFrameStub).props.content expect(body.indexOf('alt="A" src="file:///fake/path-inline.png"')).toEqual(@message.body.indexOf('alt="A"')) it "should not replace cid: with the AttachmentStore's path if the download is in progress", -> runs => body = ReactTestUtils.findRenderedComponentWithType(@component, EmailFrameStub).props.content expect(body.indexOf('/fake/path-downloading.png')).toEqual(-1) describe "showQuotedText", -> it "should be initialized to false", -> @createComponent() expect(@component.state.showQuotedText).toBe(false) it "shouldn't render the quoted text control if there's no quoted text", -> @message.body = "no quotes here!" @createComponent() toggles = ReactTestUtils.scryRenderedDOMComponentsWithClass(@component, 'quoted-text-control') expect(toggles.length).toBe 0 describe 'quoted text control toggle button', -> beforeEach -> @message.body = """ Message
Quoted message
""" @createComponent() @toggle = ReactTestUtils.findRenderedDOMComponentWithClass(@component, 'quoted-text-control') it 'should be rendered', -> expect(@toggle).toBeDefined() it "should be initialized to true if the message contains `Forwarded`...", -> @message.body = """ Hi guys, take a look at this. Very relevant. -mg

---- Forwarded Message ----- blablalba
""" @createComponent() expect(@component.state.showQuotedText).toBe(true) it "should be initialized to false if the message is a response to a Forwarded message", -> @message.body = """ Thanks mg, that indeed looks very relevant. Will bring it up with the rest of the team. On Sunday, March 4th at 12:32AM, Michael Grinich Wrote:
Hi guys, take a look at this. Very relevant. -mg

---- Forwarded Message ----- blablalba
""" @createComponent() expect(@component.state.showQuotedText).toBe(false) describe "when showQuotedText is true", -> beforeEach -> @message.body = """ Message
Quoted message
""" @createComponent() @component.state.showQuotedText = true waitsFor => ReactTestUtils.scryRenderedComponentsWithType(@component, EmailFrameStub).length describe 'quoted text control toggle button', -> beforeEach -> @toggle = ReactTestUtils.findRenderedDOMComponentWithClass(@component, 'quoted-text-control') it 'should be rendered', -> expect(@toggle).toBeDefined() it "should pass the value into the EmailFrame", -> runs => frame = ReactTestUtils.findRenderedComponentWithType(@component, EmailFrameStub) expect(frame.props.showQuotedText).toBe(true)