diff --git a/syweb/webclient/components/matrix/event-stream-service.js b/syweb/webclient/components/matrix/event-stream-service.js index c03f0b953b..be60de7472 100644 --- a/syweb/webclient/components/matrix/event-stream-service.js +++ b/syweb/webclient/components/matrix/event-stream-service.js @@ -124,6 +124,10 @@ angular.module('eventStreamService', []) }; return { + // expose these values for testing + SERVER_TIMEOUT: SERVER_TIMEOUT_MS, + CLIENT_TIMEOUT: CLIENT_TIMEOUT_MS, + // resume the stream from whereever it last got up to. Typically used // when the page is opened. resume: function() { diff --git a/syweb/webclient/test/unit/event-stream-service.spec.js b/syweb/webclient/test/unit/event-stream-service.spec.js new file mode 100644 index 0000000000..6fd7693a70 --- /dev/null +++ b/syweb/webclient/test/unit/event-stream-service.spec.js @@ -0,0 +1,80 @@ +describe('EventStreamService', function() { + var q, scope; + + var testInitialSync, testEventStream; + + var matrixService = { + initialSync: function(limit, feedback) { + var defer = q.defer(); + defer.resolve(testInitialSync); + return defer.promise; + }, + getEventStream: function(from, svrTimeout, cliTimeout) { + var defer = q.defer(); + defer.resolve(testEventStream); + return defer.promise; + } + }; + + var eventHandlerService = { + handleInitialSyncDone: function(response) { + + }, + + handleEvents: function(chunk, isLive) { + + } + }; + + // setup the dependencies + beforeEach(function() { + + // reset test data + testInitialSync = { + data: { + end: "foo", + presence: [], + rooms: [] + } + }; + testEventStream = { + data: { + start: "foostart", + end: "fooend", + chunk: [] + } + }; + + // dependencies + module(function ($provide) { + $provide.value('matrixService', matrixService); + $provide.value('eventHandlerService', eventHandlerService); + }); + + // tested service + module('eventStreamService'); + }); + + beforeEach(inject(function($q, $rootScope) { + q = $q; + scope = $rootScope; + })); + + it('should start with /initialSync then go onto /events', inject( + function(eventStreamService) { + spyOn(eventHandlerService, "handleInitialSyncDone"); + spyOn(eventHandlerService, "handleEvents"); + eventStreamService.resume(); + scope.$apply(); // initialSync request + expect(eventHandlerService.handleInitialSyncDone).toHaveBeenCalledWith(testInitialSync); + expect(eventHandlerService.handleEvents).toHaveBeenCalledWith(testEventStream.data.chunk, true); + })); + + it('should use the end token in /initialSync for the next /events request', inject( + function(eventStreamService) { + spyOn(matrixService, "getEventStream").and.callThrough(); + eventStreamService.resume(); + scope.$apply(); // initialSync request + expect(matrixService.getEventStream).toHaveBeenCalledWith("foo", eventStreamService.SERVER_TIMEOUT, eventStreamService.CLIENT_TIMEOUT); + })); +});