Import AITURK IDE 1.0.0-beta.1 from Hermes 63279301; preserve MIT license
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
"""Shared fixtures for CLI tests.
|
||||
|
||||
prompt_toolkit / capsys isolation
|
||||
---------------------------------
|
||||
``cli._cprint`` renders through ``prompt_toolkit.print_formatted_text``,
|
||||
which — when called with no explicit ``output=`` — lazily creates an
|
||||
``Output`` from ``sys.stdout`` **and caches it on the process-global default
|
||||
``AppSession``** (``prompt_toolkit.application.current._current_app_session``,
|
||||
a ``ContextVar`` with a module-level default). The cache is keyed to nothing
|
||||
and never re-reads ``sys.stdout``.
|
||||
|
||||
Under pytest, ``capsys`` swaps ``sys.stdout`` for a fresh buffer per test.
|
||||
So the first CLI test that emits through ``_cprint`` (e.g. one exercising
|
||||
``/queue``, which prints a "Queued: …" line) locks prompt_toolkit's cached
|
||||
output onto *its* captured stdout. Every later ``capsys`` test that asserts
|
||||
on ``_cprint`` output then reads an empty buffer, because the render went to
|
||||
the first test's now-dead capture target. That is the mechanism behind the
|
||||
order-dependent ``test_resume_quiet_stderr`` failure: it passes in isolation
|
||||
and in its own file, but fails in a full ``tests/cli`` run.
|
||||
|
||||
Reset the cached output before every CLI test so each one re-creates a fresh
|
||||
prompt_toolkit ``Output`` bound to its own ``sys.stdout`` on first use. This
|
||||
is a no-op when prompt_toolkit isn't importable and cheap otherwise (the
|
||||
property re-creates lazily).
|
||||
"""
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def _reset_prompt_toolkit_output_cache():
|
||||
"""Clear prompt_toolkit's cached AppSession output around each CLI test.
|
||||
|
||||
See the module docstring for the capsys/prompt_toolkit interaction this
|
||||
guards against.
|
||||
"""
|
||||
|
||||
def _clear() -> None:
|
||||
try:
|
||||
from prompt_toolkit.application.current import get_app_session
|
||||
|
||||
get_app_session()._output = None
|
||||
except Exception:
|
||||
# prompt_toolkit not importable / internal shape changed — the
|
||||
# tests that rely on this simply keep their prior behavior.
|
||||
pass
|
||||
|
||||
_clear()
|
||||
yield
|
||||
_clear()
|
||||
Reference in New Issue
Block a user