Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -395,3 +395,20 @@ async def shutdown_event() -> None:

with TestClient(app) as client:
yield client


@pytest.fixture
def app_functions(database_url, monkeypatch):
"""Create APP with only custom functions."""
postgres_settings = PostgresSettings(database_url=database_url)
db_settings = DatabaseSettings(schemas=["badschema"], only_spatial_tables=False)
sql_settings = CustomSQLSettings(custom_sql_directory=SQL_FUNCTIONS_DIRECTORY)

app = create_tipg_app(
postgres_settings=postgres_settings,
db_settings=db_settings,
sql_settings=sql_settings,
)

with TestClient(app) as client:
yield client
10 changes: 10 additions & 0 deletions tests/routes/test_collections.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,16 @@ def test_collections(app):
assert "public.nongeo_data" in ids
assert "public.landsat" in ids

# Custom function
assert "pg_temp.landsat_centroids" in ids
assert "pg_temp.hexagons" in ids
assert "pg_temp.squares" in ids

# Public functions
assert "public.st_squaregrid" in ids
assert "public.st_hexagongrid" in ids
assert "public.st_subdivide" in ids

response = app.get("/?f=html")
assert response.status_code == 200
assert "text/html" in response.headers["content-type"]
Expand Down
41 changes: 0 additions & 41 deletions tests/routes/test_tiles.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,44 +217,3 @@ def test_stylejson(app):

response = app.get("/collections/public.landsat/style.json?geom-column=centroid")
assert response.status_code == 200


# def test_function_tilejson(app):
# """Test TileJSON endpoint."""
# response = app.get("/collections/squares/tilejson.json")
# assert response.status_code == 200
# resp_json = response.json()
# assert resp_json["name"] == "squares"
# assert resp_json["minzoom"] == 5
# assert resp_json["maxzoom"] == 12
# np.testing.assert_almost_equal(resp_json["bounds"], [-180.0, -90, 180.0, 90])

# response = app.get("/collections/squares/tilejson.json?minzoom=1&maxzoom=2")
# assert response.status_code == 200
# resp_json = response.json()
# assert resp_json["name"] == "squares"
# assert resp_json["minzoom"] == 1
# assert resp_json["maxzoom"] == 2

# response = app.get("/collections/squares/tilejson.json?minzoom=1&maxzoom=2&depth=4")
# assert response.status_code == 200
# resp_json = response.json()
# assert resp_json["name"] == "squares"
# assert resp_json["minzoom"] == 1
# assert resp_json["maxzoom"] == 2
# assert "?depth=4" in resp_json["tiles"][0]


# def test_function_tile(app):
# """request a tile."""
# name = squares
# response = app.get("/collections/{name}/tiles/0/0/0")
# assert response.status_code == 200
# decoded = mapbox_vector_tile.decode(response.content)
# assert name in decoded.keys()
# assert len(decoded[name]["features"]) == 4

# response = app.get("/collections/squares/tiles/0/0/0?depth=4")
# assert response.status_code == 200
# decoded = mapbox_vector_tile.decode(response.content)
# assert len(decoded[name]["features"]) == 16
162 changes: 162 additions & 0 deletions tests/test_sql_functions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
"""test custom SQL functions."""

import mapbox_vector_tile
import pytest

from tipg.errors import NoPrimaryKey


def test_collections_function(app_functions):
"""Test /collections endpoint."""
response = app_functions.get("/collections")
assert response.status_code == 200
assert response.headers["content-type"] == "application/json"
body = response.json()
assert [
"links",
"numberMatched",
"numberReturned",
"collections",
] == list(body)
ids = [x["id"] for x in body["collections"]]

# Custom function
assert "pg_temp.landsat_centroids" in ids
assert "pg_temp.hexagons" in ids
assert "pg_temp.squares" in ids

response = app_functions.get("/collections/pg_temp.landsat_centroids")
assert response.status_code == 200
assert response.headers["content-type"] == "application/json"
body = response.json()
assert body["id"] == "pg_temp.landsat_centroids"

response = app_functions.get("/collections/pg_temp.squares")
assert response.status_code == 200
assert response.headers["content-type"] == "application/json"
body = response.json()
assert body["id"] == "pg_temp.squares"
assert body["extent"]["spatial"]["bbox"][0] == [-180.0, -90.0, 180.0, 90.0]


