stub-service-interface.js 2.84 KB
/*
 * ADOBE CONFIDENTIAL
 *
 * Copyright 2016 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 may be covered by U.S. and Foreign Patents,
 * patents in process, 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.
 */
/* globals sinon */
define('screens/player/shared/test-helper/stub-service-interface', [], function() {
    'use strict';

    /**
     * A Test Helper that returns a stubbed Service Interface instead of the
     * real Service. This is only useful for isolated unit tests where you
     * want to mock the dependencies.
     *
     * Please make sure to call `restore` within `afterEach`. Otherwise the
     * mock might leak in other tests.
     *
     * @param {ServiceAdmin} [serviceAdminInstance] A ServiceAdmin instance.
     * @param {Object} [anInterface] The Service Interface.
     * @param {Object} [additionalFunctions] Additional Functions to override.
     * @returns {Object} The API of the TestHelper
     */
    return function(serviceAdminInstance, anInterface, additionalFunctions) {

        var getServiceStub;
        var sandbox = sinon.sandbox.create();

        try {
            getServiceStub = sandbox.stub(serviceAdminInstance, 'getService');
        } catch (e) {
            // Simple workaound for sinon's "Object already stubbed" errors.
            getServiceStub = serviceAdminInstance.getService;
        }

        // Stub Functions of Interface.
        var stubbedApi = Object.getOwnPropertyNames(anInterface)
          .filter(function(propName) {
              return typeof anInterface[propName] === 'function';
          })
          .reduce(function(previous, current) {
              previous[current] = sandbox.stub();
              return previous;
          }, {});

        // Stub Functions of Interface.
        if (additionalFunctions) {
            Object.getOwnPropertyNames(additionalFunctions)
                .forEach(function(propName) {
                    if (typeof additionalFunctions[propName] === 'function') {
                        stubbedApi[propName] = additionalFunctions[propName].bind(stubbedApi);
                    }
                });
        }

        // Fake the return value of `ServerAdmin.getService`.
        getServiceStub
          .withArgs(anInterface.serviceName)
          .returns(stubbedApi);

        return {
            api: stubbedApi,
            restore: function() {
                sandbox.restore();
            }
        };
    };

});