From 7626900d171bcba2287b9424eeda8d4c02e06e2c Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Tue, 15 Sep 2026 09:56:13 -0700 Subject: [PATCH] chore: Fix testlib so that failing tests are reported as failing pytest_runtest_makereport is called with status="passed", when="teardown" when teardown succeeds even when the test failed. We were previously overwriting the fail info with the teardown. --- .../fastapi-tests/src/worker.py | 2 +- packages/testlib/testlib/entrypoint.py | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/runtime-sdk/tests/web-frameworks-test/fastapi-tests/src/worker.py b/packages/runtime-sdk/tests/web-frameworks-test/fastapi-tests/src/worker.py index 77cbc593..0d336c4e 100644 --- a/packages/runtime-sdk/tests/web-frameworks-test/fastapi-tests/src/worker.py +++ b/packages/runtime-sdk/tests/web-frameworks-test/fastapi-tests/src/worker.py @@ -602,7 +602,7 @@ def fastapi_app(self): @app.get("/run-tests/{suite_name:path}") async def run_suite(suite_name: str, request: Request): - runner = TestRunner(request.scope["env"]) + runner = TestRunner(request.scope["env"], extra_plugins=[FastAPIAppPlugin()]) result = runner.run_suite(suite_name) return JSONResponse(result.payload, status_code=result.status) diff --git a/packages/testlib/testlib/entrypoint.py b/packages/testlib/testlib/entrypoint.py index fcc0e217..4df2bb55 100644 --- a/packages/testlib/testlib/entrypoint.py +++ b/packages/testlib/testlib/entrypoint.py @@ -43,7 +43,11 @@ def pytest_runtest_makereport(self, item, call): report = outcome.get_result() key = self._key(item) if report.passed: - self.results[key] = {"status": "passed"} + if report.when == "call": + self.results[key] = {"status": "passed"} + elif report.when == "teardown" and key not in self.results: + # Only reachable if no call report was recorded at all. + self.results[key] = {"status": "passed"} elif report.skipped: self.results[key] = { "status": "skipped", @@ -134,14 +138,16 @@ class TestRunnerResult: class TestRunner: - def __init__(self, env): + def __init__(self, env, extra_plugins=()): self.env = env self.collector = ResultCollector() + self.extra_plugins = list(extra_plugins) def plugins(self): return [ self.collector, EnvPlugin(self.env), + *self.extra_plugins, ] def run_suite(self, suite_name): @@ -180,7 +186,11 @@ def run_suite(self, suite_name): class TestRunnerEntrypoint(WorkerEntrypoint): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.runner = TestRunner(self.env) + self.runner = TestRunner(self.env, extra_plugins=self.plugins()) + + def plugins(self): + """Extra pytest plugins to register for in-worker suites.""" + return [] async def fetch(self, request): path = urlparse(request.url).path