reboot-service.test.js 5.27 KB
/*
 *
 * ADOBE CONFIDENTIAL
 * __________________
 *
 *  Copyright 2017 Adobe Systems Incorporated
 *  All Rights Reserved.
 *
 * NOTICE:  All information contained herein is, and remains
 * the property of Adobe Systems Incorporated and its suppliers,
 * if any.  The intellectual and technical concepts contained
 * herein are proprietary to Adobe Systems Incorporated and its
 * suppliers and are protected by trade secret or copyright law.
 * Dissemination of this information or reproduction of this material
 * is strictly forbidden unless prior written permission is obtained
 * from Adobe Systems Incorporated.
 */

/* eslint max-nested-callbacks: [2, 10]*/
/* eslint no-new: 0 */

/* globals describe, it, expect, beforeEach, afterEach, sinon */
define([
    'screens/player/shared/serviceadmin',
    'screens/player/shared/test-helper/service',
    'screens/player/shared/test-helper/mock-store-service',
    'screens/player/shared/test-helper/stub-service-interface',
    'screens/player/store/store',
    'screens/player/firmware/reboot/reboot',
    'screens/player/firmware/reboot/spi/reboot',
    'screens/player/firmware/reboot/impl/reboot-service',
    'screens/player/firmware/preferences/preferences',
    'screens/player/firmware/core/statusmodel/statusmodel'
], function(ServiceAdmin, serviceTestHelper, mockStoreService, stubServiceInterface, Store, Reboot, RebootSpi, RebootService, Preferences, StatusModel) {
    'use strict';

    describe('screens/player/firmware/reboot/impl/reboot-service', function() {

        var reboot;

        var mockedStoreService;
        var stubRebootSpiService;

        beforeEach(function() {
            mockedStoreService = mockStoreService(stubServiceInterface(ServiceAdmin, Store));
            stubRebootSpiService = stubServiceInterface(ServiceAdmin, RebootSpi);
            reboot = new RebootService();
        });

        afterEach(function() {
            mockedStoreService.restore();
            stubRebootSpiService.restore();
        });

        serviceTestHelper.runDefaultTests(new RebootService(), Reboot.serviceName);

        describe('API', function() {

            beforeEach(function() {
                return reboot.activate();
            });

            afterEach(function() {
                return reboot.deactivate();
            });

            describe('schedule', function() {

                it('should do nothing if no schedule expression is passed', function(done) {
                    reboot.schedule().catch(function() {
                        expect(stubRebootSpiService.api.schedule).to.not.be.called;
                        expect(mockedStoreService.api.dispatch).to.not.be.called;
                        done();
                    });
                });

                it('should not schedule a reboot if the expression is invalid and dispatch a status model update', function(done) {
                    reboot.schedule('invalid').catch(function() {
                        expect(stubRebootSpiService.api.schedule).to.not.be.called;
                        expect(mockedStoreService.api.dispatch).to.be.calledWithMatch({
                            type: StatusModel.ACTIONS.UPDATE,
                            payload: { nextReboot: null }
                        });
                        done();
                    });
                });

                it('should call the SPI\'s schedule method if the schedule is valid and dispatch a status model update', function() {
                    stubRebootSpiService.api.schedule.returns(Promise.resolve());
                    return reboot.schedule('at 4:00 am').then(function() {
                        expect(stubRebootSpiService.api.schedule).to.be.called;
                        expect(mockedStoreService.api.dispatch).to.be.calledWithMatch({
                            type: StatusModel.ACTIONS.UPDATE,
                            payload: { nextReboot: sinon.match.defined }
                        });
                    });
                });

                it('should reject if there is an error in the the SPI\'s schedule method and dispatch a status model update', function() {
                    stubRebootSpiService.api.schedule.returns(Promise.reject());
                    return reboot.schedule('at 4:00 am').catch(function() {
                        expect(stubRebootSpiService.api.schedule).to.be.called;
                        expect(mockedStoreService.api.dispatch).to.be.calledWithMatch({
                            type: StatusModel.ACTIONS.UPDATE,
                            payload: { nextReboot: null }
                        });
                    });
                });

            });

            describe('clear', function() {

                it('should call the SPI\'s clear method and dispatch a status model update', function() {
                    stubRebootSpiService.api.clear.returns(Promise.resolve());
                    return reboot.clear().then(function() {
                        expect(stubRebootSpiService.api.clear).to.be.called;
                        expect(mockedStoreService.api.dispatch).to.be.calledWithMatch({
                            type: StatusModel.ACTIONS.UPDATE,
                            payload: { nextReboot: null }
                        });
                    });
                });

            });

        });

    });
});