Docs on temporary plugins in fixtures, closes #2234

pull/2221/head
Simon Willison 2024-01-12 14:12:14 -08:00
rodzic a25bf6bea7
commit 7a5adb592a
2 zmienionych plików z 50 dodań i 0 usunięć

Wyświetl plik

@ -313,3 +313,19 @@ When writing tests for plugins you may find it useful to register a test plugin
assert response.status_code == 500
finally:
pm.unregister(name="undo")
To reuse the same temporary plugin in multiple tests, you can register it inside a fixture in your ``conftest.py`` file like this:
.. literalinclude:: ../tests/test_docs_plugins.py
:language: python
:start-after: # -- start datasette_with_plugin_fixture --
:end-before: # -- end datasette_with_plugin_fixture --
Note the ``yield`` statement here - this ensures that the ``finally:`` block that unregisters the plugin is executed only after the test function itself has completed.
Then in a test:
.. literalinclude:: ../tests/test_docs_plugins.py
:language: python
:start-after: # -- start datasette_with_plugin_test --
:end-before: # -- end datasette_with_plugin_test --

Wyświetl plik

@ -0,0 +1,34 @@
# fmt: off
# -- start datasette_with_plugin_fixture --
from datasette import hookimpl
from datasette.app import Datasette
from datasette.plugins import pm
import pytest
import pytest_asyncio
@pytest_asyncio.fixture
async def datasette_with_plugin():
class TestPlugin:
__name__ = "TestPlugin"
@hookimpl
def register_routes(self):
return [
(r"^/error$", lambda: 1 / 0),
]
pm.register(TestPlugin(), name="undo")
try:
yield Datasette()
finally:
pm.unregister(name="undo")
# -- end datasette_with_plugin_fixture --
# -- start datasette_with_plugin_test --
@pytest.mark.asyncio
async def test_error(datasette_with_plugin):
response = await datasette_with_plugin.client.get("/error")
assert response.status_code == 500
# -- end datasette_with_plugin_test --