From 738138b205f7dc95f5b1a73184f77a2e533c303f Mon Sep 17 00:00:00 2001 From: Rafa de la Torre Date: Tue, 10 Nov 2015 19:27:05 +0100 Subject: [PATCH] Move admin0 server functions around - move files to its right place - add some boilerplate for test setup - add tests --- server/extension/expected/00_install_test.out | 15 ++++++++++++ server/extension/expected/30_admin0_test.out | 24 +++++++++++++++++++ ...20_geocoding.sql => 20_geocode_street.sql} | 0 .../{10_admin0.sql => 0.0.1/30_admin0.sql} | 9 +++---- server/extension/sql/00_install_test.sql | 11 +++++++++ server/extension/sql/30_admin0_test.sql | 17 +++++++++++++ 6 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 server/extension/expected/30_admin0_test.out rename server/extension/sql/0.0.1/{20_geocoding.sql => 20_geocode_street.sql} (100%) rename server/extension/sql/{10_admin0.sql => 0.0.1/30_admin0.sql} (84%) create mode 100644 server/extension/sql/30_admin0_test.sql diff --git a/server/extension/expected/00_install_test.out b/server/extension/expected/00_install_test.out index b5b8268..6098385 100644 --- a/server/extension/expected/00_install_test.out +++ b/server/extension/expected/00_install_test.out @@ -6,3 +6,18 @@ CREATE EXTENSION cartodb; CREATE EXTENSION cdb_geocoder; -- Install the extension CREATE EXTENSION cdb_geocoder_server; +-- Mock the varnish invalidation function +-- (used by cdb_geocoder tests) +CREATE OR REPLACE FUNCTION public.cdb_invalidate_varnish(table_name text) RETURNS void AS $$ +BEGIN + RETURN; +END +$$ +LANGUAGE plpgsql; +-- Set user quota +SELECT cartodb.CDB_SetUserQuotaInBytes(0); + cdb_setuserquotainbytes +------------------------- + 0 +(1 row) + diff --git a/server/extension/expected/30_admin0_test.out b/server/extension/expected/30_admin0_test.out new file mode 100644 index 0000000..12ba5b6 --- /dev/null +++ b/server/extension/expected/30_admin0_test.out @@ -0,0 +1,24 @@ +-- Check that the public function is callable, even with no data +-- It should return NULL +SELECT cdb_geocoder_server.geocode_admin0_polygons(session_user, txid_current(), 'Spain'); + geocode_admin0_polygons +------------------------- + +(1 row) + +-- Insert some dummy synonym +INSERT INTO admin0_synonyms (name, adm0_a3) VALUES ('Spain', 'ESP'); +-- Insert some dummy geometry to return +INSERT INTO ne_admin0_v3 (adm0_a3, the_geom) VALUES('ESP', ST_GeomFromText( + 'POLYGON((-71.1031880899493 42.3152774590236, + -71.1031627617667 42.3152960829043, + -71.102923838298 42.3149156848307, + -71.1031880899493 42.3152774590236))',4326) +); +-- This should return the polygon inserted above +SELECT cdb_geocoder_server.geocode_admin0_polygons(session_user, txid_current(), 'Spain'); + geocode_admin0_polygons +-------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 0103000020E61000000100000004000000D0EA37A29AC651C00FD603035B284540FEFCFB379AC651C0C0503E9F5B284540FFDDDD4D96C651C033AC3B284F284540D0EA37A29AC651C00FD603035B284540 +(1 row) + diff --git a/server/extension/sql/0.0.1/20_geocoding.sql b/server/extension/sql/0.0.1/20_geocode_street.sql similarity index 100% rename from server/extension/sql/0.0.1/20_geocoding.sql rename to server/extension/sql/0.0.1/20_geocode_street.sql diff --git a/server/extension/sql/10_admin0.sql b/server/extension/sql/0.0.1/30_admin0.sql similarity index 84% rename from server/extension/sql/10_admin0.sql rename to server/extension/sql/0.0.1/30_admin0.sql index f050f52..1c43db2 100644 --- a/server/extension/sql/10_admin0.sql +++ b/server/extension/sql/0.0.1/30_admin0.sql @@ -3,18 +3,18 @@ CREATE OR REPLACE FUNCTION geocode_admin0_polygons(user_id name, tx_id bigint, country_name text) RETURNS Geometry AS $$ plpy.debug('Entering geocode_admin0_polygons') - plpy.debug('user_name = %s' % user_name) + plpy.debug('user_id = %s' % user_id) #-- Access control #-- TODO: this should be part of cdb python library - if user_name == 'publicuser': + if user_id == 'publicuser': plpy.error('The api_key must be provided') #--TODO: rate limiting check #--TODO: quota check #-- Copied from the doc, see http://www.postgresql.org/docs/9.4/static/plpython-database.html - plan = plpy.prepare("SELECT _geocode_admin0_polygons($1) AS mypolygon", ["text"]) + plan = plpy.prepare("SELECT cdb_geocoder_server._geocode_admin0_polygons($1) AS mypolygon", ["text"]) rv = plpy.execute(plan, [country_name], 1) plpy.debug('Returning from Returning from geocode_admin0_polygons') @@ -25,7 +25,7 @@ $$ LANGUAGE plpythonu; -------------------------------------------------------------------------------- -- Implementation of the server extension - +-- Note: these functions depend on the cdb_geocoder extension CREATE OR REPLACE FUNCTION _geocode_admin0_polygons(country_name text) RETURNS Geometry AS $$ DECLARE @@ -36,6 +36,7 @@ RETURNS Geometry AS $$ FROM (SELECT country_name q) g) d LEFT OUTER JOIN admin0_synonyms s ON name_ = d.x LEFT OUTER JOIN ne_admin0_v3 n ON s.adm0_a3 = n.adm0_a3 GROUP BY d.q, n.the_geom, s.adm0_a3; + RETURN ret; END $$ LANGUAGE plpgsql; diff --git a/server/extension/sql/00_install_test.sql b/server/extension/sql/00_install_test.sql index 33f8454..78c2da6 100644 --- a/server/extension/sql/00_install_test.sql +++ b/server/extension/sql/00_install_test.sql @@ -8,3 +8,14 @@ CREATE EXTENSION cdb_geocoder; -- Install the extension CREATE EXTENSION cdb_geocoder_server; +-- Mock the varnish invalidation function +-- (used by cdb_geocoder tests) +CREATE OR REPLACE FUNCTION public.cdb_invalidate_varnish(table_name text) RETURNS void AS $$ +BEGIN + RETURN; +END +$$ +LANGUAGE plpgsql; + +-- Set user quota +SELECT cartodb.CDB_SetUserQuotaInBytes(0); diff --git a/server/extension/sql/30_admin0_test.sql b/server/extension/sql/30_admin0_test.sql new file mode 100644 index 0000000..60428e9 --- /dev/null +++ b/server/extension/sql/30_admin0_test.sql @@ -0,0 +1,17 @@ +-- Check that the public function is callable, even with no data +-- It should return NULL +SELECT cdb_geocoder_server.geocode_admin0_polygons(session_user, txid_current(), 'Spain'); + +-- Insert some dummy synonym +INSERT INTO admin0_synonyms (name, adm0_a3) VALUES ('Spain', 'ESP'); + +-- Insert some dummy geometry to return +INSERT INTO ne_admin0_v3 (adm0_a3, the_geom) VALUES('ESP', ST_GeomFromText( + 'POLYGON((-71.1031880899493 42.3152774590236, + -71.1031627617667 42.3152960829043, + -71.102923838298 42.3149156848307, + -71.1031880899493 42.3152774590236))',4326) +); + +-- This should return the polygon inserted above +SELECT cdb_geocoder_server.geocode_admin0_polygons(session_user, txid_current(), 'Spain');