Skip to content

Commit 28c2fbd

Browse files
author
Rafa de la Torre
committed
Add test for token replacement in postgis queries
1 parent 90ef94a commit 28c2fbd

File tree

3 files changed

+115
-0
lines changed

3 files changed

+115
-0
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CREATE TABLE test(gid serial PRIMARY KEY, geom geometry, colbigint bigint, col_text text, "col-char" char, "col+bool" boolean, "colnumeric" numeric, "colsmallint" smallint, "colfloat4" real, "colfloat8" double precision, "colcharacter" character);
2+
INSERT INTO test VALUES (DEFAULT, GeomFromEWKT('SRID=4326;POINT(0 0)'), -9223372036854775808, 'I am a point', 'A', TRUE, 1234567809990001, 0, 0.0, 0.0, 'A');
3+
INSERT INTO test VALUES (DEFAULT, GeomFromEWKT('SRID=4326;POINT(-2 2)'), 9223372036854775807, 'I, too, am a point!', 'B', FALSE, -123456780999001, 0, 0.0, 0.0, 'A');
4+
INSERT INTO test VALUES (DEFAULT, GeomFromEWKT('SRID=4326;MULTIPOINT(2 1,1 2)'), -1, 'I`m even a MULTI Point', 'Z', FALSE, 12345678099901, 0, 0.0, 0.0, 'A');
5+
INSERT INTO test VALUES (DEFAULT, GeomFromEWKT('SRID=4326;LINESTRING(0 0,1 1,1 2)'), 0, 'This is a line string', 'ß', FALSE, -9, 0, 0.0, 0.0, 'A');
6+
INSERT INTO test VALUES (DEFAULT, GeomFromEWKT('SRID=4326;MULTILINESTRING((1 0,0 1,3 2),(3 2,5 4))'), 1, 'multi line string', 'Ü', TRUE, 0.00001, 0, 0.0, 0.0, 'A');
7+
INSERT INTO test VALUES (DEFAULT, GeomFromEWKT('SRID=4326;POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))'), 1, 'polygon', 'Ü', TRUE, 0.00001, 0, 0.0, 0.0, 'A');
8+
INSERT INTO test VALUES (DEFAULT, GeomFromEWKT('SRID=4326;MULTIPOLYGON(((1 1,3 1,3 3,1 3,1 1),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))'), 5432, 'multi ploygon', 'X', TRUE, 999, 0, 0.0, 0.0, 'A');
9+
INSERT INTO test VALUES (DEFAULT, GeomFromEWKT('SRID=4326;GEOMETRYCOLLECTION(POLYGON((1 1, 2 1, 2 2, 1 2,1 1)),POINT(2 3),LINESTRING(2 3,3 4))'), 8080, 'GEOMETRYCOLLECTION', 'm', TRUE, 9999, 0, 0.0, 0.0, 'A');
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Map srs="+init=epsg:3857">
3+
<Layer name="field_shapes" status="on" srs="+init=epsg:4326">
4+
<Datasource>
5+
<Parameter name="type">postgis</Parameter>
6+
<Parameter name="host">localhost</Parameter>
7+
<Parameter name="dbname">node-mapnik-tmp-postgis-test-db</Parameter>
8+
<Parameter name="srid">4326</Parameter>
9+
<Parameter name="geometry_field">geom</Parameter>
10+
<Parameter name="table">
11+
(SELECT gid, geom FROM test WHERE gid = @fieldid) as field_shapes
12+
</Parameter>
13+
<Parameter name="estimate_extent">false</Parameter>
14+
<Parameter name="extent">-150,-85,150,85</Parameter>
15+
</Datasource>
16+
</Layer>
17+
</Map>

test/vector-tile.postgis.test.js

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
"use strict";
2+
3+
var mapnik = require('../');
4+
var assert = require('assert');
5+
var fs = require('fs');
6+
var path = require('path');
7+
var spawn = require('child_process').spawn;
8+
9+
var dbname = 'node-mapnik-tmp-postgis-test-db';
10+
11+
var postgis_registered = false;
12+
var hasPostgisAvailable = false;
13+
14+
describe('mapnik.VectorTile postgis.input', function() {
15+
16+
before(function(done) {
17+
// Check that the postgis plugin is available
18+
mapnik.register_datasource(path.join(mapnik.settings.paths.input_plugins,'postgis.input'));
19+
postgis_registered = mapnik.datasources().indexOf('postgis') > -1;
20+
21+
if (postgis_registered) {
22+
// Check if postgres is available
23+
spawn('psql', ['--version'])
24+
.on('error', function(code, signal) {
25+
console.warn('psql --version could not be executed.');
26+
return done();
27+
})
28+
.on('exit', function(code, signal) {
29+
if (code !== 0) {
30+
console.warn('psql --version returned ' + code);
31+
return done();
32+
}
33+
// Drop the test database if it exists
34+
spawn('dropdb', ['--if-exists', dbname])
35+
.on('exit', function(code, signal) {
36+
if (code !== 0) {
37+
console.warn('dropdb --if-exists ' + dbname + ' returned ' + code);
38+
return done();
39+
}
40+
// Create the test database
41+
spawn('createdb', ['-T', 'template_postgis', dbname])
42+
.on('exit', function(code, signal) {
43+
if (code !== 0) {
44+
console.warn('createdb -T template_postgis ' + dbname + 'returned ' + code);
45+
return done();
46+
}
47+
hasPostgisAvailable = true;
48+
return done();
49+
});
50+
})
51+
});
52+
} else {
53+
console.warn('postgis input datasource not registered.');
54+
return done();
55+
}
56+
});
57+
58+
it('passes variables to replace tokens in query', function(done) {
59+
if (!hasPostgisAvailable) {
60+
this.skip('postgis not availabel');
61+
}
62+
63+
spawn('psql', ['-q', '-f', './test/data/postgis-create-db-and-tables.sql', dbname])
64+
.on('exit', function(code, signal) {
65+
assert.equal(code, 0, 'could not load data in postgis');
66+
var map = new mapnik.Map(256, 256);
67+
map.loadSync('./test/data/postgis_datasource_tokens_query.xml');
68+
69+
var opts = {};
70+
opts.variables = { "fieldid": 2 };
71+
map.render(new mapnik.VectorTile(0, 0, 0), opts, function(err, vtile) {
72+
if (err) throw err;
73+
//fs.writeFileSync('/tmp/tile.vector.pbf',vtile.getData());
74+
assert(!vtile.empty());
75+
var out = JSON.parse(vtile.toGeoJSON(0));
76+
assert.equal(out.type,'FeatureCollection');
77+
assert.equal(out.features.length,1);
78+
assert.equal(out.features[0].properties.gid, 2);
79+
var coords = out.features[0].geometry.coordinates;
80+
var expected_coords = [-2.0, 2.0]; // From DB, GeomFromEWKT('SRID=4326;POINT(-2 2)')
81+
assert.ok(Math.abs(coords[0] - expected_coords[0]) < 0.3);
82+
assert.ok(Math.abs(coords[1] - expected_coords[1]) < 0.3);
83+
done();
84+
});
85+
});
86+
87+
// TODO: develop reasonable assertion
88+
});
89+
});

0 commit comments

Comments
 (0)