Initial commit
This commit is contained in:
@@ -0,0 +1,243 @@
|
||||
var DataviewBase = require('../../../../../src/api/v4/dataview/base');
|
||||
var status = require('../../../../../src/api/v4/constants').status;
|
||||
var carto = require('../../../../../src/api/v4/index');
|
||||
|
||||
function createSourceMock () {
|
||||
return new carto.source.Dataset('foo');
|
||||
}
|
||||
|
||||
function createEngineMock () {
|
||||
var engine = {
|
||||
name: 'Engine mock',
|
||||
reload: function () {}
|
||||
};
|
||||
spyOn(engine, 'reload');
|
||||
|
||||
return engine;
|
||||
}
|
||||
|
||||
describe('api/v4/dataview/base', function () {
|
||||
var base = new DataviewBase();
|
||||
|
||||
it('.getStatus should return the internal status', function () {
|
||||
expect(base.getStatus()).toEqual(base._status);
|
||||
});
|
||||
|
||||
describe('.isLoading', function () {
|
||||
it('should return true if loading and false otherwise', function () {
|
||||
base._status = status.NOT_LOADED;
|
||||
expect(base.isLoading()).toBe(false);
|
||||
base._status = status.LOADING;
|
||||
expect(base.isLoading()).toBe(true);
|
||||
});
|
||||
|
||||
it('should return true if loading and false otherwise', function () {
|
||||
base._status = status.NOT_LOADED;
|
||||
expect(base.isLoaded()).toBe(false);
|
||||
base._status = status.LOADED;
|
||||
expect(base.isLoaded()).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('.hasError', function () {
|
||||
it('should return true if loading and false otherwise', function () {
|
||||
base._status = status.NOT_LOADED;
|
||||
expect(base.hasError()).toBe(false);
|
||||
base._status = status.ERROR;
|
||||
expect(base.hasError()).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('.enable', function () {
|
||||
it('should enable the dataview', function () {
|
||||
base.enable();
|
||||
expect(base._enabled).toBe(true);
|
||||
});
|
||||
|
||||
it('should return the dataview', function () {
|
||||
expect(base.enable()).toBe(base);
|
||||
});
|
||||
});
|
||||
|
||||
describe('.disable', function () {
|
||||
it('should disable the dataview', function () {
|
||||
base.disable();
|
||||
expect(base._enabled).toBe(false);
|
||||
});
|
||||
|
||||
it('should return the dataview', function () {
|
||||
expect(base.disable()).toBe(base);
|
||||
});
|
||||
});
|
||||
|
||||
describe('.isEnabled', function () {
|
||||
it('should return true if enabled and false otherwise', function () {
|
||||
base.disable();
|
||||
expect(base.isEnabled()).toBe(false);
|
||||
base.enable();
|
||||
expect(base.isEnabled()).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('.getSource', function () {
|
||||
it('should return the source object', function () {
|
||||
var source = new carto.source.Dataset('table_name');
|
||||
base._source = source;
|
||||
expect(base.getSource()).toBe(source);
|
||||
});
|
||||
});
|
||||
|
||||
describe('.setColumn', function () {
|
||||
it('should set the column name as string', function () {
|
||||
var column = 'column-test';
|
||||
base.setColumn(column);
|
||||
expect(base._column).toBe(column);
|
||||
});
|
||||
|
||||
it('should throw an error if the argument is not string or undefined', function () {
|
||||
var requiredColumnError;
|
||||
var stringColumnError;
|
||||
var emptyColumnError;
|
||||
|
||||
try { base.setColumn(); } catch (error) { requiredColumnError = error; }
|
||||
try { base.setColumn(12); } catch (error) { stringColumnError = error; }
|
||||
try { base.setColumn(''); } catch (error) { emptyColumnError = error; }
|
||||
|
||||
expect(requiredColumnError).toEqual(jasmine.objectContaining({
|
||||
message: 'Column property is required.',
|
||||
type: 'dataview',
|
||||
errorCode: 'validation:dataview:column-required'
|
||||
}));
|
||||
expect(stringColumnError).toEqual(jasmine.objectContaining({
|
||||
message: 'Column property must be a string.',
|
||||
type: 'dataview',
|
||||
errorCode: 'validation:dataview:column-string'
|
||||
}));
|
||||
expect(emptyColumnError).toEqual(jasmine.objectContaining({
|
||||
message: 'Column property must be not empty.',
|
||||
type: 'dataview',
|
||||
errorCode: 'validation:dataview:empty-column'
|
||||
}));
|
||||
});
|
||||
|
||||
it('should return the dataview', function () {
|
||||
var column = 'column-test';
|
||||
expect(base.setColumn(column)).toBe(base);
|
||||
});
|
||||
});
|
||||
|
||||
describe('.getColumn', function () {
|
||||
it('should return the column name', function () {
|
||||
var column = 'column-test2';
|
||||
base._column = column;
|
||||
expect(base.getColumn()).toBe(column);
|
||||
});
|
||||
});
|
||||
|
||||
describe('.getData', function () {
|
||||
it('.getData should not be defined in the base dataview', function () {
|
||||
expect(function () { base.getData(); }).toThrowError(Error, 'getData must be implemented by the particular dataview.');
|
||||
});
|
||||
});
|
||||
|
||||
describe('._changeProperty', function () {
|
||||
it('should set internal property', function () {
|
||||
base._example = 'something';
|
||||
|
||||
base._changeProperty('example', 'whatever');
|
||||
|
||||
expect(base._example).toEqual('whatever');
|
||||
});
|
||||
|
||||
it('should trigger change is there is no internal model', function () {
|
||||
var eventValue = '';
|
||||
base._example = 'something';
|
||||
base.on('exampleChanged', function (newValue) {
|
||||
eventValue = newValue;
|
||||
});
|
||||
|
||||
base._changeProperty('example', 'whatever');
|
||||
|
||||
expect(eventValue).toEqual('whatever');
|
||||
});
|
||||
|
||||
it('should update internal model and trigger a change when the internalModel exists', function () {
|
||||
var internalModelSpy = jasmine.createSpyObj('internalModelSpy', ['set']);
|
||||
base._example = 'something';
|
||||
base._internalModel = internalModelSpy;
|
||||
spyOn(base, '_triggerChange');
|
||||
|
||||
base._changeProperty('example', 'whatever');
|
||||
|
||||
expect(internalModelSpy.set).toHaveBeenCalledWith('example', 'whatever');
|
||||
expect(base._triggerChange).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
describe('.$setEngine', function () {
|
||||
var engine;
|
||||
var dataview;
|
||||
|
||||
beforeEach(function () {
|
||||
// We use Formula for these tests. Any other dataview could be used instead.
|
||||
dataview = new carto.dataview.Formula(createSourceMock(), 'population', {
|
||||
operation: carto.operation.MIN
|
||||
});
|
||||
engine = createEngineMock();
|
||||
});
|
||||
|
||||
it('internalModel events should be properly hooked up', function () {
|
||||
dataview.$setEngine(engine);
|
||||
var internalModel = dataview._internalModel;
|
||||
var eventStatus = null;
|
||||
var eventError = null;
|
||||
var dataviewError = null;
|
||||
dataview.on('statusChanged', function (newStatus, error) {
|
||||
eventStatus = newStatus;
|
||||
eventError = error;
|
||||
});
|
||||
dataview.on('error', function (error) {
|
||||
dataviewError = error;
|
||||
});
|
||||
|
||||
// Loading
|
||||
internalModel.trigger('loading');
|
||||
|
||||
expect(dataview.getStatus()).toEqual('loading');
|
||||
expect(eventStatus).toEqual('loading');
|
||||
|
||||
// Loaded
|
||||
internalModel.trigger('loaded');
|
||||
|
||||
expect(dataview.getStatus()).toEqual('loaded');
|
||||
expect(eventStatus).toEqual('loaded');
|
||||
|
||||
// Error
|
||||
internalModel.trigger('statusError', internalModel, 'an error');
|
||||
|
||||
expect(dataview.getStatus()).toEqual('error');
|
||||
expect(eventStatus).toEqual('error');
|
||||
expect(eventError).toEqual('an error');
|
||||
expect(dataviewError.name).toEqual('CartoError');
|
||||
});
|
||||
});
|
||||
|
||||
describe('add bbox filter', function () {
|
||||
it('should check if it is a proper object', function () {
|
||||
function test () {
|
||||
base.addFilter('invalid_filter');
|
||||
}
|
||||
|
||||
expect(test).toThrowError('Filter property is required.');
|
||||
});
|
||||
|
||||
it('should throw an error if an SQL filter is passed', function () {
|
||||
function test () {
|
||||
var categoryFilter = new carto.filter.Category('fake_column', { in: ['category_value'] });
|
||||
base.addFilter(categoryFilter);
|
||||
}
|
||||
|
||||
expect(test).toThrowError('Filter property is required.');
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user