martinmicunda/employee-scheduling-ui

View on GitHub
src/app/core/services/form.spec.js

Summary

Maintainability
F
1 wk
Test Coverage
/**
 * @author    Martin Micunda {@link http://martinmicunda.com}
 * @copyright Copyright (c) 2015, Martin Micunda
 * @license   GPL-3.0
 */
'use strict';

import FormService from './form.js';

describe('FormService', () => {

    let formService, saveButtonOptions = {
        iconsPosition: 'right',
        buttonDefaultText: 'Save',
        buttonSubmittingText: 'Saving',
        buttonSuccessText: 'Saved'
    }, formSteps = [
        {route: 'route0', formName: 'form0', valid: false},
        {route: 'route1', formName: 'form1', valid: true},
        {route: 'route2', formName: 'form2', valid: true},
        {route: 'route3', formName: 'form3', valid: false},
        {route: 'route4', formName: 'form4', valid: true},
        {route: 'route5', formName: 'form5', valid: true}
    ], model = { getItem: () => {return {adminEmail: 'fakeItem'};} };

    beforeEach(() => {
        formService = new FormService(model);
    });

    it(`should have 'saveButtonOptions' property`, () => {
        expect(formService.saveButtonOptions).toEqual(saveButtonOptions);
    });

    it(`should get modal saveButtonOptions`, () => {
        let saveButtonOptionsCloned = Object.assign({}, saveButtonOptions);
        saveButtonOptionsCloned.animationCompleteTime = '0';
        saveButtonOptionsCloned.buttonErrorClass = 'btn-success';

        expect(formService.getModalSaveButtonOptions()).toEqual(saveButtonOptionsCloned);
    });

    it(`should get saveButtonOptions`, () => {
        let saveButtonOptionsCloned = Object.assign({}, saveButtonOptions);
        saveButtonOptionsCloned.animationCompleteTime = '1200';
        saveButtonOptionsCloned.buttonErrorClass = 'btn-danger';

        expect(formService.getSaveButtonOptions()).toEqual(saveButtonOptionsCloned);
    });

    describe('onSuccess', () => {
        it(`should set hasError to false`, () => {
            let self = {};

            formService.onSuccess(self);

            expect(self.hasError).toEqual(false);
        });

        it(`should set result to 'success'`, () => {
            let self = {};

            formService.onSuccess(self);

            expect(self.result).toEqual('success');

        });

        it(`should execute cancel if it is a function`, () => {
            let self = {
                cancel: function() {}
            };
            spyOn(self, 'cancel');

            formService.onSuccess(self);

            expect(self.cancel).toHaveBeenCalled();

        });
    });

    describe('onFailure', () => {
        it(`should set hasError to true`, () => {
            let self = {}, response = {status: 404};

            formService.onFailure(self, response);

            expect(self.hasError).toEqual(true);
        });

        it(`should set result to 'error'`, () => {
            let self = {}, response = {status: 404};

            formService.onFailure(self, response);

            expect(self.result).toEqual('error');
        });

        it(`should return error message for 400 error response`, () => {
            let self = {}, response = {status: 400, data: {message: 'test-message'}};

            formService.onFailure(self, response);

            expect(self.errorMessage).toEqual(response.data.message);
        });

        it(`should return error message for 401 error response`, () => {
            let self = {}, response = {status: 401};

            formService.onFailure(self, response);

            expect(self.errorMessage).toEqual('Wrong email or password.');
        });

        it(`should return error message for 404 error response`, () => {
            let self = {}, response = {status: 404};

            formService.onFailure(self, response);

            expect(self.errorMessage).toEqual('The requested record could not be found.');
        });

        it(`should return error message for 409 PUT error response`, () => {
            let self = {}, response = {status: 409, config: {method: 'PUT'}};

            formService.onFailure(self, response);

            expect(self.errorMessage).toEqual('Another user has updated this record while you were editing. Please reload the page and try again.');
        });

        it(`should return error message for 409 POST error response`, () => {
            let self = {}, response = {status: 409, config: {method: 'POST'}};

            formService.onFailure(self, response);

            expect(self.errorMessage).toEqual('This record already exist.');
        });

        it(`should return error message for 503 error response`, () => {
            let self = {}, response = {status: 503};

            formService.onFailure(self, response);

            expect(self.errorMessage).toEqual('The service went down. Please try again later.');
        });

        it(`should return error message for 500 error response`, () => {
            let self = {}, response = {config: {method: 'POST'}};

            formService.onFailure(self, response);

            expect(self.errorMessage).toEqual(`Something went wrong. Please contact the site administrator ${model.getItem().adminEmail}.`);
        });
    });

    describe('', () => {
        let self = {}, item = 'item', response = {status: 404},
        model = { save: () => {}, delete: () => {} }, form = { $setPristine: () => {} };

        describe('save', () => {
            // Promise.finally is missing in the ES6 spec so we have to add our own version
            Promise.prototype.finally = function (callback) {
                let p = this.constructor;
                return this.then(
                        value  => p.resolve(callback()).then(() => value),
                        reason => p.resolve(callback()).then(() => { throw reason; })
                );
            };

            itAsync(`should save data successfully`, () => {
                spyOn(model, 'save').and.returnValue(Promise.resolve());

                return formService.save(model, item, self, form).then(() => {
                    expect(self.result).toEqual('success');
                    expect(model.save).toHaveBeenCalledWith(item);
                });
            });

            itAsync(`should save data with failure`, () => {
                spyOn(model, 'save').and.returnValue(Promise.reject(response));

                return formService.save(model, item, self, form).then(() => {
                }, (error) => {
                    expect(error).toEqual(response);
                    expect(self.result).toEqual('error');
                    expect(model.save).toHaveBeenCalledWith(item);
                });
            });

            itAsync(`should call form $setPristine function`, () => {
                spyOn(form, '$setPristine');
                spyOn(model, 'save').and.returnValue(Promise.reject(response));

                return formService.save(model, item, self, form).then(() => {
                }, () => {
                    expect(self.result).toEqual('error');
                    expect(form.$setPristine).toHaveBeenCalled();
                });
            });
        });

        describe('delete', () => {
            itAsync(`should delete data successfully`, () => {
                spyOn(model, 'delete').and.returnValue(Promise.resolve());

                return formService.delete(model, item, self).then(() => {
                    expect(self.result).toEqual('success');
                    expect(model.delete).toHaveBeenCalledWith(item);
                });
            });

            itAsync(`should delete data with failure`, () => {
                spyOn(model, 'delete').and.returnValue(Promise.reject(response));

                return formService.delete(model, item, self).then(() => {
                }, () => {
                    expect(self.result).toEqual('error');
                    expect(model.delete).toHaveBeenCalledWith(item);
                });
            });
        });
    });

    describe('submitChildForm', () => {
        it(`should submit child form for step one`, () => {
            let currentState = formSteps[0].route, form = {form0: {$valid: true}};

            expect(formSteps[0].valid).toEqual(false);

            formService.submitChildForm(currentState, form, formSteps);

            expect(form.form0.$submitted).toEqual(true);
            expect(formSteps[0].valid).toEqual(true);
        });

        it(`should submit child form for step four`, () => {
            let currentState = formSteps[3].route, form = {form0: {$valid: true}, form3: {$valid: true}};

            expect(formSteps[3].valid).toEqual(false);

            formService.submitChildForm(currentState, form, formSteps);

            expect(form.form3.$submitted).toEqual(true);
            expect(formSteps[3].valid).toEqual(true);
        });
    });

    describe('previousState', () => {
        it(`should go to previous state ${formSteps[4].route}`, () => {
            let currentState = formSteps[5].route;
            let previousState = formService.previousState(currentState, formSteps);

            expect(previousState).toEqual(formSteps[4].route);
        });

        it(`should go to previous state ${formSteps[3].route}`, () => {
            let currentState = formSteps[4].route;
            let previousState = formService.previousState(currentState, formSteps);

            expect(previousState).toEqual(formSteps[3].route);
        });

        it(`should go to previous state ${formSteps[2].route}`, () => {
            let currentState = formSteps[3].route;
            let previousState = formService.previousState(currentState, formSteps);

            expect(previousState).toEqual(formSteps[2].route);
        });

        it(`should go to previous state ${formSteps[1].route}`, () => {
            let currentState = formSteps[2].route;
            let previousState = formService.previousState(currentState, formSteps);

            expect(previousState).toEqual(formSteps[1].route);
        });

        it(`should go to previous state ${formSteps[0].route}`, () => {
            let currentState = formSteps[1].route;
            let previousState = formService.previousState(currentState, formSteps);

            expect(previousState).toEqual(formSteps[0].route);
        });
    });

    describe('nextState', () => {
        it(`should go to next state ${formSteps[1].route}`, () => {
            let currentState = formSteps[0].route;
            let previousState = formService.nextState(currentState, formSteps);

            expect(previousState).toEqual(formSteps[1].route);
        });

        it(`should go to next state ${formSteps[2].route}`, () => {
            let currentState = formSteps[1].route;
            let previousState = formService.nextState(currentState, formSteps);

            expect(previousState).toEqual(formSteps[2].route);
        });

        it(`should go to next state ${formSteps[3].route}`, () => {
            let currentState = formSteps[2].route;
            let previousState = formService.nextState(currentState, formSteps);

            expect(previousState).toEqual(formSteps[3].route);
        });

        it(`should go to next state ${formSteps[4].route}`, () => {
            let currentState = formSteps[3].route;
            let previousState = formService.nextState(currentState, formSteps);

            expect(previousState).toEqual(formSteps[4].route);
        });

        it(`should go to next state ${formSteps[5].route}`, () => {
            let currentState = formSteps[4].route;
            let previousState = formService.nextState(currentState, formSteps);

            expect(previousState).toEqual(formSteps[5].route);
        });
    });

    describe('hasInvalidChildForms', () => {
        it(`should go to invalid child form`, () => {
            formSteps[0].valid = false;
            let router = {
                go: function() {}
            };
            spyOn(router, 'go');
            let invalidForm = formService.hasInvalidChildForms(router, formSteps);

            expect(invalidForm).toBeDefined();
            expect(router.go).toHaveBeenCalledWith(formSteps[0].route);
        });

        it(`should not go to invalid child form if form is valid`, () => {
            formSteps[0].valid = true;
            let router = {
                go: function() {}
            };
            spyOn(router, 'go');
            let invalidForm = formService.hasInvalidChildForms(router, formSteps);

            expect(invalidForm).not.toBeDefined();
            expect(router.go).not.toHaveBeenCalled();
        });
    });
});