describe('api.layers', function() {
describe('loadLayer leaflet', function() {
loadLayerSpecs(function() {
return L.map($('
')[0]).setView([0, 0], 3);
});
});
describe('loadLayer gmaps', function() {
loadLayerSpecs(function() {
return new google.maps.Map($('
')[0],{
zoom: 3,
center: new google.maps.LatLng(0, 0),
mapTypeId: google.maps.MapTypeId.ROADMAP
});
});
});
describe('loadLayer unknow', function() {
it("should return an error for unknow map types", function(done) {
var map = {};
var err = false;
cartodb.createLayer(map, { kind: 'plain', options: {} }, function(l) {
layer = l;
}).error(function() {
err = true;
});
setTimeout(function() {
expect(err).toEqual(true);
done();
}, 1000);
})
});
//
// shared specs for each map
//
function loadLayerSpecs(mapFn) {
describe("(shared)", function() {
var map;
beforeEach(function() {
map = mapFn();
cartodb.torque = torque;
});
afterEach(function() {
delete cartodb.torque;
});
it("should fecth layer when user and pass are specified", function() {
spyOn(cdb.core.Loader, 'get');
cartodb.createLayer(map, {
user: 'development',
table: 'clubbing',
host: 'localhost.lan:3000',
protocol: 'http'
});
expect(cdb.core.Loader.get).toHaveBeenCalled();
});
it("should fecth layer when a url is specified", function() {
spyOn(cdb.core.Loader, 'get');
cartodb.createLayer(map, 'http://test.com/layer.json');
expect(cdb.core.Loader.get).toHaveBeenCalled();
});
it("should not fecth layer when kind and options are specified", function() {
spyOn(cdb.core.Loader, 'get');
cartodb.createLayer(map, { kind: 'plain', options: {} });
expect(cdb.core.Loader.get).not.toHaveBeenCalled();
});
it("should create a layer", function(done) {
var layer;
cartodb.createLayer(map, { kind: 'plain', options: {} }, function(l) {
layer = l;
});
setTimeout(function() {
expect(layer).not.toEqual(undefined);
expect(layer.type).toEqual('plain');
done();
}, 100);
});
it("should create a layer with type", function(done) {
var layer;
cartodb.createLayer(map, { kind: 'cartodb', options: { tile_style: 'test', table_name: 'table', user_name: 'test'} }, function(l) {
layer = l;
});
setTimeout(function() {
expect(layer.type).toEqual('cartodb');
done();
}, 100);
});
it("should create a layer with options", function(done) {
var layer;
cartodb.createLayer(map, { kind: 'cartodb', options: {tile_style: 'test', table_name: 'table', user_name: 'test'} }, {query: 'select test'}, function(l) {
layer = l;
});
setTimeout(function() {
expect(layer.options.query).toEqual('select test');
done();
}, 100);
});
it("should use https when https == true", function(done) {
var layer;
cartodb.createLayer(map, { kind: 'cartodb', options: {tile_style: 'test', table_name: 'table', user_name: 'test'} }, {https: true}, function(l) {
layer = l;
});
setTimeout(function() {
expect(layer._host().indexOf('https')).toEqual(0);
done();
}, 100);
});
it("should not use https when https == false", function(done) {
var layer;
cartodb.createLayer(map, { kind: 'cartodb', options: {tile_style: 'test', table_name: 'table', user_name: 'test'} }, {https: false}, function(l) {
layer = l;
});
setTimeout(function() {
expect(layer._host().indexOf('https')).toEqual(-1);
done();
}, 100);
});
it("should not substitute mapnik tokens", function(done) {
var layer;
cartodb.createLayer(map, { kind: 'cartodb', options: {tile_style: 'test', table_name: 'table', user_name: 'test'} }, {query: 'select !bbox!'}, function(l) {
layer = l
})
setTimeout(function() {
expect(layer.getQuery()).toEqual('select !bbox!');
done();
}, 100);
});
it("should manage errors", function(done) {
var s = sinon.spy();
cartodb.createLayer(map, { options: {} }).on('error', s);
setTimeout(function() {
expect(s.called).toEqual(true);
done();
}, 10);
});
it("should call callback if the last argument is a function", function(done) {
var layer;
var s = sinon.spy();
var s2 = sinon.spy();
cartodb.createLayer(map, { kind: 'plain', options: {} }, s);
cartodb.createLayer(map, layer={ kind: 'plain', options: {} }, { rambo: 'thebest'} ,s2);
setTimeout(function() {
expect(s.called).toEqual(true);
expect(layer.options.rambo).toEqual('thebest');
expect(s2.called).toEqual(true);
done();
}, 10);
});
it("should load vis.json", function(done) {
var layer;
var s = sinon.spy();
cartodb.createLayer(map, {
updated_at: 'jaja',
layers: [
{ type: 'tiled', options: {} },
{
type: 'layergroup',
options: {
layer_definition: {
layers: []
},
extra_params: { cache_buster: 'cb' }
}
}
]
}, s).done(function(lyr) {
layer = lyr;
});
setTimeout(function() {
expect(s.called).toEqual(true);
expect(layer.model.attributes.extra_params.cache_buster).toEqual('cb');
done();
}, 10);
});
it("should load specified layer", function(done) {
var layer;
var s = sinon.spy();
cartodb.createLayer(map, {
updated_at: 'jaja',
layers: [
null,
{kind: 'cartodb', options: { user_name: 'test', table_name: 'test', tile_style: 'test'}, infowindow: null },
{kind: 'torque', options: { user_name: 'test', table_name: 'test', tile_style: 'Map{ -torque-frame-count: 10; }#test { marker-width: 10; }'}, infowindow: null }
]
}, { layerIndex: 2 }, s).done(function(lyr) {
layer = lyr;
});
setTimeout(function() {
expect(s.called).toEqual(true);
// check it's a torque layer and not a cartodb one
expect(layer.model.get('type')).toEqual('torque');
done();
}, 500);
});
it("should load the `namedmap` layer by default", function(done) {
var layer;
cartodb.createLayer(map, {
updated_at: 'jaja',
layers: [
{ type: 'tiled', options: {} },
{ type: 'tiled', options: {} },
{
type: 'namedmap',
user_name: 'dev',
options: {
named_map: {
name: 'testing',
params: {
color: 'red'
}
}
}
}
]
}).done(function(lyr) {
layer = lyr;
});
setTimeout(function() {
expect(layer).toBeDefined();
expect(layer.options.type).toEqual('namedmap');
done();
}, 0);
});
it("should load the `layergroup` layer by default", function(done) {
var layer;
cartodb.createLayer(map, {
updated_at: 'jaja',
layers: [
{ type: 'tiled', options: {} },
{ type: 'tiled', options: {} },
{
type: 'layergroup',
options: {
layer_definition: {
layers: []
}
}
}
]
}).done(function(lyr) {
layer = lyr;
});
setTimeout(function() {
expect(layer).toBeDefined();
expect(layer.options.type).toEqual('layergroup');
done();
}, 0);
});
it("should load the `torque` layer by default", function(done) {
var layer;
cartodb.createLayer(map, {
updated_at: 'jaja',
layers: [
{ type: 'tiled', options: {} },
{ type: 'tiled', options: {} },
{
type: 'torque',
options: {
'torque-steps': 3
}
}
]
}).done(function(lyr) {
layer = lyr;
});
setTimeout(function() {
expect(layer).toBeDefined();
expect(layer.type).toEqual('torque');
done();
}, 0);
});
it("should add a torque layer", function(done) {
var layer;
var s = sinon.spy();
cartodb.createLayer(map, {
updated_at: 'jaja',
layers: [
null,
{kind: 'cartodb', options: { user_name: 'test', table_name: 'test', tile_style: 'test'}, infowindow: null },
{kind: 'torque', options: { user_name: 'test', table_name: 'test', tile_style: 'Map { -torque-frame-count: 10;} #test { marker-width: 10; }'}, infowindow: null }
]
}, { layerIndex: 2 }, s).done(function(lyr) {
layer = lyr;
}).addTo(map)
var wait = 500;
if (!map.getContainer) wait = 2500;
setTimeout(function() {
if (map.getContainer) expect($(map.getContainer()).find('.cartodb-timeslider').length).toBe(1)
if (map.getDiv) expect($(map.getDiv()).find('.cartodb-timeslider').length).toBe(1)
done()
}, wait);
});
it("should ask for https data when https is on at torque layer", function(done) {
var layer;
var s = sinon.spy();
cartodb.createLayer(map, {
updated_at: 'jaja',
layers: [
null,
{kind: 'cartodb', options: { user_name: 'test', table_name: 'test', tile_style: 'test'}, infowindow: null },
{kind: 'torque', options: { user_name: 'test', table_name: 'test', tile_style: 'Map { -torque-frame-count: 10;} #test { marker-width: 10; }'}, infowindow: null }
]
}, { layerIndex: 2, https: true }, s).done(function(lyr) {
layer = lyr;
}).addTo(map)
var wait = 500;
if (!map.getContainer) wait = 2500;
setTimeout(function() {
expect(layer.provider.options.tiler_protocol).toBe("https");
done()
}, wait);
});
it("should not add a torque layer timeslider if steps are not greater than 1", function(done) {
var layer;
var s = sinon.spy();
cartodb.createLayer(map, {
updated_at: 'jaja',
layers: [
null,
{kind: 'cartodb', options: { user_name: 'test', table_name: 'test', tile_style: 'test'}, infowindow: null },
{kind: 'torque', options: { user_name: 'test', table_name: 'test', tile_style: 'Map { -torque-frame-count: 1;} #test { marker-width: 10; }'}, infowindow: null }
]
}, { layerIndex: 2 }, s).done(function(lyr) {
layer = lyr;
}).addTo(map)
var wait = 500;
if (!map.getContainer) wait = 2500;
setTimeout(function() {
if (map.getContainer) expect($(map.getContainer()).find('.cartodb-timeslider').length).toBe(0)
if (map.getDiv) expect($(map.getDiv()).find('.cartodb-timeslider').length).toBe(0)
done()
}, wait);
});
it("should add cartodb logo with torque layer although it is not defined", function(done) {
var layer;
var s = sinon.spy();
cartodb.createLayer(map, {
updated_at: 'jaja',
layers: [
null,
{kind: 'cartodb', options: { user_name: 'test', table_name: 'test', tile_style: 'test'}, infowindow: null },
{kind: 'torque', options: { user_name: 'test', table_name: 'test', tile_style: 'Map{ -torque-frame-count: 10;}#test { marker-width: 10; }'}, infowindow: null }
]
}, { layerIndex: 2 }, s).done(function(lyr) {
layer = lyr;
}).addTo(map)
var wait = 500;
if (!map.getContainer) wait = 2500;
setTimeout(function() {
expect(layer.options.cartodb_logo).toEqual(undefined);
if (map.getContainer) expect($(map.getContainer()).find('.cartodb-logo').length).toBe(1)
if (map.getDiv) expect($(map.getDiv()).find('.cartodb-logo').length).toBe(1)
done();
}, wait);
});
it("should create a named map", function(done) {
var layer;
cartodb.createLayer(map, {
type: 'namedmap',
user_name: 'dev',
options: {
named_map: {
name: 'testing',
params: {
color: 'red'
}
}
}
}).done(function(lyr) {
layer = lyr;
});
setTimeout(function() {
expect(layer).not.toEqual(undefined);
expect(layer.toJSON()).toEqual({ color: 'red' });
done();
}, 100);
});
it("should use access_token", function(done) {
cartodb.createLayer(map, {
type: 'namedmap',
user_name: 'dev',
options: {
named_map: {
name: 'testing',
params: {
color: 'red'
}
}
}
}, { https: true, auth_token: 'at_rambo' }).done(function(layer) {
spyOn(layer, 'createMap').and.returnValue({
layergroupid: 'test',
metadata: {
layers: []
}
})
layer.getTiles(function(tiles) {
expect(tiles.tiles[0].indexOf("auth_token=at_rambo")).not.toEqual(-1);
});
done();
});
});
it("should create a layer from the list of sublayers", function(done) {
var layer;
cartodb.createLayer(map, {
type: 'cartodb',
sublayers: [{
sql: 'select * from table',
cartocss: 'test',
interactivity: 'testi'
}]
}).done(function(lyr) {
layer = lyr;
});
setTimeout(function() {
expect(layer).not.toEqual(undefined);
expect(layer.toJSON()).toEqual({
version: '1.3.0',
stat_tag: 'API',
layers: [{
type: 'cartodb',
options: {
sql: 'select * from table',
cartocss: 'test',
cartocss_version: '2.1.0',
interactivity: ['testi']
}
}]
});
done();
}, 100);
});
it("should return a promise that responds to addTo", function(done) {
var layer;
cartodb.createLayer(map, {
type: 'cartodb',
sublayers: [{
sql: 'select * from table',
cartocss: 'test',
interactivity: 'testi'
}]
})
.addTo(map)
.done(function(lyr) {
layer = lyr;
});
setTimeout(function() {
expect(layer).not.toEqual(undefined);
if(map.overlayMapTypes) {
expect(layer).toBe(map.overlayMapTypes.getAt(0));
} else {
expect(layer).toBe(map._layers[L.stamp(layer)]);
}
done();
}, 100);
});
it("should have several 'addTo' with zIndex set", function(done) {
var layer0, layer1;
cartodb.createLayer(map, {
type: 'cartodb',
sublayers: [{
sql: 'select * from table',
cartocss: 'test',
interactivity: 'testi'
}]
})
.addTo(map,0)
.done(function(lyr) {
layer0 = lyr;
});
cartodb.createLayer(map, {
type: 'cartodb',
sublayers: [{
sql: 'select * from table2',
cartocss: 'test2',
interactivity: 'testii'
}]
})
.addTo(map,1)
.done(function(lyr) {
layer1 = lyr;
});
setTimeout(function() {
//Test only for Leaflet
if(map.overlayMapTypes === undefined) {
expect(layer0).not.toEqual(undefined);
expect(layer0.options.zIndex).toEqual(0);
expect(layer1).not.toEqual(undefined);
expect(layer1.options.zIndex).toEqual(1);
}
done();
}, 100);
});
});
}
});