From c1b65796f6023cf1456b601a49be3bf778032561 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Wed, 30 Nov 2022 11:57:27 -0500 Subject: [PATCH] Require PostGIS 3 and use ST_TileEnvelope (#497) * All tests and internal code now uses ST_TileEnvelope function * Remove `tile_bbox` * Rename test function sources for clarity - this will be needed in a subsequent PR to add other function tests --- README.md | 24 ++++++------ benches/sources.rs | 4 +- justfile | 9 ++++- src/config.rs | 11 +++--- src/pg/db.rs | 19 ++++----- src/pg/scripts/get_geom.sql | 2 +- src/pg/scripts/get_srid_bounds.sql | 2 +- src/pg/table_source.rs | 8 ++-- src/pg/utils.rs | 21 ++-------- tests/config.yaml | 8 ++-- tests/debug-maplibre.html | 4 +- tests/fixtures/TileBBox.sql | 39 ------------------- tests/fixtures/function_source.sql | 17 -------- .../fixtures/function_source_query_params.sql | 21 ---------- .../fixtures/functions/function_zxy_query.sql | 17 ++++++++ .../functions/function_zxy_query_test.sql | 21 ++++++++++ tests/fixtures/initdb.sh | 21 +++++----- .../fixtures/{ => tables}/points1_source.sql | 0 .../fixtures/{ => tables}/points2_source.sql | 0 .../{ => tables}/points3857_source.sql | 0 .../{ => tables}/points_empty_srid_source.sql | 0 tests/fixtures/{ => tables}/table_source.sql | 0 .../table_source_multiple_geom.sql | 0 tests/function_source_test.rs | 26 ++++++------- tests/server_test.rs | 20 +++++----- tests/test.sh | 22 ++++++----- tests/utils.rs | 14 +++---- 27 files changed, 140 insertions(+), 190 deletions(-) delete mode 100644 tests/fixtures/TileBBox.sql delete mode 100644 tests/fixtures/function_source.sql delete mode 100644 tests/fixtures/function_source_query_params.sql create mode 100644 tests/fixtures/functions/function_zxy_query.sql create mode 100644 tests/fixtures/functions/function_zxy_query_test.sql rename tests/fixtures/{ => tables}/points1_source.sql (100%) rename tests/fixtures/{ => tables}/points2_source.sql (100%) rename tests/fixtures/{ => tables}/points3857_source.sql (100%) rename tests/fixtures/{ => tables}/points_empty_srid_source.sql (100%) rename tests/fixtures/{ => tables}/table_source.sql (100%) rename tests/fixtures/{ => tables}/table_source_multiple_geom.sql (100%) diff --git a/README.md b/README.md index df9da701..18623068 100755 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ Martin is a [PostGIS](https://github.com/postgis/postgis) [vector tiles](https:/ ## Requirements -Martin requires PostGIS >= 2.4.0. +Martin requires PostGIS >= 3.0.0 ## Installation @@ -119,13 +119,13 @@ map.addLayer({ ```js map.addSource('rpc', { type: 'vector', - url: `http://localhost:3000/function_source` + url: `http://localhost:3000/function_zxy_query` }); map.addLayer({ id: 'points', type: 'circle', source: 'rpc', - 'source-layer': 'function_source', + 'source-layer': 'function_zxy_query', paint: { 'circle-color': 'blue' }, @@ -242,8 +242,8 @@ curl localhost:3000/catalog | jq ```yaml [ { - "id": "function_source", - "name": "public.function_source" + "id": "function_zxy_query", + "name": "public.function_zxy_query" }, { "id": "points1", @@ -320,20 +320,18 @@ Function Source is a database function which can be used to query [vector tiles] | y | integer | Tile y parameter | | query_params | json | Query string parameters | -**Hint**: You may want to use [TileBBox](https://github.com/mapbox/postgis-vt-util#tilebbox) function to generate bounding-box geometry of the area covered by a tile. - For example, if you have a table `table_source` in WGS84 (`4326` SRID), then you can use this function as a Function Source: ```sql, ignore -CREATE OR REPLACE FUNCTION function_source(z integer, x integer, y integer, query_params json) RETURNS bytea AS $$ +CREATE OR REPLACE FUNCTION function_zxy_query(z integer, x integer, y integer, query_params json) RETURNS bytea AS $$ DECLARE mvt bytea; BEGIN - SELECT INTO mvt ST_AsMVT(tile, 'function_source', 4096, 'geom') FROM ( + SELECT INTO mvt ST_AsMVT(tile, 'function_zxy_query', 4096, 'geom') FROM ( SELECT - ST_AsMVTGeom(ST_Transform(ST_CurveToLine(geom), 3857), TileBBox(z, x, y, 3857), 4096, 64, true) AS geom + ST_AsMVTGeom(ST_Transform(ST_CurveToLine(geom), 3857), ST_TileEnvelope(z, x, y), 4096, 64, true) AS geom FROM table_source - WHERE geom && TileBBox(z, x, y, 4326) + WHERE geom && ST_Transform(ST_TileEnvelope(z, x, y), 4326) ) as tile WHERE geom IS NOT NULL; RETURN mvt; @@ -350,7 +348,7 @@ curl \ --data-urlencode 'stringParam=value' \ --data-urlencode 'booleanParam=true' \ --data-urlencode 'objectParam={"answer" : 42}' \ - --get localhost:3000/function_source/0/0/0 + --get localhost:3000/function_zxy_query/0/0/0 ``` then `query_params` will be parsed as: @@ -520,7 +518,7 @@ function_sources: schema: public # Function name (required) - function: function_source + function: function_zxy_query # An integer specifying the minimum zoom level minzoom: 0 diff --git a/benches/sources.rs b/benches/sources.rs index 39a0fac4..5c7791de 100644 --- a/benches/sources.rs +++ b/benches/sources.rs @@ -82,12 +82,12 @@ fn main() {} // } // // async fn get_function_source() { -// let source = mock_function_source("public", "function_source"); +// let source = mock_function_source("public", "function_zxy_query"); // let _tilejson = source.get_tilejson(); // } // // async fn get_function_source_tile() { -// let source = mock_function_source("public", "function_source"); +// let source = mock_function_source("public", "function_zxy_query"); // let xyz = Xyz { z: 0, x: 0, y: 0 }; // // let _tile = source.get_tile(&xyz, &None).await.unwrap(); diff --git a/justfile b/justfile index 144bf5af..75cfd0a6 100644 --- a/justfile +++ b/justfile @@ -12,8 +12,12 @@ export CARGO_TERM_COLOR := "always" run *ARGS: start-db cargo run -- {{ARGS}} +# Run PSQL utility against the test database +psql *ARGS: start-db + psql {{ARGS}} {{DATABASE_URL}} + # Perform cargo clean to delete all build files -clean: clean-test +clean: clean-test stop cargo clean # Delete test output files @@ -48,7 +52,7 @@ test-unit: start-db test-int: start-db clean-test #!/usr/bin/env sh tests/test.sh - echo "** Skipping comparison with the expected values - not yet stable" + # echo "** Skipping comparison with the expected values - not yet stable" # if ( ! diff --brief --recursive --new-file tests/output tests/expected ); then # echo "** Expected output does not match actual output" # echo "** If this is expected, run 'just bless' to update expected output" @@ -70,5 +74,6 @@ docker-run *ARGS: docker run -it --rm --net host -e DATABASE_URL -v $PWD/tests:/tests martin {{ARGS}} # Do any git command, ensuring that the testing environment is set up. Accepts the same arguments as git. +[no-exit-message] git *ARGS: start-db git {{ARGS}} diff --git a/src/config.rs b/src/config.rs index 4ca7fcd7..ce36c1ff 100644 --- a/src/config.rs +++ b/src/config.rs @@ -75,6 +75,7 @@ mod tests { use crate::pg::config::{FunctionInfo, TableInfo}; use indoc::indoc; use std::collections::HashMap; + use tilejson::Bounds; #[test] fn parse_config() { @@ -106,9 +107,9 @@ mod tests { gid: int4 function_sources: - function_source: + function_zxy_query: schema: public - function: function_source + function: function_zxy_query minzoom: 0 maxzoom: 30 bounds: [-180.0, -90.0, 180.0, 90.0] @@ -152,13 +153,13 @@ mod tests { }, )]), function_sources: HashMap::from([( - "function_source".to_string(), + "function_zxy_query".to_string(), FunctionInfo { schema: "public".to_string(), - function: "function_source".to_string(), + function: "function_zxy_query".to_string(), minzoom: Some(0), maxzoom: Some(30), - bounds: Some([-180, -90, 180, 90].into()), + bounds: Some(Bounds::MAX), unrecognized: HashMap::new(), }, )]), diff --git a/src/pg/db.rs b/src/pg/db.rs index 0538ff2b..e5b756ba 100755 --- a/src/pg/db.rs +++ b/src/pg/db.rs @@ -27,7 +27,8 @@ pub type ConnectionManager = PostgresConnectionManager; pub type Pool = bb8::Pool; pub type Connection<'a> = PooledConnection<'a, ConnectionManager>; -const REQUIRED_POSTGIS_VERSION: &str = ">= 2.4.0"; +// We require ST_TileEnvelope that was added in PostGIS 3.0.0 +const REQUIRED_POSTGIS_VERSION: &str = ">= 3.0.0"; pub struct PgConfigurator { pool: Pool, @@ -121,9 +122,8 @@ impl PgConfigurator { let mut tables = TableInfoSources::new(); if self.discover_tables { info!("Automatically detecting table sources"); - for info in - get_table_sources(&self.pool, &self.table_sources, self.default_srid).await? - { + let srcs = get_table_sources(&self.pool, &self.table_sources, self.default_srid).await; + for info in srcs? { self.add_table_src(&mut sources, Some(&mut tables), info.table.clone(), info); } } @@ -153,10 +153,8 @@ impl PgConfigurator { info.geometry_type.as_deref().unwrap_or("null"), info.srid ); - sources.insert( - id.clone(), - Box::new(TableSource::new(id, info, self.pool.clone())), - ); + let source = TableSource::new(id.clone(), info, self.pool.clone()); + sources.insert(id, Box::new(source)); } pub async fn instantiate_functions(&self) -> Result<(Sources, FunctionInfoSources), io::Error> { @@ -235,9 +233,8 @@ pub async fn get_connection(pool: &Pool) -> io::Result> { } async fn select_postgis_version(pool: &Pool) -> io::Result { - let connection = get_connection(pool).await?; - - connection + get_connection(pool) + .await? .query_one(include_str!("scripts/get_postgis_version.sql"), &[]) .await .map(|row| row.get::<_, String>("postgis_version")) diff --git a/src/pg/scripts/get_geom.sql b/src/pg/scripts/get_geom.sql index b66a28b5..e080f99d 100644 --- a/src/pg/scripts/get_geom.sql +++ b/src/pg/scripts/get_geom.sql @@ -1,4 +1,4 @@ SELECT - ST_AsMVTGeom (ST_Transform (ST_CurveToLine("{geometry_column}"), 3857), {mercator_bounds}, {extent}, {buffer}, {clip_geom}) AS geom {properties} FROM {schema}."{table}", bounds + ST_AsMVTGeom (ST_Transform (ST_CurveToLine("{geometry_column}"), 3857), ST_TileEnvelope({z}, {x}, {y}), {extent}, {buffer}, {clip_geom}) AS geom {properties} FROM {schema}."{table}", bounds WHERE "{geometry_column}" && bounds.srid_{srid} diff --git a/src/pg/scripts/get_srid_bounds.sql b/src/pg/scripts/get_srid_bounds.sql index 223a32b0..0c69709a 100644 --- a/src/pg/scripts/get_srid_bounds.sql +++ b/src/pg/scripts/get_srid_bounds.sql @@ -1 +1 @@ -ST_Transform({mercator_bounds}, {srid}) AS srid_{srid} \ No newline at end of file +ST_Transform(ST_TileEnvelope({z}, {x}, {y}), {srid}) AS srid_{srid} diff --git a/src/pg/table_source.rs b/src/pg/table_source.rs index 57c26747..a3cc53dc 100644 --- a/src/pg/table_source.rs +++ b/src/pg/table_source.rs @@ -3,7 +3,7 @@ use crate::pg::db::get_connection; use crate::pg::db::Pool; use crate::pg::utils::{ creat_tilejson, get_bounds_cte, get_source_bounds, get_srid_bounds, io_error, is_valid_zoom, - json_to_hashmap, polygon_to_bbox, tile_bbox, + json_to_hashmap, polygon_to_bbox, }; use crate::source::{Source, Tile, UrlQuery, Xyz}; use async_trait::async_trait; @@ -43,8 +43,6 @@ impl TableSource { } pub fn get_geom_query(&self, xyz: &Xyz) -> String { - let mercator_bounds = tile_bbox(xyz); - let info = &self.info; let properties = if info.properties.is_empty() { String::new() @@ -65,7 +63,9 @@ impl TableSource { table = info.table, srid = info.srid, geometry_column = info.geometry_column, - mercator_bounds = mercator_bounds, + z = xyz.z, + x = xyz.x, + y = xyz.y, extent = info.extent.unwrap_or(DEFAULT_EXTENT), buffer = info.buffer.unwrap_or(DEFAULT_BUFFER), clip_geom = info.clip_geom.unwrap_or(DEFAULT_CLIP_GEOM), diff --git a/src/pg/utils.rs b/src/pg/utils.rs index 401db707..fd9d1f44 100755 --- a/src/pg/utils.rs +++ b/src/pg/utils.rs @@ -18,23 +18,6 @@ macro_rules! io_error { pub(crate) use io_error; -// https://github.com/mapbox/postgis-vt-util/blob/master/src/TileBBox.sql -pub fn tile_bbox(xyz: &Xyz) -> String { - let x = xyz.x; - let y = xyz.y; - let z = xyz.z; - - let max = 20_037_508.34; - let res = (max * 2.0) / f64::from(2_i32.pow(z as u32)); - - let x_min = -max + (f64::from(x) * res); - let y_min = max - (f64::from(y) * res); - let x_max = -max + (f64::from(x) * res) + res; - let y_max = max - (f64::from(y) * res) - res; - - format!("ST_MakeEnvelope({x_min}, {y_min}, {x_max}, {y_max}, 3857)") -} - pub fn json_to_hashmap(value: &serde_json::Value) -> HashMap { let mut hashmap = HashMap::new(); @@ -69,8 +52,10 @@ pub fn get_bounds_cte(srid_bounds: &str) -> String { pub fn get_srid_bounds(srid: u32, xyz: &Xyz) -> String { format!( include_str!("scripts/get_srid_bounds.sql"), + z = xyz.z, + x = xyz.x, + y = xyz.y, srid = srid, - mercator_bounds = tile_bbox(xyz), ) } diff --git a/tests/config.yaml b/tests/config.yaml index 4b54b47d..4cca611f 100644 --- a/tests/config.yaml +++ b/tests/config.yaml @@ -116,12 +116,12 @@ table_sources: # Associative arrays of function sources function_sources: - function_source: + function_zxy_query: # Schema name (required) schema: public # Function name (required) - function: function_source + function: function_zxy_query # An integer specifying the minimum zoom level minzoom: 0 @@ -135,9 +135,9 @@ function_sources: # Values may be integers or floating point numbers. bounds: [-180.0, -90.0, 180.0, 90.0] - function_source_query_params: + function_zxy_query_test: schema: public - function: function_source_query_params + function: function_zxy_query_test minzoom: 0 maxzoom: 30 bounds: [-180.0, -90.0, 180.0, 90.0] diff --git a/tests/debug-maplibre.html b/tests/debug-maplibre.html index 89be277a..ff3bc7aa 100644 --- a/tests/debug-maplibre.html +++ b/tests/debug-maplibre.html @@ -37,14 +37,14 @@ map.on('load', function () { map.addSource('rpc', { type: 'vector', - url: `http://localhost:3000/function_source` + url: `http://localhost:3000/function_zxy_query` }); map.addLayer({ id: 'points', type: 'circle', source: 'rpc', - 'source-layer': 'function_source', + 'source-layer': 'function_zxy_query', paint: { 'circle-color': 'blue' } diff --git a/tests/fixtures/TileBBox.sql b/tests/fixtures/TileBBox.sql deleted file mode 100644 index 587b0316..00000000 --- a/tests/fixtures/TileBBox.sql +++ /dev/null @@ -1,39 +0,0 @@ -/****************************************************************************** -### TileBBox ### - -Given a Web Mercator tile ID as (z, x, y), returns a bounding-box -geometry of the area covered by that tile. - -__Parameters:__ - -- `integer` z - A tile zoom level. -- `integer` x - A tile x-position. -- `integer` y - A tile y-position. -- `integer` srid - SRID of the desired target projection of the bounding - box. Defaults to 3857 (Web Mercator). - -__Returns:__ `geometry(polygon)` -******************************************************************************/ -create or replace function TileBBox(z int, x int, y int, srid int = 3857) - returns geometry - language plpgsql immutable as -$func$ -declare - max numeric := 20037508.34; - res numeric := (max*2)/(2^z); - bbox geometry; -begin - bbox := ST_MakeEnvelope( - -max + (x * res), - max - (y * res), - -max + (x * res) + res, - max - (y * res) - res, - 3857 - ); - if srid = 3857 then - return bbox; - else - return ST_Transform(bbox, srid); - end if; -end; -$func$; diff --git a/tests/fixtures/function_source.sql b/tests/fixtures/function_source.sql deleted file mode 100644 index f55d725f..00000000 --- a/tests/fixtures/function_source.sql +++ /dev/null @@ -1,17 +0,0 @@ -DROP FUNCTION IF EXISTS public.function_source; -CREATE OR REPLACE FUNCTION public.function_source(z integer, x integer, y integer, query_params json) RETURNS bytea AS $$ -DECLARE - mvt bytea; -BEGIN - RAISE NOTICE 'query_params: %', query_params; - - SELECT INTO mvt ST_AsMVT(tile, 'public.function_source', 4096, 'geom') FROM ( - SELECT - ST_AsMVTGeom(ST_Transform(ST_CurveToLine(geom), 3857), TileBBox(z, x, y, 3857), 4096, 64, true) AS geom - FROM public.table_source - WHERE geom && TileBBox(z, x, y, 4326) - ) as tile WHERE geom IS NOT NULL; - - RETURN mvt; -END -$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE; \ No newline at end of file diff --git a/tests/fixtures/function_source_query_params.sql b/tests/fixtures/function_source_query_params.sql deleted file mode 100644 index 844028f5..00000000 --- a/tests/fixtures/function_source_query_params.sql +++ /dev/null @@ -1,21 +0,0 @@ -DROP FUNCTION IF EXISTS public.function_source_query_params; -CREATE OR REPLACE FUNCTION public.function_source_query_params(z integer, x integer, y integer, query_params json) RETURNS bytea AS $$ -DECLARE - mvt bytea; -BEGIN - RAISE DEBUG 'query_params: %', query_params; - - IF (query_params->>'token')::varchar IS NULL THEN - RAISE EXCEPTION 'the `token` json parameter does not exist in `query_params`'; - END IF; - - SELECT INTO mvt ST_AsMVT(tile, 'public.function_source_query_params', 4096, 'geom') FROM ( - SELECT - ST_AsMVTGeom(ST_Transform(ST_CurveToLine(geom), 3857), TileBBox(z, x, y, 3857), 4096, 64, true) AS geom - FROM public.table_source - WHERE geom && TileBBox(z, x, y, 4326) - ) as tile WHERE geom IS NOT NULL; - - RETURN mvt; -END -$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE; \ No newline at end of file diff --git a/tests/fixtures/functions/function_zxy_query.sql b/tests/fixtures/functions/function_zxy_query.sql new file mode 100644 index 00000000..70bab5e7 --- /dev/null +++ b/tests/fixtures/functions/function_zxy_query.sql @@ -0,0 +1,17 @@ +DROP FUNCTION IF EXISTS public.function_zxy_query; +CREATE OR REPLACE FUNCTION public.function_zxy_query(z integer, x integer, y integer, query_params json) RETURNS bytea AS $$ +DECLARE + mvt bytea; +BEGIN + RAISE NOTICE 'query_params: %', query_params; + + SELECT INTO mvt ST_AsMVT(tile, 'public.function_zxy_query', 4096, 'geom') FROM ( + SELECT + ST_AsMVTGeom(ST_Transform(ST_CurveToLine(geom), 3857), ST_TileEnvelope(z, x, y), 4096, 64, true) AS geom + FROM public.table_source + WHERE geom && ST_Transform(ST_TileEnvelope(z, x, y), 4326) + ) as tile WHERE geom IS NOT NULL; + + RETURN mvt; +END +$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE; diff --git a/tests/fixtures/functions/function_zxy_query_test.sql b/tests/fixtures/functions/function_zxy_query_test.sql new file mode 100644 index 00000000..7abe379e --- /dev/null +++ b/tests/fixtures/functions/function_zxy_query_test.sql @@ -0,0 +1,21 @@ +DROP FUNCTION IF EXISTS public.function_zxy_query_test; +CREATE OR REPLACE FUNCTION public.function_zxy_query_test(z integer, x integer, y integer, query_params json) RETURNS bytea AS $$ +DECLARE + mvt bytea; +BEGIN + RAISE DEBUG 'query_params: %', query_params; + + IF (query_params->>'token')::varchar IS NULL THEN + RAISE EXCEPTION 'the `token` json parameter does not exist in `query_params`'; + END IF; + + SELECT INTO mvt ST_AsMVT(tile, 'public.function_zxy_query_test', 4096, 'geom') FROM ( + SELECT + ST_AsMVTGeom(ST_Transform(ST_CurveToLine(geom), 3857), ST_TileEnvelope(z, x, y), 4096, 64, true) AS geom + FROM public.table_source + WHERE geom && ST_Transform(ST_TileEnvelope(z, x, y), 4326) + ) as tile WHERE geom IS NOT NULL; + + RETURN mvt; +END +$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE; diff --git a/tests/fixtures/initdb.sh b/tests/fixtures/initdb.sh index ccf88332..86e2702b 100755 --- a/tests/fixtures/initdb.sh +++ b/tests/fixtures/initdb.sh @@ -2,7 +2,7 @@ set -euo pipefail FIXTURES_DIR="$(dirname "$0")" -echo "Loading Martin test fixtures into '$PGDATABASE' as user '$PGUSER' from '$FIXTURES_DIR'" +echo "Loading Martin test fixtures into '$PGDATABASE' as user '$PGUSER'" psql -P pager=off -v ON_ERROR_STOP=1 -c "CREATE EXTENSION IF NOT EXISTS postgis;" @@ -11,12 +11,13 @@ psql -P pager=off -v ON_ERROR_STOP=1 -c "DROP SCHEMA IF EXISTS tiger CASCADE;" psql -P pager=off -v ON_ERROR_STOP=1 -t -c "select version();" psql -P pager=off -v ON_ERROR_STOP=1 -t -c "select PostGIS_Full_Version();" -psql -e -P pager=off -v ON_ERROR_STOP=1 -f $FIXTURES_DIR/TileBBox.sql -psql -e -P pager=off -v ON_ERROR_STOP=1 -f $FIXTURES_DIR/table_source.sql -psql -e -P pager=off -v ON_ERROR_STOP=1 -f $FIXTURES_DIR/table_source_multiple_geom.sql -psql -e -P pager=off -v ON_ERROR_STOP=1 -f $FIXTURES_DIR/function_source.sql -psql -e -P pager=off -v ON_ERROR_STOP=1 -f $FIXTURES_DIR/function_source_query_params.sql -psql -e -P pager=off -v ON_ERROR_STOP=1 -f $FIXTURES_DIR/points1_source.sql -psql -e -P pager=off -v ON_ERROR_STOP=1 -f $FIXTURES_DIR/points2_source.sql -psql -e -P pager=off -v ON_ERROR_STOP=1 -f $FIXTURES_DIR/points3857_source.sql -psql -e -P pager=off -v ON_ERROR_STOP=1 -f $FIXTURES_DIR/points_empty_srid_source.sql + +echo "Importing tables from $FIXTURES_DIR/tables" +for sql_file in "$FIXTURES_DIR"/tables/*.sql; do + psql -e -P pager=off -v ON_ERROR_STOP=1 -f "$sql_file" +done + +echo "Importing functions from $FIXTURES_DIR/functions" +for sql_file in "$FIXTURES_DIR"/functions/*.sql; do + psql -e -P pager=off -v ON_ERROR_STOP=1 -f "$sql_file" +done diff --git a/tests/fixtures/points1_source.sql b/tests/fixtures/tables/points1_source.sql similarity index 100% rename from tests/fixtures/points1_source.sql rename to tests/fixtures/tables/points1_source.sql diff --git a/tests/fixtures/points2_source.sql b/tests/fixtures/tables/points2_source.sql similarity index 100% rename from tests/fixtures/points2_source.sql rename to tests/fixtures/tables/points2_source.sql diff --git a/tests/fixtures/points3857_source.sql b/tests/fixtures/tables/points3857_source.sql similarity index 100% rename from tests/fixtures/points3857_source.sql rename to tests/fixtures/tables/points3857_source.sql diff --git a/tests/fixtures/points_empty_srid_source.sql b/tests/fixtures/tables/points_empty_srid_source.sql similarity index 100% rename from tests/fixtures/points_empty_srid_source.sql rename to tests/fixtures/tables/points_empty_srid_source.sql diff --git a/tests/fixtures/table_source.sql b/tests/fixtures/tables/table_source.sql similarity index 100% rename from tests/fixtures/table_source.sql rename to tests/fixtures/tables/table_source.sql diff --git a/tests/fixtures/table_source_multiple_geom.sql b/tests/fixtures/tables/table_source_multiple_geom.sql similarity index 100% rename from tests/fixtures/table_source_multiple_geom.sql rename to tests/fixtures/tables/table_source_multiple_geom.sql diff --git a/tests/function_source_test.rs b/tests/function_source_test.rs index 8bb16299..a44e40ab 100644 --- a/tests/function_source_test.rs +++ b/tests/function_source_test.rs @@ -16,33 +16,33 @@ fn init() { #[actix_rt::test] async fn get_function_sources() { let pool = mock_pool().await; - let function_sources = get_sources(&pool, &FunctionInfoSources::default()) + let sources = get_sources(&pool, &FunctionInfoSources::default()) .await .unwrap(); - info!("function_sources = {function_sources:#?}"); + info!("sources = {sources:#?}"); - assert!(!function_sources.is_empty()); - let function_source = single(&function_sources, |v| v.function == "function_source") - .expect("function_source not found"); - assert_eq!(function_source.schema, "public"); - assert_eq!(function_source.function, "function_source"); - assert_eq!(function_source.minzoom, None); - assert_eq!(function_source.maxzoom, None); - assert_eq!(function_source.bounds, None); + assert!(!sources.is_empty()); + let source = single(&sources, |v| v.function == "function_zxy_query") + .expect("function_zxy_query not found"); + assert_eq!(source.schema, "public"); + assert_eq!(source.function, "function_zxy_query"); + assert_eq!(source.minzoom, None); + assert_eq!(source.maxzoom, None); + assert_eq!(source.bounds, None); } #[actix_rt::test] async fn function_source_tilejson() { let sources = mock_sources(None, None).await; - let source = sources.get("function_source").unwrap(); + let source = sources.get("function_zxy_query").unwrap(); let tilejson = source.get_tilejson(); info!("tilejson = {tilejson:#?}"); assert_eq!(tilejson.tilejson, "2.2.0"); assert_eq!(tilejson.version, Some("1.0.0".to_owned())); - assert_eq!(tilejson.name, Some("public.function_source".to_owned())); + assert_eq!(tilejson.name, Some("public.function_zxy_query".to_owned())); assert_eq!(tilejson.scheme, Some("xyz".to_owned())); assert_eq!(tilejson.minzoom, Some(0)); assert_eq!(tilejson.maxzoom, Some(30)); @@ -53,7 +53,7 @@ async fn function_source_tilejson() { #[actix_rt::test] async fn function_source_tile() { let sources = mock_sources(None, None).await; - let source = sources.get("function_source").unwrap(); + let source = sources.get("function_zxy_query").unwrap(); let tile = source .get_tile(&Xyz { x: 0, y: 0, z: 0 }, &None) .await diff --git a/tests/server_test.rs b/tests/server_test.rs index 1655748b..9e90f328 100644 --- a/tests/server_test.rs +++ b/tests/server_test.rs @@ -56,7 +56,7 @@ async fn get_function_catalog_ok() { let body = read_body(response).await; let sources: Vec = serde_json::from_slice(&body).unwrap(); - let expected = "function_source"; + let expected = "function_zxy_query"; assert_eq!(sources.into_iter().filter(|v| v.id == expected).count(), 1); } @@ -362,18 +362,18 @@ async fn get_function_source_ok() { let response = call_service(&app, req).await; assert_eq!(response.status(), StatusCode::NOT_FOUND); - let req = test_get("/function_source"); + let req = test_get("/function_zxy_query"); let response = call_service(&app, req).await; assert!(response.status().is_success()); let req = TestRequest::get() - .uri("/function_source?token=martin") - .insert_header(("x-rewrite-url", "/tiles/function_source?token=martin")) + .uri("/function_zxy_query?token=martin") + .insert_header(("x-rewrite-url", "/tiles/function_zxy_query?token=martin")) .to_request(); let result: TileJSON = call_and_read_body_json(&app, req).await; assert_eq!( result.tiles, - &["http://localhost:8080/tiles/function_source/{z}/{x}/{y}?token=martin"] + &["http://localhost:8080/tiles/function_zxy_query/{z}/{x}/{y}?token=martin"] ); } @@ -381,7 +381,7 @@ async fn get_function_source_ok() { async fn get_function_source_tile_ok() { let app = create_app!(mock_default_function_sources()); - let req = test_get("/function_source/0/0/0"); + let req = test_get("/function_zxy_query/0/0/0"); let response = call_service(&app, req).await; assert!(response.status().is_success()); } @@ -390,7 +390,7 @@ async fn get_function_source_tile_ok() { async fn get_function_source_tile_minmax_zoom_ok() { let function_source1 = FunctionInfo { schema: "public".to_owned(), - function: "function_source".to_owned(), + function: "function_zxy_query".to_owned(), minzoom: None, maxzoom: None, bounds: Some(Bounds::MAX), @@ -399,7 +399,7 @@ async fn get_function_source_tile_minmax_zoom_ok() { let function_source2 = FunctionInfo { schema: "public".to_owned(), - function: "function_source".to_owned(), + function: "function_zxy_query".to_owned(), minzoom: Some(6), maxzoom: Some(12), bounds: Some(Bounds::MAX), @@ -457,12 +457,12 @@ async fn get_function_source_tile_minmax_zoom_ok() { async fn get_function_source_query_params_ok() { let app = create_app!(mock_default_function_sources()); - let req = test_get("/function_source_query_params/0/0/0"); + let req = test_get("/function_zxy_query_test/0/0/0"); let response = call_service(&app, req).await; println!("response.status = {:?}", response.status()); assert!(response.status().is_server_error()); - let req = test_get("/function_source_query_params/0/0/0?token=martin"); + let req = test_get("/function_zxy_query_test/0/0/0?token=martin"); let response = call_service(&app, req).await; assert!(response.status().is_success()); } diff --git a/tests/test.sh b/tests/test.sh index a8db0801..7b8985c8 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -109,14 +109,14 @@ test_pbf cmp_20_633856_327787 http://localhost:3000/table_source,points1,point test_pbf cmp_21_1267712_655574 http://localhost:3000/table_source,points1,points2/21/1267712/655574 >&2 echo "Test server response for function source" -test_pbf fnc_0_0_0 http://localhost:3000/function_source/0/0/0 -test_pbf fnc_6_38_20 http://localhost:3000/function_source/6/38/20 -test_pbf fnc_12_2476_1280 http://localhost:3000/function_source/12/2476/1280 -test_pbf fnc_13_4952_2560 http://localhost:3000/function_source/13/4952/2560 -test_pbf fnc_14_9904_5121 http://localhost:3000/function_source/14/9904/5121 -test_pbf fnc_20_633856_327787 http://localhost:3000/function_source/20/633856/327787 -test_pbf fnc_21_1267712_655574 http://localhost:3000/function_source/21/1267712/655574 -test_pbf fnc_0_0_0_token http://localhost:3000/function_source_query_params/0/0/0?token=martin +test_pbf fnc_0_0_0 http://localhost:3000/function_zxy_query/0/0/0 +test_pbf fnc_6_38_20 http://localhost:3000/function_zxy_query/6/38/20 +test_pbf fnc_12_2476_1280 http://localhost:3000/function_zxy_query/12/2476/1280 +test_pbf fnc_13_4952_2560 http://localhost:3000/function_zxy_query/13/4952/2560 +test_pbf fnc_14_9904_5121 http://localhost:3000/function_zxy_query/14/9904/5121 +test_pbf fnc_20_633856_327787 http://localhost:3000/function_zxy_query/20/633856/327787 +test_pbf fnc_21_1267712_655574 http://localhost:3000/function_zxy_query/21/1267712/655574 +test_pbf fnc_0_0_0_token http://localhost:3000/function_zxy_query_test/0/0/0?token=martin >&2 echo "Test server response for table source with different SRID" test_pbf points3857_srid_0_0_0 http://localhost:3000/points3857/0/0/0 @@ -145,7 +145,9 @@ $CURL http://localhost:3000/catalog | jq --sort-keys -e | tee "$TEST_OUT_DIR/cat test_pbf tbl_0_0_0 http://localhost:3000/table_source/0/0/0 test_pbf cmp_0_0_0 http://localhost:3000/points1,points2/0/0/0 -test_pbf fnc_0_0_0 http://localhost:3000/function_source/0/0/0 -test_pbf fnc2_0_0_0 http://localhost:3000/function_source_query_params/0/0/0?token=martin +test_pbf fnc_0_0_0 http://localhost:3000/function_zxy_query/0/0/0 +test_pbf fnc2_0_0_0 http://localhost:3000/function_zxy_query_test/0/0/0?token=martin kill_process $PROCESS_ID + +>&2 echo "All integration tests have passed" diff --git a/tests/utils.rs b/tests/utils.rs index fb094617..79ffb93b 100644 --- a/tests/utils.rs +++ b/tests/utils.rs @@ -173,26 +173,26 @@ pub async fn mock_default_table_sources() -> Sources { #[allow(dead_code)] pub async fn mock_default_function_sources() -> Sources { - let function_source = FunctionInfo { + let function_zxy_query = FunctionInfo { schema: "public".to_owned(), - function: "function_source".to_owned(), + function: "function_zxy_query".to_owned(), minzoom: Some(0), maxzoom: Some(30), bounds: Some(Bounds::MAX), unrecognized: HashMap::new(), }; - let function_source_query_params = FunctionInfo { + let function_zxy_query_test = FunctionInfo { schema: "public".to_owned(), - function: "function_source_query_params".to_owned(), + function: "function_zxy_query_test".to_owned(), unrecognized: HashMap::new(), - ..function_source + ..function_zxy_query }; mock_sources( Some(&[ - ("function_source", function_source), - ("function_source_query_params", function_source_query_params), + ("function_zxy_query", function_zxy_query), + ("function_zxy_query_test", function_zxy_query_test), ]), None, )