修复:校验托盘状态类型

This commit is contained in:
焦龙言
2026-07-24 19:53:04 +08:00
parent bab09f4eb3
commit cb3bf5bf4c
2 changed files with 32 additions and 3 deletions
@@ -32,7 +32,8 @@ class PalletStateMachine:
current: PalletFlowState, current: PalletFlowState,
target: PalletFlowState, target: PalletFlowState,
) -> None: ) -> None:
if not isinstance(current, PalletFlowState) or not isinstance(target, PalletFlowState):
raise TypeError('current 和 target 必须是 PalletFlowState')
if (current, target) not in cls._ALLOWED_TRANSITIONS: if (current, target) not in cls._ALLOWED_TRANSITIONS:
raise InvalidPalletTransition( raise InvalidPalletTransition(f'不允许的托盘状态迁移:{current.value} -> {target.value}')
f'不允许的托盘状态迁移:{current.value} -> {target.value}'
)
@@ -39,6 +39,22 @@ class PalletStateMachineTest(unittest.TestCase):
PalletFlowState.FILLED_IN_WAREHOUSE, PalletFlowState.FILLED_IN_WAREHOUSE,
) )
def test_raw_string_states_are_rejected(self) -> None:
with self.assertRaisesRegex(TypeError, 'PalletFlowState'):
PalletStateMachine.ensure_transition(
'UNSTOCKED',
'EMPTY_IN_WAREHOUSE',
)
def test_mixed_state_types_are_rejected(self) -> None:
mixed_states = (
('UNSTOCKED', PalletFlowState.EMPTY_IN_WAREHOUSE),
(PalletFlowState.UNSTOCKED, 'EMPTY_IN_WAREHOUSE'),
)
for current, target in mixed_states:
with self.subTest(current=current, target=target), self.assertRaisesRegex(TypeError, 'PalletFlowState'):
PalletStateMachine.ensure_transition(current, target)
def test_confirmed_flow_is_the_only_allowed_transition_set(self) -> None: def test_confirmed_flow_is_the_only_allowed_transition_set(self) -> None:
actual_allowed = set() actual_allowed = set()
for current in PalletFlowState: for current in PalletFlowState:
@@ -54,6 +70,18 @@ class PalletStateMachineTest(unittest.TestCase):
class PalletEnumTest(unittest.TestCase): class PalletEnumTest(unittest.TestCase):
def test_supporting_enum_values_match_domain_contract(self) -> None: def test_supporting_enum_values_match_domain_contract(self) -> None:
self.assertEqual(
[
'UNSTOCKED',
'EMPTY_IN_WAREHOUSE',
'FILLED_IN_WAREHOUSE',
'AT_SITE_UNUSED',
'AT_SITE_PARTIAL',
'AT_SITE_EMPTY',
'RETURNING',
],
[item.value for item in PalletFlowState],
)
self.assertEqual(['DRAFT', 'CONFIRMED'], [item.value for item in DocumentStatus]) self.assertEqual(['DRAFT', 'CONFIRMED'], [item.value for item in DocumentStatus])
self.assertEqual( self.assertEqual(
['REQUESTED', 'CONFIRMED'], ['REQUESTED', 'CONFIRMED'],