This commit is contained in:
Ivan Diaz 2018-07-28 23:51:00 -03:00
parent 876fd8d52f
commit 8c6a5dee4a
6 changed files with 129 additions and 43 deletions

View File

@ -0,0 +1,91 @@
const APICallMock = require('lib-app/__mocks__/api-call-mock');
const SubmitButton = ReactMock();
const Button = ReactMock();
const Input = ReactMock();
const Form = ReactMock();
const Checkbox = ReactMock();
const Message = ReactMock();
const FormField = ReactMock();
const Widget = ReactMock();
const PasswordRecovery = requireUnit('app-components/password-recovery', {
'lib-app/api-call': APICallMock,
'core-components/submit-button': SubmitButton,
'core-components/button': Button,
'core-components/form-field': FormField,
'core-components/': FormField,
'core-components/form': Form,
'core-components/checkbox': Checkbox,
'core-components/message': Message,
'core-components/widget': Widget,
});
describe('PasswordRecovery component', function () {
let recoverWidget, recoverForm, widgetTransition, emailInput, component,
backToLoginButton, submitButton;
let dispatch = stub();
beforeEach(function () {
component = TestUtils.renderIntoDocument(
<PasswordRecovery />
);
recoverWidget = TestUtils.scryRenderedComponentsWithType(component, Widget)[0];
recoverForm = TestUtils.scryRenderedComponentsWithType(component, Form)[0];
emailInput = TestUtils.scryRenderedComponentsWithType(component, Input)[0];
submitButton = TestUtils.scryRenderedComponentsWithType(component, SubmitButton)[0];
backToLoginButton = TestUtils.scryRenderedComponentsWithType(component, Button)[0];
});
it('should control form errors by prop', function () {
expect(recoverForm.props.errors).to.deep.equal({});
recoverForm.props.onValidateErrors({email: 'MOCK_ERROR'});
expect(recoverForm.props.errors).to.deep.equal({email: 'MOCK_ERROR'});
});
it('should call sendRecoverPassword when submitted', function () {
let mockSubmitData = {email: 'MOCK_VALUE'};
APICallMock.call.reset();
recoverForm.props.onSubmit(mockSubmitData);
expect(APICallMock.call).to.have.been.calledWith({
path: '/user/send-recover-password',
data: mockSubmitData
});
});
it('should set loading true in the form when submitted', function () {
let mockSubmitData = {email: 'MOCK_VALUE'};
recoverForm.props.onSubmit(mockSubmitData);
expect(recoverForm.props.loading).to.equal(true);
});
it('should add error and stop loading when send recover fails', function () {
component.refs.recoverForm.refs.email.focus.reset();
component.onRecoverPasswordFail();
expect(recoverForm.props.errors).to.deep.equal({email: 'EMAIL_NOT_EXIST'});
expect(recoverForm.props.loading).to.equal(false);
expect(component.refs.recoverForm.refs.email.focus).to.have.been.called;
});
it('should show message when send recover success', function () {
let message = TestUtils.scryRenderedComponentsWithType(component, Message)[0];
expect(message).to.equal(undefined);
component.onRecoverPasswordSent();
message = TestUtils.scryRenderedComponentsWithType(component, Message)[0];
expect(recoverForm.props.loading).to.equal(false);
expect(message).to.not.equal(null);
expect(message.props.type).to.equal('info');
expect(message.props.children).to.equal('RECOVER_SENT');
});
it('should show front side if \'Back to login form\' link is clicked', function () {
backToLoginButton.props.onClick();
expect(widgetTransition.props.sideToShow).to.equal('front');
});
});

View File

