def test_run_script_in_loop(self): """_run_script_thread should continue re-running its script while it has pending rerun requests.""" scriptrunner = TestScriptRunner("not_a_script.py") # ScriptRequests.on_scriptrunner_ready will return 3 rerun requests, # and then stop. on_scriptrunner_ready_mock = MagicMock() on_scriptrunner_ready_mock.side_effect = [ ScriptRequest(ScriptRequestType.RERUN, RerunData()), ScriptRequest(ScriptRequestType.RERUN, RerunData()), ScriptRequest(ScriptRequestType.RERUN, RerunData()), ScriptRequest(ScriptRequestType.STOP), ] scriptrunner._requests.on_scriptrunner_ready = on_scriptrunner_ready_mock run_script_mock = MagicMock() scriptrunner._run_script = run_script_mock scriptrunner.start() scriptrunner.join() # _run_script should have been called 3 times, once for each # RERUN request. self._assert_no_exceptions(scriptrunner) self.assertEqual(3, run_script_mock.call_count)
def test_maybe_handle_execution_control_request(self): """maybe_handle_execution_control_request should no-op if called from another thread. """ runner = TestScriptRunner("not_a_script.py") runner._execing = True # Mock ScriptRequests.on_scriptrunner_yield(). It will return a fake # rerun request. requests_mock = MagicMock() requests_mock.on_scriptrunner_yield = MagicMock( return_value=ScriptRequest(ScriptRequestType.RERUN, RerunData())) runner._requests = requests_mock # If _is_in_script_thread is False, our request shouldn't get popped runner._is_in_script_thread = MagicMock(return_value=False) runner._maybe_handle_execution_control_request() requests_mock.on_scriptrunner_yield.assert_not_called() # If _is_in_script_thread is True, our rerun request should get # popped (and this will result in a RerunException being raised). runner._is_in_script_thread = MagicMock(return_value=True) with self.assertRaises(RerunException): runner._maybe_handle_execution_control_request() requests_mock.on_scriptrunner_yield.assert_called_once()
def test_on_script_yield_with_stop_request(self): """Return STOP; remain in the STOP state.""" reqs = ScriptRequests() reqs.request_stop() result = reqs.on_scriptrunner_yield() self.assertEqual(ScriptRequest(ScriptRequestType.STOP), result) self.assertEqual(ScriptRequestType.STOP, reqs._state)
def test_on_script_complete_with_pending_request(self): """Return RERUN; transition to the CONTINUE state.""" reqs = ScriptRequests() reqs.request_rerun(RerunData()) result = reqs.on_scriptrunner_ready() self.assertEqual(ScriptRequest(ScriptRequestType.RERUN, RerunData()), result) self.assertEqual(ScriptRequestType.CONTINUE, reqs._state)
def test_on_script_complete_with_no_request(self): """Return STOP; transition to the STOP state.""" reqs = ScriptRequests() result = reqs.on_scriptrunner_ready() self.assertEqual(ScriptRequest(ScriptRequestType.STOP), result) self.assertEqual(ScriptRequestType.STOP, reqs._state)