import json from typing import AsyncIterator import httpx import pytest from _pytest.monkeypatch import MonkeyPatch from owslib.client import AsyncOwsClient, OwsClient from owslib.client.mock import OwsClientMock from owslib.enums import Environment TEST_SERVICE_NAME = "ows-permissions" TEST_PATH = "/hello/" TEST_RESPONSE_STATUS_CODE = 200 TEST_RESPONSE_JSON = {"status": "ok"} @pytest.fixture(autouse=True) def setup_service_mapping(monkeypatch: MonkeyPatch) -> None: monkeypatch.setenv( "OWSREQUEST_SERVICE_MAP", json.dumps({TEST_SERVICE_NAME: "http://ows-permission.test/"}), ) @pytest.fixture def ows_client() -> OwsClient: return OwsClient(environment=Environment.TEST, service_name="ows-test") @pytest.fixture async def async_ows_client() -> AsyncIterator[AsyncOwsClient]: async_ows_client = AsyncOwsClient( environment=Environment.TEST, service_name="ows-test", ) yield async_ows_client await async_ows_client.close() def test_ows_client_request( ows_client_mock: OwsClientMock, ows_client: OwsClient ) -> None: path = "/test/" response_status = 200 response_json = {"status": "ok"} ows_client_mock.request(TEST_SERVICE_NAME, method="GET", path=path).mock( return_value=httpx.Response(status_code=response_status, json=response_json) ) response = ows_client.request(TEST_SERVICE_NAME, method="GET", path=path) assert response.status_code == response_status assert response.json() == response_json @pytest.mark.parametrize("method", ["HEAD", "GET", "POST", "PUT", "PATCH", "DELETE"]) def test_ows_client_method( method: str, ows_client_mock: OwsClientMock, ows_client: OwsClient ) -> None: path = "/test/" response_status = 200 response_json = {"status": "ok"} ows_client_mock_request = getattr(ows_client_mock, method.lower()) ows_client_mock_request(TEST_SERVICE_NAME, path=path).mock( return_value=httpx.Response(status_code=response_status, json=response_json) ) ows_client_request = getattr(ows_client, method.lower()) response = ows_client_request(TEST_SERVICE_NAME, path=path) assert response.status_code == response_status assert response.json() == response_json @pytest.mark.asyncio async def test_async_ows_client_request( ows_client_mock: OwsClientMock, async_ows_client: AsyncOwsClient ) -> None: path = "/test-async/" response_status = 200 response_json = {"status": "ok"} ows_client_mock.request(TEST_SERVICE_NAME, path=path, method="POST").mock( return_value=httpx.Response(status_code=response_status, json=response_json) ) response = await async_ows_client.request( TEST_SERVICE_NAME, path=path, method="POST" ) assert response.status_code == response_status assert response.json() == response_json @pytest.mark.parametrize("method", ["HEAD", "GET", "POST", "PUT", "PATCH", "DELETE"]) @pytest.mark.asyncio async def test_async_ows_client_method( method: str, ows_client_mock: OwsClientMock, async_ows_client: AsyncOwsClient ) -> None: path = "/test-async/" response_status = 200 response_json = {"status": "ok"} ows_client_mock_request = getattr(ows_client_mock, method.lower()) ows_client_mock_request(TEST_SERVICE_NAME, path=path).mock( return_value=httpx.Response(status_code=response_status, json=response_json) ) async_ows_client_request = getattr(async_ows_client, method.lower()) response = await async_ows_client_request(TEST_SERVICE_NAME, path=path) assert response.status_code == response_status assert response.json() == response_json