test_snapshot_helper.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from __future__ import annotations
  2. import json
  3. import pytest
  4. from tests import snapshot
  5. @pytest.fixture
  6. def snap_dir(tmp_path, monkeypatch):
  7. target = tmp_path / "snapshots"
  8. monkeypatch.setattr(snapshot, "SNAPSHOT_DIR", target)
  9. return target
  10. def test_missing_snapshot_fails_without_update(snap_dir, monkeypatch):
  11. monkeypatch.delenv("UPDATE_SNAPSHOTS", raising=False)
  12. with pytest.raises(AssertionError, match="snapshot missing"):
  13. snapshot.assert_matches("case/x", {"a": 1})
  14. def test_create_then_match(snap_dir, monkeypatch):
  15. monkeypatch.setenv("UPDATE_SNAPSHOTS", "1")
  16. snapshot.assert_matches("case/x", {"a": 1, "b": 2})
  17. assert (snap_dir / "case" / "x.json").exists()
  18. # Second run without update must compare-pass.
  19. monkeypatch.delenv("UPDATE_SNAPSHOTS", raising=False)
  20. snapshot.assert_matches("case/x", {"b": 2, "a": 1}) # key order irrelevant
  21. def test_mismatch_fails(snap_dir, monkeypatch):
  22. monkeypatch.setenv("UPDATE_SNAPSHOTS", "1")
  23. snapshot.assert_matches("case/y", {"a": 1})
  24. monkeypatch.delenv("UPDATE_SNAPSHOTS", raising=False)
  25. with pytest.raises(AssertionError, match="snapshot mismatch"):
  26. snapshot.assert_matches("case/y", {"a": 2})
  27. def test_subset_keys_ignore_volatile(snap_dir, monkeypatch):
  28. monkeypatch.setenv("UPDATE_SNAPSHOTS", "1")
  29. snapshot.assert_matches(
  30. "case/z", {"rejected": 4, "run_id": "v1_run_aaa"}, subset_keys=["rejected"]
  31. )
  32. data = json.loads((snap_dir / "case" / "z.json").read_text())
  33. assert data == {"rejected": 4}
  34. # Volatile run_id changes but snapshot still matches (not in subset).
  35. monkeypatch.delenv("UPDATE_SNAPSHOTS", raising=False)
  36. snapshot.assert_matches(
  37. "case/z", {"rejected": 4, "run_id": "v1_run_bbb"}, subset_keys=["rejected"]
  38. )
  39. def test_update_overwrites_mismatch(snap_dir, monkeypatch):
  40. monkeypatch.setenv("UPDATE_SNAPSHOTS", "1")
  41. snapshot.assert_matches("case/w", {"a": 1})
  42. snapshot.assert_matches("case/w", {"a": 99}) # regenerate
  43. monkeypatch.delenv("UPDATE_SNAPSHOTS", raising=False)
  44. snapshot.assert_matches("case/w", {"a": 99})