/* eslint react/no-render-return-value: 0 */ import React from 'react'; import ReactDOM from 'react-dom'; import { findRenderedDOMComponentWithClass } from 'react-addons-test-utils'; import { DateUtils, NylasAPIHelpers, Actions } from 'nylas-exports'; import SendLaterButton from '../lib/send-later-button'; import { PLUGIN_ID, PLUGIN_NAME } from '../lib/send-later-constants'; const node = document.createElement('div'); const makeButton = (initialState, metadataValue) => { const draft = { accountId: 'accountId', metadataForPluginId: () => metadataValue, }; const session = { changes: { add: jasmine.createSpy('add'), addPluginMetadata: jasmine.createSpy('addPluginMetadata'), }, }; const button = ReactDOM.render( true} />, node ); if (initialState) { button.setState(initialState); } return button; }; xdescribe('SendLaterButton', function sendLaterButton() { beforeEach(() => { spyOn(DateUtils, 'format').andReturn('formatted'); }); describe('onSendLater', () => { it('sets scheduled date to "saving" and adds plugin metadata to the session', () => { const button = makeButton(null, { sendLaterDate: 'date' }); spyOn(button, 'setState'); spyOn(NylasAPIHelpers, 'authPlugin').andReturn(Promise.resolve()); spyOn(Actions, 'finalizeDraftAndSyncbackMetadata'); const sendLaterDate = { utc: () => 'utc' }; button.onSendLater(sendLaterDate); advanceClock(); expect(button.setState).toHaveBeenCalledWith({ saving: true }); expect(NylasAPIHelpers.authPlugin).toHaveBeenCalledWith( PLUGIN_ID, PLUGIN_NAME, button.props.draft.accountId ); expect(button.props.session.changes.addPluginMetadata).toHaveBeenCalledWith(PLUGIN_ID, { sendLaterDate, }); }); it('displays dialog if an auth error occurs', () => { const button = makeButton(null, { sendLaterDate: 'date' }); spyOn(button, 'setState'); spyOn(NylasEnv, 'reportError'); spyOn(NylasEnv, 'showErrorDialog'); spyOn(NylasAPIHelpers, 'authPlugin').andReturn(Promise.reject(new Error('Oh no!'))); spyOn(Actions, 'finalizeDraftAndSyncbackMetadata'); button.onSendLater({ utc: () => 'utc' }); advanceClock(); expect(NylasEnv.reportError).toHaveBeenCalled(); expect(NylasEnv.showErrorDialog).toHaveBeenCalled(); }); it('closes the composer window if a sendLaterDate has been set', () => { const button = makeButton(null, { sendLaterDate: 'date' }); spyOn(button, 'setState'); spyOn(NylasEnv, 'close'); spyOn(NylasAPIHelpers, 'authPlugin').andReturn(Promise.resolve()); spyOn(NylasEnv, 'isComposerWindow').andReturn(true); spyOn(Actions, 'finalizeDraftAndSyncbackMetadata'); button.onSendLater({ utc: () => 'utc' }); advanceClock(); expect(NylasEnv.close).toHaveBeenCalled(); }); }); describe('render', () => { it('renders spinner if saving', () => { const button = ReactDOM.findDOMNode(makeButton({ saving: true }, null)); expect(button.title).toEqual('Saving send date...'); }); it('renders date if message is scheduled', () => { spyOn(DateUtils, 'futureDateFromString').andReturn({ fromNow: () => '5 minutes' }); const button = makeButton({ saving: false }, { sendLaterDate: 'date' }); const span = ReactDOM.findDOMNode(findRenderedDOMComponentWithClass(button, 'at')); expect(span.textContent).toEqual('Sending in 5 minutes'); }); it('does not render date if message is not scheduled', () => { const button = makeButton(null, null); expect(() => { findRenderedDOMComponentWithClass(button, 'at'); }).toThrow(); }); }); });