diff --git a/jupyter_xarray_tiler/tests/fixtures/api.py b/jupyter_xarray_tiler/tests/fixtures/api.py new file mode 100644 index 0000000..9271ae5 --- /dev/null +++ b/jupyter_xarray_tiler/tests/fixtures/api.py @@ -0,0 +1,24 @@ +from collections.abc import AsyncGenerator + +import pytest_asyncio + +from jupyter_xarray_tiler.titiler import _get_server + + +async def _reset_titiler_api_for_testing() -> None: + # Shutdown the previous server + server = _get_server() + await server.stop_tile_server() + # Clear the cache so next time we'll get a fresh one + _get_server.cache_clear() + + +@pytest_asyncio.fixture +async def clean_titiler_api() -> AsyncGenerator[None]: + """Ensure a test's usage of the titiler API is not influenced by other tests. + + I.e., the test will receive a fresh TiTiler server. + """ + await _reset_titiler_api_for_testing() + yield + await _reset_titiler_api_for_testing() diff --git a/jupyter_xarray_tiler/tests/fixtures/server.py b/jupyter_xarray_tiler/tests/fixtures/server.py index 699e74f..2b0efc9 100644 --- a/jupyter_xarray_tiler/tests/fixtures/server.py +++ b/jupyter_xarray_tiler/tests/fixtures/server.py @@ -6,7 +6,7 @@ @pytest_asyncio.fixture -async def titiler_server() -> AsyncGenerator[TiTilerServer]: +async def clean_titiler_server() -> AsyncGenerator[TiTilerServer]: server = TiTilerServer() await server.start_tile_server() yield server diff --git a/jupyter_xarray_tiler/tests/test_titiler_api.py b/jupyter_xarray_tiler/tests/test_titiler_api.py index 9a4ec74..ef7e288 100644 --- a/jupyter_xarray_tiler/tests/test_titiler_api.py +++ b/jupyter_xarray_tiler/tests/test_titiler_api.py @@ -1,14 +1,32 @@ import pytest +from xarray import DataArray -from jupyter_xarray_tiler.titiler import _get_server, get_routes +from jupyter_xarray_tiler.titiler import ( + _get_server, + add_data_array, + get_routes, +) -def test_raises_if_get_routes_before_server_started() -> None: +def test_singleton_ish() -> None: + """Test that the API only uses one TiTiler server instance.""" + assert id(_get_server()) == id(_get_server()) + assert _get_server() is _get_server() + + +@pytest.mark.usefixtures("clean_titiler_api") +def test_get_routes_raises_before_server_started() -> None: """Test that get_routes raises an error if called before initialization.""" with pytest.raises(RuntimeError): get_routes() -def test_singleton_ish() -> None: - """Test that the API only uses one TiTiler server instance.""" - assert id(_get_server()) == id(_get_server()) +@pytest.mark.usefixtures("clean_titiler_api") +async def test_add_data_array_creates_routes( + random_data_array: DataArray, +) -> None: + await add_data_array( + data_array=random_data_array, + colormap_name="viridis", + ) + assert len(get_routes()) > 0 diff --git a/jupyter_xarray_tiler/tests/test_titiler_server.py b/jupyter_xarray_tiler/tests/test_titiler_server.py index 1c0f245..436edd1 100644 --- a/jupyter_xarray_tiler/tests/test_titiler_server.py +++ b/jupyter_xarray_tiler/tests/test_titiler_server.py @@ -12,39 +12,40 @@ async def test_server_is_not_singleton() -> None: Now, tests depend on being able to create a fresh instance and the end-user is protected from starting multiple instances in the public API. """ + assert id(TiTilerServer()) != id(TiTilerServer()) assert TiTilerServer() is not TiTilerServer() @pytest.mark.asyncio async def test_add_data_array_creates_api_routes( - titiler_server: TiTilerServer, + clean_titiler_server: TiTilerServer, random_data_array: DataArray, ) -> None: """Test that FastAPI routes are created when a data array is added to the server.""" - assert len(titiler_server.routes) == 0 + assert len(clean_titiler_server.routes) == 0 - await titiler_server.add_data_array( + await clean_titiler_server.add_data_array( data_array=random_data_array, colormap_name="viridis", ) - assert len(titiler_server.routes) > 1 + assert len(clean_titiler_server.routes) > 0 @pytest.mark.asyncio async def test_add_data_array_returns_valid_tile_url( - titiler_server: TiTilerServer, + clean_titiler_server: TiTilerServer, random_data_array: DataArray, ) -> None: """Test that adding a DataArray returns a properly formatted tile URL.""" - tile_url = await titiler_server.add_data_array( + tile_url = await clean_titiler_server.add_data_array( data_array=random_data_array, colormap_name="viridis", ) assert tile_url is not None assert "/proxy/" in tile_url - assert f"/{titiler_server._port}/" in tile_url + assert f"/{clean_titiler_server._port}/" in tile_url assert "/tiles/WebMercatorQuad/{z}/{x}/{y}.png" in tile_url assert "colormap_name=viridis" in tile_url assert "scale=1" in tile_url