test: set Celery config through a celery_conf fixture, not monkeypatch
CI and images / lint (push) Successful in 2s
CI and images / extension-version (push) Successful in 1s
CI and images / backend-lint-and-test (push) Successful in 31s
CI and images / frontend-build (push) Successful in 26s
CI and images / extension-test (push) Successful in 20s
CI and images / integration (push) Failing after 2m22s
CI and images / sign-extension (push) Skipped
CI and images / build-web (push) Skipped
CI and images / smoke-web (push) Skipped
CI and images / promote (push) Skipped
CI and images / build-agent (push) Skipped
CI and images / lint (push) Successful in 2s
CI and images / extension-version (push) Successful in 1s
CI and images / backend-lint-and-test (push) Successful in 31s
CI and images / frontend-build (push) Successful in 26s
CI and images / extension-test (push) Successful in 20s
CI and images / integration (push) Failing after 2m22s
CI and images / sign-extension (push) Skipped
CI and images / build-web (push) Skipped
CI and images / smoke-web (push) Skipped
CI and images / promote (push) Skipped
CI and images / build-agent (push) Skipped
pytest 9.2.0 (released 2026-10-27, changelog #10644) changed how monkeypatch.setattr restores an attribute the object does not hold in its own __dict__: undo now deletes it instead of assigning the old value back. Celery's conf serves every key through __getattr__, so undo called delattr, the delete raised AttributeError, and pytest skipped the rest of that test's undos. That made 53 teardown errors across six files (cleanup API, task-run signals, tasks admin, backup, library audit, the soft-limit salvage test), and could leak patches into later tests. CI installs pytest unpinned, so the first run after the release picked it up: the weekly base refresh of main, 2026-11-01, and every run since. The gate held, so nothing was published. tests/conftest.py gains `celery_conf(**values)`: it records each key's value through conf[key], writes with conf.update(), and restores the saved values after the test. The six files use it. Task #6864. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -85,6 +85,29 @@ def db_sync(sync_engine):
|
||||
session.rollback()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def celery_conf():
|
||||
"""Set Celery config keys for one test: `celery_conf(task_always_eager=True)`.
|
||||
The values they had before the test come back after it.
|
||||
|
||||
Use this, not `monkeypatch.setattr(celery.conf, ...)`. Celery serves config
|
||||
keys through `__getattr__`, so monkeypatch sees no attribute to restore and
|
||||
deletes the key on undo instead; the delete raises, and every later undo of
|
||||
that test is skipped, leaking its patches into the tests after it.
|
||||
"""
|
||||
from backend.app.celery_app import celery
|
||||
|
||||
saved: dict[str, object] = {}
|
||||
|
||||
def _set(**values: object) -> None:
|
||||
for key in values:
|
||||
saved.setdefault(key, celery.conf[key])
|
||||
celery.conf.update(values)
|
||||
|
||||
yield _set
|
||||
celery.conf.update(saved)
|
||||
|
||||
|
||||
@pytest_asyncio.fixture
|
||||
async def app():
|
||||
return create_app()
|
||||
|
||||
Reference in New Issue
Block a user