linagora/openpaas-esn

View on GitHub
modules/linagora.esn.graceperiod/frontend/js/grace-period-live-notification.service.spec.js

Summary

Maintainability
D
2 days
Test Coverage
'use strict';

/* global chai: false */
/* global sinon: false */

var expect = chai.expect;

describe('The gracePeriodLiveNotificationService service', function() {

  beforeEach(function() {
    module('esn.websocket');
    module('esn.http');
    module('linagora.esn.graceperiod');
  });

  describe('Functions tests', function() {

    var gracePeriodLiveNotificationService;
    var liveNotificationMock, onFn, removeListenerFn;

    beforeEach(function() {
      onFn = sinon.spy();
      removeListenerFn = sinon.spy();
      liveNotificationMock = sinon.stub().returns({
        on: onFn,
        removeListener: removeListenerFn
      });

      module(function($provide) {
        $provide.value('livenotification', liveNotificationMock);
      });

      inject(function(_gracePeriodLiveNotificationService_) {
        gracePeriodLiveNotificationService = _gracePeriodLiveNotificationService_;
      });
    });

    describe('The start function', function() {
      it('should register listener once', function() {
        gracePeriodLiveNotificationService.start();
        gracePeriodLiveNotificationService.start();
        expect(onFn.callCount).to.equal(2);
      });

      it('should register listeners for error and done events', function() {
        gracePeriodLiveNotificationService.start();
        expect(onFn.firstCall.calledWith('graceperiod:error')).to.be.true;
        expect(onFn.secondCall.calledWith('graceperiod:done')).to.be.true;
      });
    });

    describe('The registerListeners function', function() {
      it('should fail when not given a id', function() {
        expect(function() {
          gracePeriodLiveNotificationService.registerListeners();
        }).to.throw(Error);
        expect(gracePeriodLiveNotificationService.getListeners()).to.be.empty;
      });

      it('should save listeners', function() {
        gracePeriodLiveNotificationService.registerListeners('foo');
        expect(gracePeriodLiveNotificationService.getListeners().foo).to.exist;
      });

      it('should save listeners as many times as called', function() {
        gracePeriodLiveNotificationService.registerListeners('foo');
        gracePeriodLiveNotificationService.registerListeners('foo');
        gracePeriodLiveNotificationService.registerListeners('bar');
        expect(gracePeriodLiveNotificationService.getListeners().foo.length).to.equal(2);
        expect(gracePeriodLiveNotificationService.getListeners().bar.length).to.equal(1);
      });

    });

    describe('The unregisterListeners function', function() {
      it('should fail when task is null', function() {
        gracePeriodLiveNotificationService.registerListeners('foo');
        expect(gracePeriodLiveNotificationService.unregisterListeners).to.throw(Error);
        expect(gracePeriodLiveNotificationService.getListeners().foo.length).to.equal(1);
      });

      it('should remove listeners for given task', function() {
        gracePeriodLiveNotificationService.registerListeners('foo');
        gracePeriodLiveNotificationService.unregisterListeners('foo');
        expect(gracePeriodLiveNotificationService.getListeners().foo).to.not.exist;
      });
    });
  });

  describe('Events tests', function() {

    var gracePeriodLiveNotificationService, $rootScope;
    var liveNotificationMock;

    beforeEach(function() {
      var events = {};

      var handler = function(event, data) {
        if (!events[event]) {
          return;
        }

        events[event].forEach(function(listener) {
          listener(data);
        });

      };

      liveNotificationMock = function() {
        return {
          emit: handler,
          on: function(event, callback) {
            if (!events[event]) {
              events[event] = [];
            }
            events[event].push(callback);
          }
        };
      };

      module(function($provide) {
        $provide.value('livenotification', liveNotificationMock);
      });

      inject(function(_$rootScope_, _gracePeriodLiveNotificationService_) {
        $rootScope = _$rootScope_;
        gracePeriodLiveNotificationService = _gracePeriodLiveNotificationService_;
      });
    });

    describe('When started', function() {

      describe('on error event', function() {
        it('should make corresponding promise fail', function() {

          var sio = gracePeriodLiveNotificationService.start();

          var id = 'foo';
          var spyThatShouldBeCalled = sinon.spy();
          var spyThatShouldNotBeCalled = sinon.spy();

          gracePeriodLiveNotificationService.registerListeners(id).then(spyThatShouldNotBeCalled, spyThatShouldBeCalled);
          gracePeriodLiveNotificationService.registerListeners(id).then(spyThatShouldNotBeCalled);
          gracePeriodLiveNotificationService.registerListeners('bar', spyThatShouldNotBeCalled);

          $rootScope.$digest();
          sio.emit('graceperiod:error', {id: id});
          $rootScope.$digest();

          expect(spyThatShouldBeCalled).to.have.been.called;
          expect(spyThatShouldNotBeCalled).to.have.not.been.called;
        });

        it('should make corresponding promise fail only once', function() {
          var sio = gracePeriodLiveNotificationService.start();
          var id = 'foo';

          var errorSpy1 = sinon.spy();
          var errorSpy2 = sinon.spy();

          gracePeriodLiveNotificationService.registerListeners(id).catch(errorSpy1);
          gracePeriodLiveNotificationService.registerListeners(id).catch(errorSpy2);

          $rootScope.$digest();
          sio.emit('graceperiod:error', {id: id});
          $rootScope.$digest();
          sio.emit('graceperiod:error', {id: id});
          $rootScope.$digest();
          expect(errorSpy1).to.have.been.calledOnce;
          expect(errorSpy2).to.have.been.calledOnce;
        });

      });

      describe('on done event', function() {
        it('should run all the registered done listeners', function() {
          var sio = gracePeriodLiveNotificationService.start();
          var id = 'foo';
          var spyThatShouldBeCalled = sinon.spy();
          var spyThatShouldNotBeCalled = sinon.spy();

          gracePeriodLiveNotificationService.registerListeners(id).then(spyThatShouldBeCalled, spyThatShouldNotBeCalled);
          gracePeriodLiveNotificationService.registerListeners(id).catch(spyThatShouldNotBeCalled);
          gracePeriodLiveNotificationService.registerListeners('bar').catch(spyThatShouldNotBeCalled, spyThatShouldNotBeCalled);

          $rootScope.$digest();
          sio.emit('graceperiod:done', {id: id});
          $rootScope.$digest();

          expect(spyThatShouldBeCalled).to.have.been.called;
          expect(spyThatShouldNotBeCalled).to.have.not.been.called;
        });

        it('should run all the registered done listeners once', function() {
          var sio = gracePeriodLiveNotificationService.start();

          var id = 'foo';
          var spy1 = sinon.spy();
          var spy2 = sinon.spy();

          gracePeriodLiveNotificationService.registerListeners(id).then(spy1);
          gracePeriodLiveNotificationService.registerListeners(id).then(spy2);

          $rootScope.$digest();
          sio.emit('graceperiod:done', {id: id});
          $rootScope.$digest();
          sio.emit('graceperiod:done', {id: id});
          $rootScope.$digest();
          expect(spy1).to.have.been.calledOnce;
          expect(spy2).to.have.been.calledOnce;
        });
      });
    });
  });
});