def test_items_function(app_functions):
"""Test /items endpoint."""
response = app_functions.get("/collections/pg_temp.landsat_centroids/items")
assert response.status_code == 200
assert response.headers["content-type"] == "application/geo+json"
body = response.json()
assert body["id"] == "pg_temp.landsat_centroids"
assert body["features"][0]["geometry"]["type"] == "Point"
assert body["features"][0]["id"] == 1
assert body["features"][0]["properties"]["ogc_fid"] == 1
assert body["numberMatched"] == 16269
assert body["numberReturned"] == 10

response = app_functions.get("/collections/pg_temp.hexagons/items")
assert response.status_code == 200
assert response.headers["content-type"] == "application/geo+json"
body = response.json()
assert body["id"] == "pg_temp.hexagons"
assert body["features"][0]["geometry"]["type"] == "Polygon"
assert body["features"][0]["id"]
assert body["features"][0]["properties"]["i"]
assert body["features"][0]["properties"]["j"]
assert body["numberMatched"] == 287
assert body["numberReturned"] == 10

response = app_functions.get(
"/collections/pg_temp.hexagons/items",
params={
"size": 10,
"bounds": "POLYGON((-180 -90,-180 90,180 90,180 -90,-180 -90))",
},
)
assert response.status_code == 200
assert response.headers["content-type"] == "application/geo+json"
body = response.json()
assert body["id"] == "pg_temp.hexagons"
assert body["features"][0]["geometry"]["type"] == "Polygon"
assert body["features"][0]["id"]
assert body["features"][0]["properties"]["i"] == 0
assert body["features"][0]["properties"]["j"] == 0
assert body["numberMatched"] == 287
assert body["numberReturned"] == 10

response = app_functions.get("/collections/pg_temp.landsat_centroids/items/1")
assert response.status_code == 200
assert response.headers["content-type"] == "application/geo+json"
body = response.json()
assert body["id"] == 1
assert body["geometry"]["type"] == "Point"
assert body["properties"]["ogc_fid"] == 1

# No Primary key for functions
with pytest.raises(NoPrimaryKey):
app_functions.get("/collections/pg_temp.hexagons/items/1")


def test_tiles_functions(app_functions):
"""Test Tiles endpoint."""
response = app_functions.get("/collections/pg_temp.landsat_centroids/tilejson.json")
assert response.status_code == 200
body = response.json()
assert body["name"] == "pg_temp.landsat_centroids"
assert body["minzoom"] == 5
assert body["maxzoom"] == 12

response = app_functions.get("/collections/pg_temp.hexagons/tilejson.json")
assert response.status_code == 200
body = response.json()
assert body["name"] == "pg_temp.hexagons"
assert body["minzoom"] == 5
assert body["maxzoom"] == 12

response = app_functions.get(
"/collections/pg_temp.hexagons/tilejson.json?minzoom=1&maxzoom=2&size=4"
)
assert response.status_code == 200
body = response.json()
assert body["name"] == "pg_temp.hexagons"
assert body["minzoom"] == 1
assert body["maxzoom"] == 2
assert "?size=4" in body["tiles"][0]

# tilesets
response = app_functions.get("/collections/pg_temp.landsat_centroids/tiles")
assert response.status_code == 200
body = response.json()
assert body["tilesets"]

response = app_functions.get("/collections/pg_temp.hexagons/tiles")
assert response.status_code == 200
assert body["tilesets"]

# tileset
response = app_functions.get(
"/collections/pg_temp.landsat_centroids/tiles/WebMercatorQuad"
)
assert response.status_code == 200
body = response.json()
assert (
body["title"]
== "'pg_temp.landsat_centroids' tileset tiled using WebMercatorQuad TileMatrixSet"
)

response = app_functions.get("/collections/pg_temp.hexagons/tiles/WebMercatorQuad")
assert response.status_code == 200
body = response.json()
assert (
body["title"]
== "'pg_temp.hexagons' tileset tiled using WebMercatorQuad TileMatrixSet"
)

# tiles
response = app_functions.get("/collections/pg_temp.squares/tiles/3/3/3")
assert response.status_code == 200
decoded = mapbox_vector_tile.decode(response.content)
assert len(decoded["default"]["features"]) == 25

response = app_functions.get("/collections/pg_temp.squares/tiles/3/3/3?size=2")
assert response.status_code == 200
decoded = mapbox_vector_tile.decode(response.content)
assert len(decoded["default"]["features"]) == 483
4 changes: 2 additions & 2 deletions tipg/dependencies.py
Original file line number Diff line number Diff line change
Expand Up @@ -349,8 +349,8 @@ def function_parameters_query( # noqa: C901
"))"
)

elif param.default:
function_parameters[param.name] = param.default
elif param.default:
function_parameters[param.name] = param.default

else:
errors.append(f"{param.name} (expected type:{param.type}).")
Expand Down