From f4562bc69b02f716a4112e660e74837fcbbe5e76 Mon Sep 17 00:00:00 2001 From: Max Marrone Date: Fri, 4 Oct 2024 21:00:43 -0400 Subject: [PATCH] Update test_door_ungrip_labware(). --- .../state/test_command_state.py | 76 +++++++++---------- 1 file changed, 35 insertions(+), 41 deletions(-) diff --git a/api/tests/opentrons/protocol_engine/state/test_command_state.py b/api/tests/opentrons/protocol_engine/state/test_command_state.py index 6a76f2a8b0f..6f090612a74 100644 --- a/api/tests/opentrons/protocol_engine/state/test_command_state.py +++ b/api/tests/opentrons/protocol_engine/state/test_command_state.py @@ -557,8 +557,9 @@ def test_door_during_error_recovery() -> None: assert subject.state.failed_command_errors == [expected_error_occurance] -def test_door_ungrip_labware() -> None: - """Test behavior when the door is opened during error recovery ungrip.""" +@pytest.mark.parametrize("close_door_before_queueing", [False, True]) +def test_door_ungrip_labware(close_door_before_queueing: bool) -> None: + """Ungrip commands should be able to run even when the door is open.""" subject = CommandStore( is_door_open=False, error_recovery_policy=_placeholder_error_recovery_policy, @@ -572,68 +573,61 @@ def test_door_ungrip_labware() -> None: subject_view = CommandView(subject.state) # Fail a command to put the subject in recovery mode. - queue_1 = actions.QueueCommandAction( + queue_failing = actions.QueueCommandAction( request=commands.CommentCreate( params=commands.CommentParams(message=""), key="command-key-1" ), request_hash=None, created_at=datetime(year=2021, month=1, day=1), - command_id="command-id-1", + command_id="failing-command-id", ) - subject.handle_action(queue_1) - run_1 = actions.RunCommandAction( - command_id="command-id-1", + subject.handle_action(queue_failing) + run_failing = actions.RunCommandAction( + command_id="failing-command-id", started_at=datetime(year=2022, month=2, day=2), ) - subject.handle_action(run_1) + subject.handle_action(run_failing) expected_error = errors.ProtocolEngineError(message="oh no") - expected_error_occurance = errors.ErrorOccurrence( - id="error-id", - errorType="ProtocolEngineError", - createdAt=datetime(year=2023, month=3, day=3), - detail="oh no", - errorCode=ErrorCodes.GENERAL_ERROR.value.code, - ) - fail_1 = actions.FailCommandAction( - command_id="command-id-1", - running_command=subject_view.get("command-id-1"), + fail_failing = actions.FailCommandAction( + command_id="failing-command-id", + running_command=subject_view.get("failing-command-id"), error_id="error-id", failed_at=datetime(year=2023, month=3, day=3), error=expected_error, notes=[], type=ErrorRecoveryType.WAIT_FOR_RECOVERY, ) - subject.handle_action(fail_1) + subject.handle_action(fail_failing) - queue_2 = actions.QueueCommandAction( + # Open the door: + subject.handle_action(actions.DoorChangeAction(DoorState.OPEN)) + assert ( + subject_view.get_status() == EngineStatus.AWAITING_RECOVERY_BLOCKED_BY_OPEN_DOOR + ) + assert subject_view.get_next_to_execute() is None + + if close_door_before_queueing: + subject.handle_action(actions.DoorChangeAction(DoorState.CLOSED)) + + assert subject_view.get_status() in ( + EngineStatus.AWAITING_RECOVERY_PAUSED, # If we closed the door. + EngineStatus.AWAITING_RECOVERY_BLOCKED_BY_OPEN_DOOR, # If we didn't. + ) + + # Make sure the special ungrip command can be queued and that it will be returned + # as next to execute: + queue_fixit = actions.QueueCommandAction( request=commands.unsafe.UnsafeUngripLabwareCreate( params=commands.unsafe.UnsafeUngripLabwareParams(), intent=CommandIntent.FIXIT, ), request_hash=None, created_at=datetime(year=2021, month=1, day=1), - command_id="command-id-2", + command_id="fixit-command-id", ) - subject.handle_action(queue_2) - assert subject_view.get_status() == EngineStatus.AWAITING_RECOVERY - assert subject_view.get_next_to_execute() == "command-id-2" - - # Test state after we open the door: - subject.handle_action(actions.DoorChangeAction(DoorState.OPEN)) - assert ( - subject_view.get_status() == EngineStatus.AWAITING_RECOVERY_BLOCKED_BY_OPEN_DOOR - ) - assert subject_view.get_next_to_execute() == "command-id-2" - play = actions.PlayAction(requested_at=datetime.now()) - action = subject_view.validate_action_allowed(play) - - assert action == play - - # Test state when we resume recovery mode: - subject.handle_action(play) - assert subject_view.get_status() == EngineStatus.AWAITING_RECOVERY - assert subject_view.get_next_to_execute() == "command-id-2" - assert subject.state.failed_command_errors == [expected_error_occurance] + subject_view.validate_action_allowed(queue_fixit) + subject.handle_action(queue_fixit) + assert subject_view.get_next_to_execute() == "fixit-command-id" @pytest.mark.parametrize(