|
|
@@ -539,6 +539,96 @@ def test_specialist_create_forces_current_sales_user_and_accepts_order_status():
|
|
|
assert row.order_status == "void"
|
|
|
|
|
|
|
|
|
+def test_create_rejects_client_requested_converted_status_without_writing():
|
|
|
+ from app.schemas.market_mobile import MarketPresignOrderBody
|
|
|
+ from app.services.market_presign import create_presign_order
|
|
|
+
|
|
|
+ db = _session()
|
|
|
+ _add_master_data(db)
|
|
|
+
|
|
|
+ with pytest.raises(ValueError, match='转正式|converted'):
|
|
|
+ create_presign_order(
|
|
|
+ db,
|
|
|
+ body=MarketPresignOrderBody.model_validate(
|
|
|
+ {
|
|
|
+ 'motherName': '不可直转客户',
|
|
|
+ 'regionId': 'region-a',
|
|
|
+ 'hospitalId': 'hospital-a',
|
|
|
+ 'orderStatus': 'converted',
|
|
|
+ }
|
|
|
+ ),
|
|
|
+ ctx=_ctx('specialist'),
|
|
|
+ user_info=_user(),
|
|
|
+ )
|
|
|
+
|
|
|
+ assert db.query(BizPresignOrder).count() == 0
|
|
|
+
|
|
|
+
|
|
|
+@pytest.mark.parametrize('current_status', ['active', 'draft', 'void'])
|
|
|
+def test_update_rejects_client_requested_converted_status_without_writing(
|
|
|
+ current_status,
|
|
|
+):
|
|
|
+ from app.schemas.market_mobile import MarketPresignOrderBody
|
|
|
+ from app.services.market_presign import update_presign_order
|
|
|
+
|
|
|
+ db = _session()
|
|
|
+ _add_master_data(db)
|
|
|
+ order = _order('own', sales_user_id='u1')
|
|
|
+ order.order_status = current_status
|
|
|
+ order.remark = 'before'
|
|
|
+ db.add(order)
|
|
|
+ db.commit()
|
|
|
+
|
|
|
+ with pytest.raises(ValueError, match='转正式|converted'):
|
|
|
+ update_presign_order(
|
|
|
+ db,
|
|
|
+ order_id='own',
|
|
|
+ body=MarketPresignOrderBody.model_validate(
|
|
|
+ {'orderStatus': 'converted', 'remark': 'after'}
|
|
|
+ ),
|
|
|
+ ctx=_ctx('specialist'),
|
|
|
+ user_info=_user(),
|
|
|
+ )
|
|
|
+
|
|
|
+ db.expire_all()
|
|
|
+ unchanged = db.query(BizPresignOrder).filter_by(id='own').one()
|
|
|
+ assert unchanged.order_status == current_status
|
|
|
+ assert unchanged.remark == 'before'
|
|
|
+
|
|
|
+
|
|
|
+def test_update_rolls_back_when_response_serialization_fails(monkeypatch):
|
|
|
+ from app.crud import presign_order as presign_crud
|
|
|
+ from app.schemas.market_mobile import MarketPresignOrderBody
|
|
|
+ from app.services.market_presign import update_presign_order
|
|
|
+
|
|
|
+ db = _session()
|
|
|
+ _add_master_data(db)
|
|
|
+ order = _order('own', sales_user_id='u1')
|
|
|
+ order.remark = 'before'
|
|
|
+ db.add(order)
|
|
|
+ db.commit()
|
|
|
+
|
|
|
+ monkeypatch.setattr(
|
|
|
+ presign_crud,
|
|
|
+ 'order_to_dict',
|
|
|
+ lambda *args, **kwargs: (_ for _ in ()).throw(
|
|
|
+ RuntimeError('serialize failed')
|
|
|
+ ),
|
|
|
+ )
|
|
|
+
|
|
|
+ with pytest.raises(RuntimeError, match='serialize failed'):
|
|
|
+ update_presign_order(
|
|
|
+ db,
|
|
|
+ order_id='own',
|
|
|
+ body=MarketPresignOrderBody(remark='after'),
|
|
|
+ ctx=_ctx('specialist'),
|
|
|
+ user_info=_user(),
|
|
|
+ )
|
|
|
+
|
|
|
+ db.expire_all()
|
|
|
+ assert db.query(BizPresignOrder).filter_by(id='own').one().remark == 'before'
|
|
|
+
|
|
|
+
|
|
|
def test_create_rolls_back_order_children_and_transfers_when_data_scope_rejects():
|
|
|
from app.schemas.market_mobile import MarketPresignOrderBody
|
|
|
from app.services.market_presign import create_presign_order
|