Acceptance tests: upgrade python-geoservercloud

This commit is contained in:
Cécile Vuilleumier 2025-10-19 13:53:46 +02:00 committed by Gabriel Roldan
parent d44a1854e5
commit b3f10e669b
12 changed files with 209 additions and 192 deletions

View File

@ -10,7 +10,7 @@ packages = [{ include = "tests" }]
python = "^3.10"
pytest = "^8.3.3"
psycopg2-binary = "^2.9.9"
geoservercloud = "^0.2.5"
geoservercloud = "^0.5.0"
sqlalchemy = "^2.0.35"

View File

@ -45,8 +45,8 @@ def geoserver():
geoserver = GeoServerCloud(GEOSERVER_URL)
geoserver.recreate_workspace(WORKSPACE, set_default_workspace=True)
geoserver.create_pg_datastore(
workspace=WORKSPACE,
datastore=DATASTORE,
workspace_name=WORKSPACE,
datastore_name=DATASTORE,
pg_host=PGHOST,
pg_port=PGPORT,
pg_db=PGDATABASE,

View File

@ -13,24 +13,6 @@ WMTS_URL = "https://wmts.geo.admin.ch/EPSG/4326/1.0.0/WMTSCapabilities.xml"
WMTS_LAYER = "ch.swisstopo.pixelkarte-grau"
def create_cascaded_wms_store_payload():
return {
"wmsStore": {
"name": WMS_STORE,
"type": "WMS",
"enabled": "true",
"workspace": {"name": WORKSPACE},
"metadata": {"entry": {"@key": "useConnectionPooling", "$": "true"}},
"_default": "false",
"disableOnConnFailure": "false",
"capabilitiesURL": WMS_URL,
"maxConnections": 6,
"readTimeout": 60,
"connectTimeout": 30,
}
}
@pytest.fixture(scope="module")
def geoserver():
geoserver = GeoServerCloud(url=GEOSERVER_URL)
@ -44,23 +26,22 @@ def test_cascaded_wms(geoserver):
format = "image/jpeg"
# Create WMS store
payload = create_cascaded_wms_store_payload()
response = geoserver.post_request(
f"/rest/workspaces/{WORKSPACE}/wmsstores", json=payload
content, status = geoserver.create_wms_store(
workspace_name=WORKSPACE,
wms_store_name=WMS_STORE,
capabilities_url=WMS_URL,
)
assert response.status_code == 201
assert content == WMS_STORE
assert status == 201
# Publish layer
payload = {
"wmsLayer": {
"name": WMS_LAYER,
}
}
response = geoserver.post_request(
f"/rest/workspaces/{WORKSPACE}/wmsstores/{WMS_STORE}/wmslayers",
json=payload,
content, status = geoserver.create_wms_layer(
workspace_name=WORKSPACE,
wms_store_name=WMS_STORE,
native_layer_name=WMS_LAYER,
)
assert response.status_code == 201
assert content == WMS_LAYER
assert status == 201
# Perform GetMap request
response = geoserver.get_map(
@ -87,34 +68,41 @@ def test_cascaded_wms(geoserver):
assert data.get("features") == []
# Delete store
response = geoserver.delete_request(
f"/rest/workspaces/{WORKSPACE}/wmsstores/{WMS_STORE}?recurse=true"
content, status = geoserver.delete_wms_store(
workspace_name=WORKSPACE, wms_store_name=WMS_STORE
)
assert response.status_code == 200
assert content == ""
assert status == 200
def test_cascaded_wmts(geoserver):
format = "image/jpeg"
# Create WMTS store
response = geoserver.create_wmts_store(
WORKSPACE,
WMTS_STORE,
capabilities="https://wmts.geo.admin.ch/EPSG/4326/1.0.0/WMTSCapabilities.xml",
content, status = geoserver.create_wmts_store(
workspace_name=WORKSPACE,
name=WMTS_STORE,
capabilities=WMTS_URL,
)
assert response.status_code == 201
assert content == WMTS_STORE
assert status == 201
# Publish layer (GeoServer)
response = geoserver.create_wmts_layer(WORKSPACE, WMTS_STORE, WMTS_LAYER)
assert response.status_code == 201
response = geoserver.get_request(
f"/rest/workspaces/{WORKSPACE}/wmtsstores/{WMTS_STORE}/layers/{WMTS_LAYER}.json"
content, status = geoserver.create_wmts_layer(
workspace_name=WORKSPACE,
wmts_store=WMTS_STORE,
native_layer=WMTS_LAYER,
)
assert response.status_code == 200
assert content == WMTS_LAYER
assert status == 201
# Publish the layer in GWC
response = geoserver.publish_gwc_layer(WORKSPACE, WMTS_LAYER)
assert response.status_code == 200
content, status = geoserver.publish_gwc_layer(WORKSPACE, WMTS_LAYER)
assert content == "layer saved"
assert status == 200
content, status = geoserver.get_gwc_layer(WORKSPACE, WMTS_LAYER)
assert status == 200
assert content.get("GeoServerLayer", {}).get("name") == f"{WORKSPACE}:{WMTS_LAYER}"
# Perform GetTile request (GWC)
response = geoserver.get_tile(
@ -128,9 +116,12 @@ def test_cascaded_wmts(geoserver):
assert response.info().get("Content-Type") == format
# Delete layer and store
response = geoserver.delete_request(f"/gwc/rest/layers/{WORKSPACE}:{WMTS_LAYER}")
assert response.status_code == 200
response = geoserver.delete_request(
f"/rest/workspaces/{WORKSPACE}/wmtsstores/{WMTS_STORE}?recurse=true"
content, code = geoserver.delete_gwc_layer(
workspace_name=WORKSPACE, layer=WMTS_LAYER
)
assert content == f"{WORKSPACE}:{WMTS_LAYER} deleted"
assert code == 200
response = geoserver.rest_service.rest_client.delete(
f"{geoserver.rest_service.rest_endpoints.wmtsstore(WORKSPACE,WMTS_STORE)}?recurse=true",
)
assert response.status_code == 200

View File

@ -2,25 +2,28 @@ import pytest
from geoservercloud import GeoServerCloud
from conftest import GEOSERVER_URL
WORKSPACE = "cog"
def test_create_cog_coverage():
@pytest.fixture(scope="function")
def geoserver():
geoserver = GeoServerCloud(url=GEOSERVER_URL)
geoserver.create_workspace(WORKSPACE, set_default_workspace=True)
yield geoserver
geoserver.delete_workspace(WORKSPACE)
def test_create_cog_coverage(geoserver):
"""Test creating a COG coverage store and coverage"""
geoserver = GeoServerCloud(GEOSERVER_URL)
workspace = "cog"
store_name = "land_shallow_topo_21600_NW_cog"
coverage_name = "land_shallow_topo_NW"
# Delete and recreate workspace
geoserver.delete_workspace(workspace)
response = geoserver.create_workspace(workspace)
assert response.status_code == 201
# Create COG coverage store
store_xml = f"""<coverageStore>
<name>{store_name}</name>
<type>GeoTIFF</type>
<enabled>true</enabled>
<workspace><name>{workspace}</name></workspace>
<workspace><name>{WORKSPACE}</name></workspace>
<url>cog://https://test-data-cog-public.s3.amazonaws.com/public/land_shallow_topo_21600_NW_cog.tif</url>
<metadata>
<entry key="CogSettings.Key">
@ -31,10 +34,13 @@ def test_create_cog_coverage():
</metadata>
</coverageStore>"""
response = geoserver.post_request(
f"/rest/workspaces/{workspace}/coveragestores",
rest_client = geoserver.rest_service.rest_client
endpoints = geoserver.rest_service.rest_endpoints
response = rest_client.post(
endpoints.coveragestores(WORKSPACE),
data=store_xml,
headers={"Content-Type": "application/xml"}
headers={"Content-Type": "application/xml"},
)
assert response.status_code == 201
@ -44,21 +50,21 @@ def test_create_cog_coverage():
<nativeName>{store_name}</nativeName>
</coverage>"""
response = geoserver.post_request(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages",
response = rest_client.post(
endpoints.coverages(WORKSPACE, store_name),
data=coverage_xml,
headers={"Content-Type": "application/xml"}
headers={"Content-Type": "application/xml"},
)
assert response.status_code == 201
# Verify the coverage was created - try listing coverages first
list_response = geoserver.get_request(f"/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages.json")
if list_response.status_code != 200:
print(f"Coverage listing failed: {list_response.status_code} - {list_response.text}")
assert list_response.status_code == 200
list_response = rest_client.get(endpoints.coverages(WORKSPACE, store_name))
assert (
list_response.status_code == 200
), f"Failed to get coverages: {list_response.status_code} - {list_response.text}"
# Check specific coverage
response = geoserver.get_request(f"/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages/{coverage_name}.json")
response = rest_client.get(endpoints.coverage(WORKSPACE, store_name, coverage_name))
assert response.status_code == 200
# Verify coverage properties
@ -68,11 +74,8 @@ def test_create_cog_coverage():
assert coverage_data["enabled"] == True
# Test WMS GetMap request
wms_response = geoserver.get_request(
f"/wms?SERVICE=WMS&VERSION=1.1.0&REQUEST=GetMap&LAYERS={workspace}:{coverage_name}&STYLES=&BBOX=-180,-90,180,90&WIDTH=256&HEIGHT=256&FORMAT=image/jpeg&SRS=EPSG:4326"
wms_response = rest_client.get(
f"/wms?SERVICE=WMS&VERSION=1.1.0&REQUEST=GetMap&LAYERS={WORKSPACE}:{coverage_name}&STYLES=&BBOX=-180,-90,180,90&WIDTH=256&HEIGHT=256&FORMAT=image/jpeg&SRS=EPSG:4326"
)
assert wms_response.status_code == 200
assert wms_response.headers.get("content-type").startswith("image/jpeg")
# Cleanup
geoserver.delete_workspace(workspace)

View File

@ -1,12 +1,31 @@
from conftest import PGHOST, PGPORT, PGDATABASE, PGUSER, PGPASSWORD, PGSCHEMA
from geoservercloud import GeoServerCloud
import pytest
from conftest import (
GEOSERVER_URL,
PGHOST,
PGPORT,
PGDATABASE,
PGUSER,
PGPASSWORD,
PGSCHEMA,
)
WORKSPACE = "test_pg_datastore"
@pytest.fixture(scope="function")
def geoserver():
geoserver = GeoServerCloud(url=GEOSERVER_URL)
geoserver.create_workspace(WORKSPACE, set_default_workspace=True)
yield geoserver
geoserver.delete_workspace(WORKSPACE)
def test_create_get_and_delete_datastore(geoserver):
workspace = datastore = "test_create_pg_datastore"
geoserver.create_workspace(workspace)
response = geoserver.create_pg_datastore(
workspace=workspace,
datastore=datastore,
datastore = "test_pg_datastore"
content, code = geoserver.create_pg_datastore(
workspace_name=WORKSPACE,
datastore_name=datastore,
pg_host=PGHOST,
pg_port=PGPORT,
pg_db=PGDATABASE,
@ -15,10 +34,8 @@ def test_create_get_and_delete_datastore(geoserver):
pg_schema=PGSCHEMA,
set_default_datastore=True,
)
assert response.status_code == 201
response = geoserver.get_request(
f"/rest/workspaces/{workspace}/datastores/{datastore}.json"
)
assert response.status_code == 200
response = geoserver.delete_workspace(workspace)
assert response.status_code == 200
assert content == datastore
assert code == 201
content, code = geoserver.get_pg_datastore(WORKSPACE, datastore)
assert content.get("name") == datastore
assert code == 200

View File

@ -14,12 +14,9 @@ def geoserver_with_gwc_layers(geoserver):
capabilities="https://wmts.geo.admin.ch/EPSG/4326/1.0.0/WMTSCapabilities.xml",
)
geoserver.create_wmts_layer(WORKSPACE, WMTS_STORE, WMTS_LAYER)
geoserver.get_request(
f"/rest/workspaces/{WORKSPACE}/wmtsstores/{WMTS_STORE}/layers/{WMTS_LAYER}.json"
)
geoserver.publish_gwc_layer(WORKSPACE, WMTS_LAYER)
yield geoserver
geoserver.delete_request(f"/gwc/rest/layers/{WORKSPACE}:{WMTS_LAYER}")
geoserver.delete_gwc_layer(WORKSPACE, WMTS_LAYER)
geoserver.delete_workspace(WORKSPACE)

View File

@ -28,7 +28,7 @@ def assert_legend(geoserver, style, language, expected_label):
format="application/json",
language=language,
style=style,
workspace=WORKSPACE,
workspace_name=WORKSPACE,
)
try:
label = response.json()["Legend"][0]["rules"][0]["title"]
@ -71,14 +71,14 @@ def geoserver_i18n_legend_layer(geoserver):
geoserver.create_workspace(WORKSPACE, set_default_workspace=True)
geoserver.create_feature_type("i18n_legend", epsg=2056)
geoserver.create_style_from_file(
"localized_with_default.sld",
"localized_with_default",
f"{RESOURCE_DIR}/localized_with_default.sld",
workspace=WORKSPACE,
workspace_name=WORKSPACE,
)
geoserver.create_style_from_file(
"localized_no_default.sld",
"localized_no_default",
f"{RESOURCE_DIR}/localized_no_default.sld",
workspace=WORKSPACE,
workspace_name=WORKSPACE,
)
yield geoserver
@ -102,7 +102,7 @@ def geoserver_i18n_label_layer(geoserver, db_session):
"label_fr": {"type": "string", "required": False},
}
geoserver.create_feature_type(feature_type, attributes=attributes, epsg=2056)
geoserver.create_style_from_file(style, file, workspace=WORKSPACE)
geoserver.create_style_from_file(style, file, workspace_name=WORKSPACE)
# Feature with labels in German, French and a default value
db_session.execute(
text(

View File

@ -27,22 +27,25 @@ def test_create_imagemosaic_local_files():
# Delete and recreate workspace
geoserver.delete_workspace(workspace)
response = geoserver.create_workspace(workspace)
assert response.status_code == 201
_, status = geoserver.create_workspace(workspace)
assert status == 201
# Use direct directory approach (like web UI) instead of individual file URLs
directory_path = "/opt/geoserver_data/sampledata/ne/pyramid/"
# Create ImageMosaic store directly from directory
response = geoserver.put_request(
response = geoserver.rest_service.rest_client.put(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/external.imagemosaic",
data=directory_path,
headers={"Content-Type": "text/plain"}
headers={"Content-Type": "text/plain"},
)
assert response.status_code in [201, 202], f"Failed to create ImageMosaic from directory: {response.text}"
assert response.status_code in [
201,
202,
], f"Failed to create ImageMosaic from directory: {response.text}"
# List available coverages (should be auto-discovered)
response = geoserver.get_request(
response = geoserver.rest_service.rest_client.get(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages.xml?list=all"
)
assert response.status_code == 200, f"Failed to list coverages: {response.text}"
@ -56,7 +59,7 @@ def test_create_imagemosaic_local_files():
coverage_name = coverage_match.group(1)
# Check if coverage was auto-created (likely scenario)
coverage_response = geoserver.get_request(
coverage_response = geoserver.rest_service.rest_client.get(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages/{coverage_name}.json"
)
@ -75,7 +78,7 @@ def test_create_imagemosaic_local_files():
<enabled>true</enabled>
</coverage>"""
response = geoserver.post_request(
response = geoserver.rest_service.rest_client.post(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages",
data=coverage_xml,
headers={"Content-Type": "text/xml"}
@ -83,7 +86,7 @@ def test_create_imagemosaic_local_files():
assert response.status_code == 201, f"Failed to create coverage: {response.text}"
# Verify the coverage was created
response = geoserver.get_request(f"/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages/{coverage_name}.json")
response = geoserver.rest_service.rest_client.get(f"/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages/{coverage_name}.json")
assert response.status_code == 200
coverage_data = response.json()["coverage"]
@ -92,7 +95,7 @@ def test_create_imagemosaic_local_files():
assert coverage_data["enabled"] == True
# Test WMS GetMap request (verify local file mosaic works)
wms_response = geoserver.get_request(
wms_response = geoserver.rest_service.rest_client.get(
f"/wms?SERVICE=WMS&VERSION=1.1.0&REQUEST=GetMap&LAYERS={workspace}:{coverage_name}&STYLES=&BBOX=-180,-90,180,90&WIDTH=256&HEIGHT=256&FORMAT=image/png&SRS=EPSG:4326"
)
assert wms_response.status_code == 200, f"WMS GetMap failed: {wms_response.text}"
@ -111,8 +114,8 @@ def test_create_imagemosaic_manual_granules():
# Delete and recreate workspace
geoserver.delete_workspace(workspace)
response = geoserver.create_workspace(workspace)
assert response.status_code == 201
_, status = geoserver.create_workspace(workspace)
assert status == 201
# Create temporary directory for mosaic configuration
with tempfile.TemporaryDirectory() as tmp_dir:
@ -157,7 +160,7 @@ preparedStatements=false
with open(zip_file, 'rb') as f:
zip_data = f.read()
response = geoserver.put_request(
response = geoserver.rest_service.rest_client.put(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/file.imagemosaic?configure=none",
data=zip_data,
headers={"Content-Type": "application/zip"}
@ -174,7 +177,7 @@ preparedStatements=false
for granule_path in granule_paths:
# Use direct file paths (without file:// protocol) for external.imagemosaic
response = geoserver.post_request(
response = geoserver.rest_service.rest_client.post(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/external.imagemosaic",
data=granule_path,
headers={"Content-Type": "text/plain"}
@ -182,7 +185,7 @@ preparedStatements=false
assert response.status_code in [201, 202], f"Failed to add granule {granule_path}: {response.text}"
# Initialize the store (list available coverages)
response = geoserver.get_request(
response = geoserver.rest_service.rest_client.get(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages.xml?list=all"
)
assert response.status_code == 200, f"Failed to list coverages: {response.text}"
@ -200,7 +203,7 @@ preparedStatements=false
<enabled>true</enabled>
</coverage>"""
response = geoserver.post_request(
response = geoserver.rest_service.rest_client.post(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages",
data=coverage_xml,
headers={"Content-Type": "text/xml"}
@ -208,7 +211,7 @@ preparedStatements=false
assert response.status_code == 201, f"Failed to create coverage: {response.text}"
# Verify the coverage was created successfully
response = geoserver.get_request(
response = geoserver.rest_service.rest_client.get(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages/{coverage_name}.json"
)
assert response.status_code == 200, f"Failed to get coverage details: {response.text}"
@ -219,7 +222,7 @@ preparedStatements=false
assert coverage_data["enabled"] == True
# Test WMS GetMap request (verify manual granule addition works)
wms_response = geoserver.get_request(
wms_response = geoserver.rest_service.rest_client.get(
f"/wms?SERVICE=WMS&VERSION=1.1.0&REQUEST=GetMap&LAYERS={workspace}:{coverage_name}&STYLES=&BBOX=-180,-90,180,90&WIDTH=256&HEIGHT=256&FORMAT=image/png&SRS=EPSG:4326"
)
assert wms_response.status_code == 200, f"WMS GetMap failed: {wms_response.text}"
@ -243,8 +246,8 @@ def test_create_imagemosaic_empty_store_with_directory_harvest():
geoserver.delete_workspace(workspace)
# Step 1: Create workspace
response = geoserver.create_workspace(workspace)
assert response.status_code == 201, f"Failed to create workspace: {response.text}"
content, status = geoserver.create_workspace(workspace)
assert status == 201, f"Failed to create workspace: {content}"
# Step 2: Create ImageMosaic store with configuration
with tempfile.TemporaryDirectory() as tmp_dir:
@ -289,7 +292,7 @@ preparedStatements=false
with open(zip_file, 'rb') as f:
zip_data = f.read()
response = geoserver.put_request(
response = geoserver.rest_service.rest_client.put(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/file.imagemosaic?configure=none",
data=zip_data,
headers={"Content-Type": "application/zip"}
@ -299,7 +302,7 @@ preparedStatements=false
# Step 3: Harvest granules from directory
harvest_path = "/opt/geoserver_data/sampledata/ne/pyramid/"
response = geoserver.post_request(
response = geoserver.rest_service.rest_client.post(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/external.imagemosaic",
data=harvest_path,
headers={"Content-Type": "text/plain"}
@ -307,7 +310,7 @@ preparedStatements=false
assert response.status_code in [201, 202], f"Failed to harvest directory {harvest_path}: {response.text}"
# Step 4: List available coverages
response = geoserver.get_request(
response = geoserver.rest_service.rest_client.get(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages.xml?list=all"
)
assert response.status_code == 200, f"Failed to list coverages: {response.text}"
@ -325,7 +328,7 @@ preparedStatements=false
<enabled>true</enabled>
</coverage>"""
response = geoserver.post_request(
response = geoserver.rest_service.rest_client.post(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages",
data=coverage_xml,
headers={"Content-Type": "text/xml"}
@ -333,7 +336,7 @@ preparedStatements=false
assert response.status_code == 201, f"Layer creation failed: {response.text}"
# Step 6: Verify the coverage was created successfully
response = geoserver.get_request(
response = geoserver.rest_service.rest_client.get(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages/{coverage_name}.json"
)
assert response.status_code == 200, f"Failed to get coverage details: {response.text}"
@ -344,7 +347,7 @@ preparedStatements=false
assert coverage_data["enabled"] == True
# Step 7: Test WMS GetMap request
wms_response = geoserver.get_request(
wms_response = geoserver.rest_service.rest_client.get(
f"/wms?SERVICE=WMS&VERSION=1.1.0&REQUEST=GetMap&LAYERS={workspace}:{coverage_name}"
f"&STYLES=&BBOX=-180,-90,180,90&WIDTH=256&HEIGHT=256&FORMAT=image/png&SRS=EPSG:4326"
)
@ -369,8 +372,8 @@ def test_create_imagemosaic_empty_store_with_single_file_harvest():
geoserver.delete_workspace(workspace)
# Step 1: Create workspace
response = geoserver.create_workspace(workspace)
assert response.status_code == 201, f"Failed to create workspace: {response.text}"
content, status = geoserver.create_workspace(workspace)
assert status == 201, f"Failed to create workspace: {content}"
# Step 2: Create ImageMosaic store
with tempfile.TemporaryDirectory() as tmp_dir:
@ -415,7 +418,7 @@ preparedStatements=false
with open(zip_file, 'rb') as f:
zip_data = f.read()
response = geoserver.put_request(
response = geoserver.rest_service.rest_client.put(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/file.imagemosaic?configure=none",
data=zip_data,
headers={"Content-Type": "application/zip"}
@ -425,7 +428,7 @@ preparedStatements=false
# Step 3: Harvest single file
single_file_path = "/opt/geoserver_data/sampledata/ne/NE1_LR_LC_SR_W_DR.tif"
response = geoserver.post_request(
response = geoserver.rest_service.rest_client.post(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/external.imagemosaic",
data=single_file_path,
headers={"Content-Type": "text/plain"}
@ -433,7 +436,7 @@ preparedStatements=false
assert response.status_code in [201, 202], f"Failed to harvest file {single_file_path}: {response.text}"
# Step 4: List and create layer
response = geoserver.get_request(
response = geoserver.rest_service.rest_client.get(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages.xml?list=all"
)
assert response.status_code == 200, f"Failed to list coverages: {response.text}"
@ -446,7 +449,7 @@ preparedStatements=false
<enabled>true</enabled>
</coverage>"""
response = geoserver.post_request(
response = geoserver.rest_service.rest_client.post(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages",
data=coverage_xml,
headers={"Content-Type": "text/xml"}
@ -454,7 +457,7 @@ preparedStatements=false
assert response.status_code == 201, f"Layer creation failed: {response.text}"
# Verify WMS works
wms_response = geoserver.get_request(
wms_response = geoserver.rest_service.rest_client.get(
f"/wms?SERVICE=WMS&VERSION=1.1.0&REQUEST=GetMap&LAYERS={workspace}:{coverage_name}"
f"&STYLES=&BBOX=-180,-90,180,90&WIDTH=256&HEIGHT=256&FORMAT=image/png&SRS=EPSG:4326"
)
@ -478,8 +481,8 @@ def test_create_imagemosaic_via_xml_store_creation():
geoserver.delete_workspace(workspace)
# Step 1: Create workspace
response = geoserver.create_workspace(workspace)
assert response.status_code == 201, f"Failed to create workspace: {response.text}"
content, code = geoserver.create_workspace(workspace)
assert code == 201, f"Failed to create workspace: {content}"
# Step 2: Create ImageMosaic store via XML store creation
store_xml = f"""<coverageStore>
@ -492,7 +495,7 @@ def test_create_imagemosaic_via_xml_store_creation():
<url>/opt/geoserver_data/sampledata/ne/pyramid/</url>
</coverageStore>"""
response = geoserver.post_request(
response = geoserver.rest_service.rest_client.post(
f"/rest/workspaces/{workspace}/coveragestores",
data=store_xml,
headers={"Content-Type": "text/xml"}
@ -500,7 +503,7 @@ def test_create_imagemosaic_via_xml_store_creation():
assert response.status_code == 201, f"Store creation via XML failed: {response.text}"
# Step 3: List available coverages
response = geoserver.get_request(
response = geoserver.rest_service.rest_client.get(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages.xml?list=all"
)
assert response.status_code == 200, f"Failed to list coverages: {response.text}"
@ -520,7 +523,7 @@ def test_create_imagemosaic_via_xml_store_creation():
<enabled>true</enabled>
</coverage>"""
response = geoserver.post_request(
response = geoserver.rest_service.rest_client.post(
f"/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages",
data=coverage_xml,
headers={"Content-Type": "text/xml"}
@ -528,7 +531,7 @@ def test_create_imagemosaic_via_xml_store_creation():
assert response.status_code == 201, f"Layer creation failed: {response.text}"
# Verify WMS works
wms_response = geoserver.get_request(
wms_response = geoserver.rest_service.rest_client.get(
f"/wms?SERVICE=WMS&VERSION=1.1.0&REQUEST=GetMap&LAYERS={workspace}:{coverage_name}"
f"&STYLES=&BBOX=-180,-90,180,90&WIDTH=256&HEIGHT=256&FORMAT=image/png&SRS=EPSG:4326"
)

View File

@ -11,8 +11,8 @@ def _create_imagemosaic(geoserver, workspace, coverage, granules, indexer_conten
"""Helper function to create an ImageMosaic with COG granules"""
# Delete and recreate workspace
geoserver.delete_workspace(workspace)
response = geoserver.create_workspace(workspace)
assert response.status_code == 201
_, status = geoserver.create_workspace(workspace)
assert status == 201
# Create temporary directory for mosaic files
with tempfile.TemporaryDirectory() as tmp_dir:
@ -58,7 +58,7 @@ preparedStatements=false
with open(zip_file, 'rb') as f:
zip_data = f.read()
response = geoserver.put_request(
response = geoserver.rest_service.rest_client.put(
f"/rest/workspaces/{workspace}/coveragestores/{coverage}/file.imagemosaic?configure=none",
data=zip_data,
headers={"Content-Type": "application/zip"}
@ -67,7 +67,7 @@ preparedStatements=false
# Add granules
for uri in granules:
response = geoserver.post_request(
response = geoserver.rest_service.rest_client.post(
f"/rest/workspaces/{workspace}/coveragestores/{coverage}/remote.imagemosaic",
data=uri,
headers={"Content-Type": "text/plain"}
@ -76,7 +76,7 @@ preparedStatements=false
assert response.status_code in [201, 202]
# Initialize the store (list available coverages)
response = geoserver.get_request(
response = geoserver.rest_service.rest_client.get(
f"/rest/workspaces/{workspace}/coveragestores/{coverage}/coverages.xml?list=all"
)
assert response.status_code == 200
@ -93,7 +93,7 @@ preparedStatements=false
<enabled>true</enabled>
</coverage>"""
response = geoserver.post_request(
response = geoserver.rest_service.rest_client.post(
f"/rest/workspaces/{workspace}/coveragestores/{coverage}/coverages",
data=coverage_xml,
headers={"Content-Type": "text/xml"}
@ -101,7 +101,7 @@ preparedStatements=false
assert response.status_code == 201
# Verify the coverage was created
response = geoserver.get_request(f"/rest/workspaces/{workspace}/coveragestores/{coverage}/coverages/{coverage}.json")
response = geoserver.rest_service.rest_client.get(f"/rest/workspaces/{workspace}/coveragestores/{coverage}/coverages/{coverage}.json")
assert response.status_code == 200
# Verify coverage properties
@ -112,7 +112,7 @@ preparedStatements=false
assert coverage_data["title"] == title
# Test WMS GetMap request
wms_response = geoserver.get_request(
wms_response = geoserver.rest_service.rest_client.get(
f"/wms?SERVICE=WMS&VERSION=1.1.0&REQUEST=GetMap&LAYERS={workspace}:{coverage}&STYLES=&BBOX=-180,-90,180,90&WIDTH=256&HEIGHT=256&FORMAT=image/png&SRS=EPSG:4326"
)
assert wms_response.status_code == 200
@ -172,7 +172,7 @@ Name={coverage}"""
coverage_data = _create_imagemosaic(geoserver, workspace, coverage, modis_granules, indexer_content, "MODIS Vegetation Index")
# Additional test for time-based query (since MODIS has time dimension)
time_wms_response = geoserver.get_request(
time_wms_response = geoserver.rest_service.rest_client.get(
f"/wms?SERVICE=WMS&VERSION=1.1.0&REQUEST=GetMap&LAYERS={workspace}:{coverage}&STYLES=&BBOX=-180,-90,180,90&WIDTH=256&HEIGHT=256&FORMAT=image/png&SRS=EPSG:4326&TIME=2018-01-01"
)
assert time_wms_response.status_code == 200

View File

@ -29,11 +29,11 @@ def test_wfs(geoserver):
"required": False,
},
}
response = geoserver.create_workspace(workspace, set_default_workspace=True)
assert response.status_code == 201
response = geoserver.create_pg_datastore(
workspace=workspace,
datastore=datastore,
_, code = geoserver.create_workspace(workspace, set_default_workspace=True)
assert code == 201
_, code = geoserver.create_pg_datastore(
workspace_name=workspace,
datastore_name=datastore,
pg_host=PGHOST,
pg_port=PGPORT,
pg_db=PGDATABASE,
@ -42,16 +42,19 @@ def test_wfs(geoserver):
pg_schema=PGSCHEMA,
set_default_datastore=True,
)
assert response.status_code == 201
response = geoserver.create_feature_type(
assert code == 201
content, code = geoserver.create_feature_type(
feature_type, attributes=attributes, epsg=2056
)
assert response.status_code == 201
assert content == ""
assert code == 201
# Post a feature through a WFS request
with open(f"{RESOURCE_DIR}/wfs_payload.xml") as file:
data = file.read()
response = geoserver.post_request(f"/{workspace}/wfs/", data=data)
response = geoserver.rest_service.rest_client.post(
f"/{workspace}/wfs/", data=data
)
assert response.status_code == 200
# GetFeature request
@ -72,5 +75,5 @@ def test_wfs(geoserver):
"properties": {"name": "urn:ogc:def:crs:EPSG::2056"},
}
response = geoserver.delete_workspace(workspace)
assert response.status_code == 200
_, code = geoserver.delete_workspace(workspace)
assert code == 200

View File

@ -17,8 +17,8 @@ def test_create_and_feature_type_and_get_map(db_session, geoserver):
workspace = datastore = feature_type = "test_create_feature_type"
geoserver.create_workspace(workspace, set_default_workspace=True)
geoserver.create_pg_datastore(
workspace=workspace,
datastore=datastore,
workspace_name=workspace,
datastore_name=datastore,
pg_host=PGHOST,
pg_port=PGPORT,
pg_db=PGDATABASE,
@ -27,11 +27,11 @@ def test_create_and_feature_type_and_get_map(db_session, geoserver):
pg_schema=PGSCHEMA,
set_default_datastore=True,
)
response = geoserver.create_feature_type(
_, status = geoserver.create_feature_type(
feature_type,
epsg=2056,
)
assert response.status_code == 201
assert status == 201
# Create feature
db_session.execute(
@ -69,11 +69,11 @@ def test_get_feature_info(db_session, geoserver):
"required": False,
},
}
response = geoserver.create_workspace(workspace, set_default_workspace=True)
assert response.status_code == 201
response = geoserver.create_pg_datastore(
workspace=workspace,
datastore=datastore,
_, status = geoserver.create_workspace(workspace, set_default_workspace=True)
assert status == 201
_, status = geoserver.create_pg_datastore(
workspace_name=workspace,
datastore_name=datastore,
pg_host=PGHOST,
pg_port=PGPORT,
pg_db=PGDATABASE,
@ -82,11 +82,11 @@ def test_get_feature_info(db_session, geoserver):
pg_schema=PGSCHEMA,
set_default_datastore=True,
)
assert response.status_code == 201
response = geoserver.create_feature_type(
assert status == 201
_, status = geoserver.create_feature_type(
feature_type, attributes=attributes, epsg=2056
)
assert response.status_code == 201
assert status == 201
# Create feature
db_session.execute(
@ -98,8 +98,8 @@ def test_get_feature_info(db_session, geoserver):
db_session.commit()
# Test that layer is published
response = geoserver.get_request(f"/rest/layers/{workspace}:{feature_type}.json")
assert response.status_code == 200
_, status = geoserver.get_feature_type(workspace, datastore, feature_type)
assert status == 200
# GetFeatureInfo request
response = geoserver.get_feature_info(
@ -124,5 +124,5 @@ def test_get_feature_info(db_session, geoserver):
"properties": {"name": "urn:ogc:def:crs:EPSG::2056"},
}
response = geoserver.delete_workspace(workspace)
assert response.status_code == 200
_, status = geoserver.delete_workspace(workspace)
assert status == 200

View File

@ -1,23 +1,26 @@
def test_create_get_and_delete_workspace(geoserver):
workspace = "test_create_workspace"
response = geoserver.create_workspace(workspace)
assert response.status_code == 201
response = geoserver.get_request(f"/rest/workspaces/{workspace}.json")
assert response.status_code == 200
response = geoserver.publish_workspace(workspace)
assert response.status_code == 200
response = geoserver.delete_workspace(workspace)
assert response.status_code == 200
content, status = geoserver.create_workspace(workspace)
assert content == workspace
assert status == 201
content, status = geoserver.get_workspace(workspace)
assert content == {"name": workspace, "isolated": False}
assert status == 200
content, status = geoserver.publish_workspace(workspace)
assert status == 200
content, status = geoserver.delete_workspace(workspace)
assert status == 200
def test_update_workspace(geoserver):
workspace = "update_workspace"
response = geoserver.create_workspace(workspace, isolated=True)
assert response.status_code == 201
response = geoserver.get_request(f"/rest/workspaces/{workspace}.json")
assert response.json().get("workspace").get("isolated") == True
response = geoserver.create_workspace(workspace, isolated=False)
assert response.status_code == 200
response = geoserver.get_request(f"/rest/workspaces/{workspace}.json")
assert response.json().get("workspace").get("isolated") == False
content, status = geoserver.create_workspace(workspace, isolated=True)
content, status = geoserver.get_workspace(workspace)
assert content == {"name": workspace, "isolated": True}
assert status == 200
content, status = geoserver.create_workspace(workspace, isolated=False)
assert content == ""
assert status == 200
content, status = geoserver.get_workspace(workspace)
assert content == {"name": workspace, "isolated": False}
geoserver.delete_workspace(workspace)