From 4a7c82fcef1a99cac26907c4029fba149d77c46c Mon Sep 17 00:00:00 2001 From: "takemi.ohama" Date: Tue, 22 Sep 2026 06:17:48 +0900 Subject: [PATCH 1/2] =?UTF-8?q?chore:=20#209=20=E3=81=AE=E4=BD=9C=E6=A5=AD?= =?UTF-8?q?=E3=83=84=E3=83=AA=E3=83=BC=E3=82=92=E9=96=8B=E3=81=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pytest のセッション全体で DEVBASE_ROOT を隔離する作業の口を開ける。 Co-Authored-By: Claude Opus 5 (1M context) From 3b35134c1c5381039e9576395eef6a04c6c18090 Mon Sep 17 00:00:00 2001 From: "takemi.ohama" Date: Tue, 22 Sep 2026 06:30:49 +0900 Subject: [PATCH 2/2] =?UTF-8?q?test:=20pytest=20=E3=81=AE=E3=82=BB?= =?UTF-8?q?=E3=83=83=E3=82=B7=E3=83=A7=E3=83=B3=E5=85=A8=E4=BD=93=E3=81=A7?= =?UTF-8?q?=20DEVBASE=5FROOT=20=E3=82=92=E9=9A=94=E9=9B=A2=E3=81=99?= =?UTF-8?q?=E3=82=8B=20(#209)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pytest は実行したシェルの環境を継承するため、tmp の root を作るだけで setenv しない fixture を使うテストが、自前の `monkeypatch.setenv('DEVBASE_ROOT', ...)` を忘れると 実環境の devbase の `projects/` と `secrets/backend.yml` を読む。 fixture 1 つに setenv を足しても同じ穴は他にも残るため、`tests/conftest.py` に autouse fixture `_isolate_devbase_root` を置き、テストごとの空の tmp の root へ固定する (#209 の案 B)。autouse は同じ scope の明示の fixture より先に立つので、既存の 32 か所の setenv は書き換えずに後勝ちで働き、未設定の分岐を試す道 (delenv) も残る。 Co-Authored-By: Claude Opus 5 (1M context) --- tests/conftest.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index 40ba0348..9d5ac2cd 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -319,6 +319,29 @@ def do_GET(self): truncate=state.truncate_get_body) +@pytest.fixture(autouse=True) +def _isolate_devbase_root(tmp_path_factory, monkeypatch): + """継承した ``DEVBASE_ROOT`` を、テストごとの空の tmp の root へ置き換える (#209) + + pytest は実行したシェルの環境をそのまま継承する。``DEVBASE_ROOT`` を持つシェル + (ホストの Mac) から走らせると、tmp の root を作るだけで setenv しない fixture + (``openbao_root`` や各所の ``root``) を使うテストが、実環境の ``projects/`` と + ``secrets/backend.yml`` を読む。dev コンテナの中は持たないため、環境で再現したり + しなかったりする。 + + fixture 1 つに setenv を足しても同じ穴は他にも残るため、セッション全体をここで塞ぐ。 + autouse の fixture は同じ scope の明示の fixture より先に立つので、テストの側の + ``monkeypatch.setenv('DEVBASE_ROOT', ...)`` は後勝ちでそのまま働く。未設定の分岐を + 試すテストは、その場で ``monkeypatch.delenv('DEVBASE_ROOT', raising=False)`` と書く。 + + 値を空にせず tmp のディレクトリを指すのは、設定済みを既定にするためである。未設定を + 既定にすると、設定済みの分岐を試す側が毎回 setenv を書くことになり、今と変わらない。 + テストごとに別のディレクトリにするのは、setenv を忘れたテストがここへ書いても隣の + テストへ漏らさないためである。 + """ + monkeypatch.setenv('DEVBASE_ROOT', str(tmp_path_factory.mktemp('devbase-root'))) + + @pytest.fixture(autouse=True) def _release_shared_secret_store(): """持ち回りの SecretStore (PLAN55) をテストごとに捨て、控えが隣のテストへ漏れないようにする"""