Files
carto.js/test/spec/analysis/analysis-poller.spec.js
2020-06-13 18:34:34 +08:00

106 lines
3.6 KiB
JavaScript

var _ = require('underscore');
var Backbone = require('backbone');
var AnalysisModel = require('../../../src/analysis/analysis-model');
var AnalysisPoller = require('../../../src/analysis/analysis-poller');
describe('src/analysis/analysis-poller', function () {
beforeEach(function () {
jasmine.clock().install();
var engineMock = new Backbone.Model();
this.reference = jasmine.createSpyObj('reference', ['getParamNamesForAnalysisType']);
this.analysisModel1 = new AnalysisModel({
id: 'a1',
url: 'http://carto.com/foo/bar'
}, { engine: engineMock, camshaftReference: this.reference });
this.analysisPoller = new AnalysisPoller();
});
afterEach(function () {
jasmine.clock().uninstall();
});
describe('.resetAnalysisNodes', function () {
_.each([AnalysisModel.STATUS.PENDING, AnalysisModel.STATUS.WAITING, AnalysisModel.STATUS.RUNNING], function (status) {
it('should start polling if status of an analysis is "' + status + '"', function () {
this.analysisModel1.set({
'status': status
});
spyOn(this.analysisModel1, 'fetch').and.callFake(function (options) {
options.success();
});
this.analysisPoller.resetAnalysisNodes([ this.analysisModel1 ]);
expect(this.analysisModel1.fetch).toHaveBeenCalled();
expect(this.analysisModel1.fetch.calls.count()).toEqual(1);
// Wait until next fetch is triggered
jasmine.clock().tick(AnalysisPoller.CONFIG.START_DELAY + 1);
expect(this.analysisModel1.fetch.calls.count()).toEqual(2);
// Wait until next fetch is triggered
jasmine.clock().tick(AnalysisPoller.CONFIG.START_DELAY * AnalysisPoller.CONFIG.DELAY_MULTIPLIER + 1);
expect(this.analysisModel1.fetch.calls.count()).toEqual(3);
});
});
_.each([AnalysisModel.STATUS.READY, AnalysisModel.STATUS.FAILED], function (newStatus) {
it('should stop polling if status of an analysis changes to "' + newStatus + '"', function () {
spyOn(this.analysisModel1, 'fetch').and.callFake(function (options) {
this.analysisModel1.set('status', newStatus, { silent: true });
options.success();
}.bind(this));
this.analysisModel1.set({
'status': 'pending'
});
this.analysisPoller.resetAnalysisNodes([ this.analysisModel1 ]);
expect(this.analysisModel1.fetch).toHaveBeenCalled();
expect(this.analysisModel1.fetch.calls.count()).toEqual(1);
// Wait until next fetch is triggered
jasmine.clock().tick(AnalysisPoller.CONFIG.START_DELAY + 1);
expect(this.analysisModel1.fetch.calls.count()).toEqual(1);
});
});
});
describe('.reset', function () {
it('should reset all pollers', function () {
this.analysisModel1.set({
'status': 'pending'
});
spyOn(this.analysisModel1, 'fetch').and.callFake(function (options) {
options.success();
});
this.analysisPoller.resetAnalysisNodes([ this.analysisModel1 ]);
expect(this.analysisModel1.fetch).toHaveBeenCalled();
expect(this.analysisModel1.fetch.calls.count()).toEqual(1);
// Wait until next fetch is triggered
jasmine.clock().tick(AnalysisPoller.CONFIG.START_DELAY + 1);
// Polling is working
expect(this.analysisModel1.fetch.calls.count()).toEqual(2);
this.analysisPoller.reset();
// Wait until next fetch is supposed to be triggered
jasmine.clock().tick(AnalysisPoller.CONFIG.START_DELAY * AnalysisPoller.CONFIG.DELAY_MULTIPLIER + 1);
// Polling has been stopped
expect(this.analysisModel1.fetch.calls.count()).toEqual(2);
});
});
});