@ -2,7 +2,7 @@ import React from 'react';
import classNames from 'classnames';
import i18n from 'lib-app/i18n';
import API from 'lib-app/api-call';
import API from 'lib-app/api-call';
import Form from 'core-components/form';
import FormField from 'core-components/form-field';
@ -12,7 +12,7 @@ import SubmitButton from 'core-components/submit-button';
import Message from 'core-components/message';
class PasswordRecovery extends React.Component {
static propTypes = {
recoverSent: React.PropTypes.bool,
formProps: React.PropTypes.object,

View File

@ -111,7 +111,7 @@ class TicketViewer extends React.Component {
</div>
<div className="col-md-4">
{ticket.closed ?
<Button type='secondary' size="extra-small" onClick={this.onCloseClick.bind(this)}>
<Button type='secondary' size="extra-small" onClick={this.onReopenClick.bind(this)}>
{i18n('RE_OPEN')}
</Button> : i18n('OPENED')}
</div>
@ -282,13 +282,27 @@ class TicketViewer extends React.Component {
}).then(this.onTicketModification.bind(this));
}
onCloseClick() {
AreYouSure.openModal(null, this.toggleClose.bind(this));
onReopenClick() {
AreYouSure.openModal(null, this.reopenTicket.bind(this));
}
toggleClose() {
onCloseTicketClick(event) {
event.preventDefault();
AreYouSure.openModal(null, this.closeTicket.bind(this));
}
reopenTicket() {
API.call({
path: (this.props.ticket.closed) ? '/ticket/re-open' : '/ticket/close',
path: '/ticket/re-open',
data: {
ticketNumber: this.props.ticket.ticketNumber
}
}).then(this.onTicketModification.bind(this));
}
closeTicket() {
API.call({
path: '/ticket/close',
data: {
ticketNumber: this.props.ticket.ticketNumber
}
@ -373,15 +387,6 @@ class TicketViewer extends React.Component {
this.props.onChange();
}
}
onCloseTicketClick(event){
event.preventDefault();
API.call({
path: '/ticket/close',
data: {
ticketNumber: this.props.ticket.ticketNumber
}
}).then(this.onTicketModification.bind(this));
}
}
export default connect((store) => {

View File

@ -9,11 +9,13 @@ const Checkbox = ReactMock();
const Message = ReactMock();
const Widget = ReactMock();
const WidgetTransition = ReactMock();
const PasswordRecovery = ReactMock();
const MainHomePageLoginWidget = requireUnit('app/main/main-home/main-home-page-login-widget', {
'react-redux': ReduxMock,
'actions/session-actions': SessionActionsMock,
'lib-app/api-call': APICallMock,
'app-components/password-recovery': PasswordRecovery,
'core-components/submit-button': SubmitButton,
'core-components/button': Button,
'core-components/input': Input,
@ -98,7 +100,7 @@ describe('Login/Recover Widget', function () {
expect(loginForm.props.errors).to.deep.equal({password: 'ERROR_PASSWORD'});
expect(loginForm.props.loading).to.equal(false);
});
it('should show back side if \'Forgot your password?\' link is clicked', function () {
expect(widgetTransition.props.sideToShow).to.equal('front');
forgotPasswordButton.props.onClick();
@ -107,8 +109,7 @@ describe('Login/Recover Widget', function () {
});
describe('Recover Password form', function () {
let recoverWidget, recoverForm, widgetTransition, emailInput, component,
backToLoginButton, submitButton;
let recoverPassword, widgetTransition, component;
let dispatch = stub();
@ -117,32 +118,20 @@ describe('Login/Recover Widget', function () {
<MainHomePageLoginWidget dispatch={dispatch} session={{pending: false, failed: false}} />
);
widgetTransition = TestUtils.scryRenderedComponentsWithType(component, WidgetTransition)[0];
recoverWidget = TestUtils.scryRenderedComponentsWithType(component, Widget)[1];
recoverForm = TestUtils.scryRenderedComponentsWithType(component, Form)[1];
emailInput = TestUtils.scryRenderedComponentsWithType(component, Input)[2];
submitButton = TestUtils.scryRenderedComponentsWithType(component, SubmitButton)[1];
backToLoginButton = TestUtils.scryRenderedComponentsWithType(component, Button)[1];
component.refs.recoverForm = {
refs: {
email: {
focus: stub()
}
}
};
recoverPassword = TestUtils.scryRenderedComponentsWithType(component, PasswordRecovery)[0];
});
it('should control form errors by prop', function () {
expect(recoverForm.props.errors).to.deep.equal({});
recoverForm.props.onValidateErrors({email: 'MOCK_ERROR'});
expect(recoverForm.props.errors).to.deep.equal({email: 'MOCK_ERROR'});
expect(recoverPassword.props.formProps.errors).to.deep.equal({});
recoverPassword.props.formProps.onValidateErrors({email: 'MOCK_ERROR'});
expect(recoverPassword.props.formProps.errors).to.deep.equal({email: 'MOCK_ERROR'});
});
it('should call sendRecoverPassword when submitted', function () {
let mockSubmitData = {email: 'MOCK_VALUE'};
APICallMock.call.reset();
recoverForm.props.onSubmit(mockSubmitData);
recoverPassword.props.formProps.onSubmit(mockSubmitData);
expect(APICallMock.call).to.have.been.calledWith({
path: '/user/send-recover-password',
data: mockSubmitData
@ -152,12 +141,12 @@ describe('Login/Recover Widget', function () {
it('should set loading true in the form when submitted', function () {
let mockSubmitData = {email: 'MOCK_VALUE'};
recoverForm.props.onSubmit(mockSubmitData);
expect(recoverForm.props.loading).to.equal(true);
recoverPassword.props.formProps.onSubmit(mockSubmitData);
expect(recoverForm.props.formProps.loading).to.equal(true);
});
it('should add error and stop loading when send recover fails', function () {
component.refs.recoverForm.refs.email.focus.reset();
component.refs.recoverPassword.refs.email.focus.reset();
component.onRecoverPasswordFail();
expect(recoverForm.props.errors).to.deep.equal({email: 'EMAIL_NOT_EXIST'});
@ -183,4 +172,4 @@ describe('Login/Recover Widget', function () {
expect(widgetTransition.props.sideToShow).to.equal('front');
});
});
});
});

View File

@ -9,7 +9,7 @@ import API from 'lib-app/api-call';
import focus from 'lib-core/focus';
import i18n from 'lib-app/i18n';
import PasswordRecovery from 'app-components/password-recovery.js';
import PasswordRecovery from 'app-components/password-recovery';
import SubmitButton from 'core-components/submit-button';
import Button from 'core-components/button';
import Form from 'core-components/form';

View File

@ -23,18 +23,19 @@ global.requireUnit = function (path, mocks) {
};
global.reRenderIntoDocument = (function () {
let div;
return function (jsx) {
if (!div) {
div = document.createElement('div')
}
return ReactDOM.render(jsx, div);
}
})();
global.ReduxMock = {
connect: stub().returns(stub().returnsArg(0))
};
global.globalIndexPath = '';
Array.prototype.swap = function (x,y) {
var b = this[x];