test_protocol_sample_code_lock.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. """已落库样本编码在协议编辑中不可修改。"""
  2. from types import SimpleNamespace
  3. import pytest
  4. from app.crud.collection_protocol import validate_persisted_sample_codes_immutable
  5. def _row(*, sid="ps-1", code="OLD-001", code_id="pool-1"):
  6. return SimpleNamespace(id=sid, sample_code=code, sample_code_id=code_id)
  7. def test_rejects_code_change_when_persisted_id_present():
  8. existing = [_row()]
  9. with pytest.raises(ValueError, match="更正编码"):
  10. validate_persisted_sample_codes_immutable(
  11. existing,
  12. [{"id": "ps-1", "sampleCode": "NEW-001", "sampleCodeId": "pool-1"}],
  13. )
  14. def test_rejects_code_id_change_when_persisted_id_present():
  15. existing = [_row()]
  16. with pytest.raises(ValueError, match="更正编码"):
  17. validate_persisted_sample_codes_immutable(
  18. existing,
  19. [{"id": "ps-1", "sampleCode": "OLD-001", "sampleCodeId": "pool-other"}],
  20. )
  21. def test_allows_same_code_for_persisted_sample():
  22. existing = [_row()]
  23. validate_persisted_sample_codes_immutable(
  24. existing,
  25. [{"id": "ps-1", "sampleCode": "OLD-001", "sampleCodeId": "pool-1"}],
  26. )
  27. def test_allows_new_sample_without_id():
  28. existing = [_row()]
  29. validate_persisted_sample_codes_immutable(
  30. existing,
  31. [
  32. {"id": "ps-1", "sampleCode": "OLD-001", "sampleCodeId": "pool-1"},
  33. {"sampleCode": "NEW-002", "sampleCodeId": "pool-2"},
  34. ],
  35. )
  36. def test_ignores_unknown_id_as_new_sample():
  37. existing = [_row()]
  38. validate_persisted_sample_codes_immutable(
  39. existing,
  40. [{"id": "ps-unknown", "sampleCode": "ANY", "sampleCodeId": "x"}],
  41. )
  42. def test_trims_before_compare():
  43. existing = [_row(code="OLD-001", code_id="pool-1")]
  44. validate_persisted_sample_codes_immutable(
  45. existing,
  46. [{"id": "ps-1", "sample_code": " OLD-001 ", "sample_code_id": " pool-1 "}],
  47. )