Files
zkxw/backend/tests/test_save_samples_keeps_id.py
zlwuandCursor 5e563a6669 fix: 子表保存改为就地同步,避免整批换 id 打断外键。
协议样本、生产产出和盘点明细按行更新并保留原 id;补齐存储证明质检预填、离职人员显示名,以及样本采集通知模板字段。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-28 10:51:53 +08:00

135 lines
4.5 KiB
Python

"""协议样本保存保留原行 ID,避免下游外键被整表替换打断。"""
import unittest
from datetime import datetime
from unittest.mock import patch
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from app.crud.collection_protocol import save_samples
from app.crud.research_donation import _create_samples
from app.models.models import BizProtocolSample
from app.models.research_donation import (
BizResearchDonationSample,
BizResearchDonationSampleTransport,
)
def _session():
engine = create_engine("sqlite://")
BizProtocolSample.__table__.create(bind=engine)
return sessionmaker(bind=engine)()
def _sample(**kwargs):
now = datetime(2026, 10, 27, 9, 0, 0)
data = dict(
collection_protocol_id="proto-1",
tenant_no="tenant-a",
create_dept_id="",
create_time=now,
update_time=now,
del_flag=0,
)
data.update(kwargs)
return BizProtocolSample(**data)
class TestSaveSamplesKeepsIdentity(unittest.TestCase):
def test_existing_sample_keeps_id_and_removed_sample_is_soft_deleted(self):
db = _session()
db.add(_sample(id="sample-keep", sample_code="SC001"))
db.add(_sample(id="sample-drop", sample_code="SC002"))
db.commit()
with patch("app.crud.sample_freight.apply_freight_on_protocol_save"), patch(
"app.crud.collection_protocol.save_sample_transports"
), patch("app.crud.collection_protocol._migrate_sample_child_refs_on_replace"):
saved = save_samples(
db,
"proto-1",
"tenant-a",
"user-1",
[{"id": "sample-keep", "sample_code": "SC001", "remark": "改备注"}],
)
self.assertEqual(saved[0].id, "sample-keep")
self.assertEqual(saved[0].remark, "改备注")
rows = {row.id: row for row in db.query(BizProtocolSample).all()}
self.assertEqual(rows["sample-keep"].del_flag, 0)
self.assertEqual(rows["sample-drop"].del_flag, 1)
def test_same_sample_code_without_id_still_keeps_row(self):
db = _session()
db.add(_sample(id="sample-keep", sample_code="SC001", remark="旧"))
db.commit()
with patch("app.crud.sample_freight.apply_freight_on_protocol_save"), patch(
"app.crud.collection_protocol.save_sample_transports"
), patch("app.crud.collection_protocol._migrate_sample_child_refs_on_replace"):
saved = save_samples(
db,
"proto-1",
"tenant-a",
"user-1",
[{"sample_code": "SC001", "remark": "新"}],
)
self.assertEqual(saved[0].id, "sample-keep")
self.assertEqual(saved[0].remark, "新")
self.assertEqual(db.query(BizProtocolSample).filter_by(del_flag=0).count(), 1)
class TestDonationSamplesKeepIdentity(unittest.TestCase):
def test_existing_donation_sample_keeps_id(self):
engine = create_engine("sqlite://")
BizResearchDonationSample.__table__.create(bind=engine)
BizResearchDonationSampleTransport.__table__.create(bind=engine)
db = sessionmaker(bind=engine)()
now = datetime(2026, 10, 27, 9, 0, 0)
db.add(
BizResearchDonationSample(
id="don-keep",
research_donation_id="don-1",
tenant_no="tenant-a",
sample_code="DN001",
create_dept_id="",
create_time=now,
update_time=now,
del_flag=0,
)
)
db.add(
BizResearchDonationSample(
id="don-drop",
research_donation_id="don-1",
tenant_no="tenant-a",
sample_code="DN002",
create_dept_id="",
create_time=now,
update_time=now,
del_flag=0,
)
)
db.commit()
saved = _create_samples(
db,
"don-1",
"tenant-a",
"user-1",
[{"sample_code": "DN001", "remark": "留下"}],
now,
)
self.assertEqual(saved[0].id, "don-keep")
self.assertEqual(saved[0].remark, "留下")
rows = {row.id: row for row in db.query(BizResearchDonationSample).all()}
self.assertEqual(rows["don-keep"].del_flag, 0)
self.assertEqual(rows["don-drop"].del_flag, 1)
if __name__ == "__main__":
unittest.main()