preferences-service.test.js 9.61 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 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 sinon, Promise, describe, expect, it, beforeEach, afterEach */
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/firmware/preferences/spi/defaults',
    'screens/player/firmware/preferences/spi/storage',
    'screens/player/firmware/preferences/spi/urlscheme',
    'screens/player/firmware/preferences/preferences',
    'screens/player/firmware/preferences/impl/preferences-service',
    'screens/player/store/store'
], function(ServiceAdmin, serviceTestHelper, mockStoreService, stubServiceInterface, DefaultsSpi, StorageSpi, URLSchemeSpi, Preferences, PreferencesService, Store) {
    'use strict';

    describe(Preferences.serviceName, function() {

        var mockedStore;
        var stubDefaultsSpi;
        var stubStorageSpi;
        var stubURLSchemeSpi;

        beforeEach(function() {
            mockedStore = mockStoreService(stubServiceInterface(ServiceAdmin, Store));
            stubDefaultsSpi = stubServiceInterface(ServiceAdmin, DefaultsSpi);
            stubStorageSpi = stubServiceInterface(ServiceAdmin, StorageSpi);
            stubStorageSpi.api.load.returns(Promise.resolve());
            stubURLSchemeSpi = stubServiceInterface(ServiceAdmin, URLSchemeSpi);
            stubURLSchemeSpi.api.on.returns();
        });

        afterEach(function() {
            mockedStore.restore();
            stubDefaultsSpi.restore();
            stubStorageSpi.restore();
            stubURLSchemeSpi.restore();
        });

        serviceTestHelper.runDefaultTests(PreferencesService, Preferences.serviceName);

        describe('activate', function() {
            it('calls StorageSpi#load with what DefaultsSpi#getDefaults returns', function() {
                stubDefaultsSpi.api.getDefaults.returns(Promise.resolve('test-defaults'));
                return PreferencesService.activate().then(function() {
                    expect(stubStorageSpi.api.load).to.have.been.calledWith('test-defaults');
                });
            });
            it('calls Store#dispatch with payload what StorageSpi#load resolves', function() {
                stubStorageSpi.api.load.returns(Promise.resolve('test-payload'));
                return PreferencesService.activate().then(function() {
                    expect(mockedStore.api.dispatch).to.have.been.calledWith({
                        payload: 'test-payload',
                        type: Preferences.ACTIONS.SAVING_DONE
                    });
                });
            });
            it('rejects when StorageSpi#load rejects', function() {
                // TODO: Make Logging a Service that we can inject like all
                // other Services
                var stubError = sinon.stub(console, 'error');
                stubStorageSpi.api.load.returns(Promise.reject('test-error'));
                return PreferencesService.activate().then(function() {
                    expect(stubError).to.have.been.calledWithExactly('error while reading preferences', 'test-error');
                    stubError.restore();
                });
            });
            it('calls Store#dispatch with payload what StorageSpi#load rejects', function() {
                stubStorageSpi.api.load.returns(Promise.reject('test-error'));
                return PreferencesService.activate().then(function() {
                    expect(mockedStore.api.dispatch).to.have.been.calledWith({
                        payload: 'test-error',
                        type: Preferences.ACTIONS.SAVING_ERROR
                    });
                });
            });
            it('calls URLSchemeSpi#on called once', function() {
                return PreferencesService.activate().then(function() {
                    expect(stubURLSchemeSpi.api.on).to.have.been.calledWith(sinon.match.func);
                });
            });
        });

        describe('API', function() {

            var testPreferences;
            beforeEach(function() {
                testPreferences = { test: 1 };
                return PreferencesService.activate().then(function() {
                    mockedStore.api.dispatch.reset();
                });
            });
            afterEach(function() {
                return PreferencesService.deactivate();
            });

            describe('save', function() {
                it('calls Store#dispatch with SAVING and SAVING_DONE when StorageSpi#save resolves', function() {
                    var savePromise = Promise.resolve('test-resolves');
                    stubStorageSpi.api.save.returns(savePromise);
                    PreferencesService.save(testPreferences);
                    return savePromise.catch(function() {
                        expect(mockedStore.api.dispatch.firstCall).to.have.been.calledWith({
                            type: Preferences.ACTIONS.SAVING
                        });
                        expect(mockedStore.api.dispatch.secondCall).to.have.been.calledWith({
                            type: Preferences.ACTIONS.SAVING_DONE,
                            payload: 'test-resolves'
                        });
                    });
                });
                it('calls Store#dispatch with SAVING and SAVING_ERROR when StorageSpi#save rejects', function() {
                    var savePromise = Promise.reject('test-reject');
                    stubStorageSpi.api.save.returns(savePromise);
                    PreferencesService.save(testPreferences);
                    return savePromise.catch(function() {
                        expect(mockedStore.api.dispatch.firstCall).to.have.been.calledWith({
                            type: Preferences.ACTIONS.SAVING
                        });
                        expect(mockedStore.api.dispatch.secondCall).to.have.been.calledWith({
                            type: Preferences.ACTIONS.SAVING_ERROR,
                            payload: 'test-reject'
                        });
                    });
                });
            });

            describe('getPreferences', function() {
              it('returns empty Object by default', function() {
                  expect(PreferencesService.getPreferences()).to.be.an('object');
                  expect(PreferencesService.getPreferences()).to.be.empty;
              });
              it('returns whatever `Store#getState` returns', function() {
                  var storeReturns = {};
                  storeReturns[Preferences.NAMESPACE] = 'test';
                  mockedStore.api.getState.returns(storeReturns);
                  expect(PreferencesService.getPreferences()).to.equal('test');
              });
            });

            describe('reset', function() {
                it('calls Store#dispatch with SAVING_DONE with default values', function() {
                    var promise = Promise.resolve('test-defaults');
                    stubDefaultsSpi.api.getDefaults.returns(promise);
                    stubStorageSpi.api.save.returns(promise);

                    PreferencesService.reset();

                    promise.then(function(expected) {
                        expect(mockedStore.api.dispatch).to.have.been.calledWithExactly({
                            type: Preferences.ACTIONS.SAVING
                        });
                        expect(stubStorageSpi.api.save).to.have.been.calledWithExactly(expected);
                        expect(mockedStore.api.dispatch).to.have.been.calledWithExactly({
                            payload: expected,
                            type: Preferences.ACTIONS.SAVING_DONE
                        });
                    });

                });
            });

        });

        describe('urlscheme', function() {
            it('registered stubURLSchemeSpi#on callback calls Store#dispatch with SAVING and SAVING_DONE when StorageSpi#save resolves', function() {
                var testPreferences = { test: 1 };
                var callback;
                stubURLSchemeSpi.api.on = function(cb) {
                    callback = cb;
                };

                return PreferencesService.activate().then(function() {
                    var savePromise = Promise.resolve('test-resolves');
                    stubStorageSpi.api.save.returns(savePromise);
                    savePromise.catch(function() {
                        expect(mockedStore.api.dispatch.firstCall).to.have.been.calledWith({
                            type: Preferences.ACTIONS.SAVING
                        });
                        expect(mockedStore.api.dispatch.secondCall).to.have.been.calledWith({
                            type: Preferences.ACTIONS.SAVING_DONE,
                            payload: 'test-resolves'
                        });
                    });

                    expect(callback).to.not.be.null;
                    callback(testPreferences);
                    return savePromise;
                });
            });
        });


    });
});