diff --git a/lib/esbonio/tests/sphinx-agent/test_sa_build.py b/lib/esbonio/tests/sphinx-agent/test_sa_build.py index 8c3a89344..3dfb7b32e 100644 --- a/lib/esbonio/tests/sphinx-agent/test_sa_build.py +++ b/lib/esbonio/tests/sphinx-agent/test_sa_build.py @@ -1,29 +1,29 @@ import logging +import pathlib import sys import pytest -import pytest_asyncio +import pytest_lsp from lsprotocol.types import WorkspaceFolder from pygls.workspace import Workspace +from pytest_lsp import ClientServerConfig from esbonio.server import Uri from esbonio.server.features.sphinx_manager.client_subprocess import ( SubprocessSphinxClient, + make_test_sphinx_client, ) from esbonio.server.features.sphinx_manager.config import SphinxConfig -@pytest_asyncio.fixture(scope="module") -async def sphinx_client(uri_for, tmp_path_factory): - # TODO: Integrate with `pytest_lsp` - logger = logging.getLogger("sphinx_client") - logger.setLevel(logging.INFO) - - client = SubprocessSphinxClient() - - @client.feature("window/logMessage") - def _(params): - logger.info("%s", params.message) +@pytest_lsp.fixture( + scope="module", + config=ClientServerConfig( + server_command=[sys.executable, "-m", "esbonio.sphinx_agent"], + client_factory=make_test_sphinx_client, + ), +) +async def client(sphinx_client: SubprocessSphinxClient, uri_for, tmp_path_factory): build_dir = tmp_path_factory.mktemp("build") test_uri = uri_for("sphinx-default", "workspace", "index.rst") @@ -36,28 +36,29 @@ def _(params): ], ) config = SphinxConfig( - build_command=["sphinx-build", "-M", "html", ".", str(build_dir)], - python_command=[sys.executable], - env_passthrough=["PYTHONPATH"], + build_command=[ + "sphinx-build", + "-M", + "html", + sd_workspace.fs_path, + str(build_dir) + ], ) - resolved = config.resolve(test_uri, workspace, client.logger) + resolved = config.resolve(test_uri, workspace, sphinx_client.logger) assert resolved is not None - info = await client.create_application(resolved) + info = await sphinx_client.create_application(resolved) assert info is not None - yield client - - if not client.stopped: - await client.stop() + yield @pytest.mark.asyncio -async def test_build_file_map(sphinx_client, uri_for): +async def test_build_file_map(client: SubprocessSphinxClient, uri_for): """Ensure that we can trigger a Sphinx build correctly and the returned build_file_map is correct.""" - src = sphinx_client.src_uri + src = client.src_uri assert src is not None build_file_map = { @@ -73,8 +74,35 @@ async def test_build_file_map(sphinx_client, uri_for): (src / ".." / "badfile.rst").fs_path: "definitions.html", } - result = await sphinx_client.build() + result = await client.build() assert result.build_file_map == build_file_map build_uri_map = {Uri.for_file(src): out for src, out in build_file_map.items()} - assert sphinx_client.build_file_map == build_uri_map + assert client.build_file_map == build_uri_map + + +@pytest.mark.asyncio +async def test_build_content_override(client: SubprocessSphinxClient, uri_for): + """Ensure that we can override the contents of a given src file when + required.""" + + out = client.build_uri + src = client.src_uri + assert out is not None and src is not None + + await client.build() + + # Before + expected = "Welcome to Defaults’s documentation!" + index_html = pathlib.Path(out / "index.html") + assert expected in index_html.read_text() + + await client.build( + content_overrides={ + (src / "index.rst").fs_path: "My Custom Title\n===============" + } + ) + + # Ensure the override was applied + expected = "My Custom Title" + assert expected in index_html.read_text() diff --git a/lib/esbonio/tests/sphinx-agent/test_sa_create_app.py b/lib/esbonio/tests/sphinx-agent/test_sa_create_app.py index 928b1b401..c9707a505 100644 --- a/lib/esbonio/tests/sphinx-agent/test_sa_create_app.py +++ b/lib/esbonio/tests/sphinx-agent/test_sa_create_app.py @@ -1,33 +1,33 @@ +import asyncio import logging import sys import pytest +import pytest_lsp from lsprotocol.types import WorkspaceFolder from pygls.workspace import Workspace +from pytest_lsp import ClientServerConfig from esbonio.server.features.sphinx_manager.client_subprocess import ( SubprocessSphinxClient, + make_test_sphinx_client, ) from esbonio.server.features.sphinx_manager.config import SphinxConfig -@pytest.fixture() -def sphinx_client(): - # TODO: Integrate with `pytest_lsp` - logger = logging.getLogger("sphinx_client") - logger.setLevel(logging.INFO) - - client = SubprocessSphinxClient() - - @client.feature("window/logMessage") - def _(params): - logger.info("%s", params.message) +@pytest_lsp.fixture( + config=ClientServerConfig( + server_command=[sys.executable, "-m", "esbonio.sphinx_agent"], + client_factory=make_test_sphinx_client, + ) +) +async def client(sphinx_client: SubprocessSphinxClient): + yield - return client @pytest.mark.asyncio -async def test_create_application(sphinx_client, uri_for): +async def test_create_application(client: SubprocessSphinxClient, uri_for): """Ensure that we can create a Sphinx application instance correctly.""" test_uri = uri_for("sphinx-default", "workspace", "index.rst") @@ -41,21 +41,14 @@ async def test_create_application(sphinx_client, uri_for): WorkspaceFolder(uri=str(sd_workspace), name="sphinx-default"), ], ) - config = SphinxConfig( - python_command=[sys.executable], - env_passthrough=["PYTHONPATH"], - ) - resolved = config.resolve(test_uri, workspace, sphinx_client.logger) + config = SphinxConfig() + resolved = config.resolve(test_uri, workspace, client.logger) assert resolved is not None - try: - info = await sphinx_client.create_application(resolved) - assert info is not None - - assert info.builder_name == "dirhtml" - assert info.src_dir == sd_workspace.fs_path - assert info.conf_dir == sd_workspace.fs_path - assert "cache" in info.build_dir.lower() - finally: - if not sphinx_client.stopped: - await sphinx_client.stop() + info = await client.create_application(resolved) + assert info is not None + + assert info.builder_name == "dirhtml" + assert info.src_dir == sd_workspace.fs_path + assert info.conf_dir == sd_workspace.fs_path + assert "cache" in info.build_dir.lower()