def test_append_in_order(monkeypatch): monkeypatch.setattr(Action, "set_info_streamer", MagicMock()) ap = ActionsPipeline() action1 = Action() action2 = Action() ap.append(action1) ap.append(action2) assert ap.actions == [action1, action2]
def test__action(): ap = ActionsPipeline() shared_result = SharedResultAction() action1 = Action(shared_result.gen_action("a")) action2 = Action(shared_result.gen_action("b")) ap.append(action1) ap.append(action2) ap.do() assert shared_result.result == "ab"
def test_simulate_until_error_undo(): ap = ActionsPipeline() shared_result = SharedResultAction() action1 = Action(shared_result.gen_action("a"), shared_result.gen_action("c")) ap.append(action1) action1_name = action1.get_name("action") with pytest.raises(ActionException): ap.simulate_until([(action1_name, {}), ("garbage", {})])
def test_undo_notify_exception(monkeypatch): notif_mock = MagicMock() monkeypatch.setattr(Action, "notify", notif_mock) action = Action(None, MagicMock(side_effect=Exception)) try: action.undo() except Exception: pass assert notif_mock.call_count == 2
def test_actions_are_accessible(): ap = ActionsPipeline() shared_result = SharedResultAction() action1 = Action(shared_result.gen_action("a")) action2 = Action(shared_result.gen_action("b")) ap.append(action1) ap.append(action2) assert ap.actions[1] # This should have no impact. ap.do() assert shared_result.result == "ab"
def test_set_info_streamer(monkeypatch): ap = ActionsPipeline() action1 = Action() action2 = Action() ap.append(action1) ap.append(action2) set_mock_1 = MagicMock() set_mock_2 = MagicMock() monkeypatch.setattr(action1, "set_info_streamer", set_mock_1) monkeypatch.setattr(action2, "set_info_streamer", set_mock_2) ap.set_info_streamer(InfoStreamer()) assert set_mock_1.called and set_mock_2.called
def test__rollback_action(): ap = ActionsPipeline() shared_result = SharedResultAction() action1 = Action(shared_result.gen_action("a"), shared_result.gen_action("c")) action2 = Action(shared_result.gen_action("b"), shared_result.gen_action("d")) ap.append(action1) ap.append(action2) ap.do() ap.undo() assert shared_result.result == "abdc"
def test_simulate_until(): ap = ActionsPipeline() shared_result = SharedResultAction() action1 = Action(shared_result.gen_action("a"), shared_result.gen_action("c")) action2 = Action(shared_result.gen_action("b"), shared_result.gen_action("d")) ap.append(action1) ap.append(action2) action1_name = action1.get_name("action") ap.simulate_until([(action1_name, {})]) ap.do() ap.undo() assert shared_result.result == "bdc"
def test__rollback_action_partial(): ap = ActionsPipeline() shared_result = SharedResultAction() action1 = Action(shared_result.gen_action("a"), shared_result.gen_action("c")) action2 = Action(MagicMock(side_effect=Exception()), shared_result.gen_action("d")) ap.append(action1) ap.append(action2) try: ap.do() except Exception: pass ap.undo() assert shared_result.result == "adc"
def test_add_context_manager_inner(action_type, function_to_call, result): ac = Action(lambda: 10, lambda: -10) csm = SharedContextManager() ac.add_context_manager(action_type, csm.gen_context_manager("b", "a")) ac.add_context_manager(action_type, csm.gen_context_manager("b2", "a2")) ac.add_context_manager(action_type, csm.gen_context_manager("b3", "a3"), inner=True) getattr(ac, function_to_call)() assert csm.result == result
def test_copy(): ap = ActionsPipeline() shared_result = SharedResultAction() action1 = Action(shared_result.gen_action("a"), shared_result.gen_action("c")) ap.append(action1) ap2 = copy(ap) ap.do() ap2.do() assert shared_result.result == "aa"
def test_context_manager_retry(): mock_action = MagicMock(side_effect=Exception) action = Action(mock_action) @action.action_context_manager @contextmanager def retry_do_3_times_if_it_fails(action): try: yield except Exception: action.retries = getattr(action, "retries", 0) + 1 if action.retries < 3: action.do() else: raise with pytest.raises(Exception): action.do() assert mock_action.call_count == 3
def test_classic_context_manager(): # Purpose of this test is to check that classic context manager works too action = Action(action_fct=lambda: 10) @action.action_context_manager class ContextManager(object): def __init__(self, action): self.action = action def __enter__(self): # May use self.action pass def __exit__(self, *args, **kwargs): # May use self.action pass ContextManager.__enter__ = MagicMock() ContextManager.__exit__ = MagicMock() action.do() assert ContextManager.__enter__.called assert ContextManager.__exit__.called
def test_simulate_until_partial(): ap = ActionsPipeline() shared_result = SharedResultAction() action1 = Action(shared_result.gen_action("a"), shared_result.gen_action("c")) action2 = Action(shared_result.gen_action("b"), shared_result.gen_action("d")) ap.append(action1) ap.append(action2) # Mandatory to redefine names unless they all have the same name and simulate can't work fine. action1.set_name("action", "action1") action1.set_name("rollback", "rollback1") ap.simulate_until([("action1", {}), ("rollback1", {})]) ap.undo() assert shared_result.result == ""
def test_rollback_context_manager(monkeypatch): monkeypatch.setattr(Action, "add_context_manager", MagicMock()) action = Action() assert action.rollback_context_manager(MagicMock())
def test_add_context_manager_bad_side(): with pytest.raises(ActionException): Action().add_context_manager("bad_side", "osef")
def test_get_name_not_set(monkeypatch, action_side): format_fct_name_mock = MagicMock() monkeypatch.setattr("pysyphe.actions._format_fct_name", format_fct_name_mock) Action().get_name(action_side) assert format_fct_name_mock.called
def test_set_info_streamer_none(): with pytest.raises(ActionException): Action().set_info_streamer(None)
def test_set_info_streamer(): Action().set_info_streamer(InfoStreamer())
def test_init_with_list(): action = Action() action2 = Action() ap = ActionsPipeline([action, action2]) assert ap.actions[0] == action and ap.actions[1] == action2
def test_copy(): a = Action(lambda: 10, lambda: -10) a.add_context_manager("action", MagicMock()) a.add_context_manager("rollback", MagicMock()) assert copy(a)
def test_simulate(): Action(lambda: 10, lambda: -10).simulate()
def test_init(): assert Action()
def test_init_2(): assert Action(lambda: 10, lambda: -10)
def test_get_name_bad_side(): with pytest.raises(ActionException): Action().get_name("bad_side")
def test_name(): a = Action(lambda: 10) a.name = "yolo" assert a.name == "yolo"
def test_append(monkeypatch): monkeypatch.setattr(Action, "set_info_streamer", MagicMock()) ap = ActionsPipeline() action = Action() ap.append(action) assert ap.actions[0] == action
def test_notify(monkeypatch, action_side, step, kwargs): send_info_mock = MagicMock() monkeypatch.setattr(InfoStreamer, "send_info", send_info_mock) kwargs = kwargs or {} Action(lambda: 10, lambda: 10).notify(action_side, step, **kwargs) assert send_info_mock.called
def test_set_name_bad_side(): with pytest.raises(ActionException): Action().set_name("bad_side", "osef")
def test_rollback_name(): a = Action(lambda: 10) a.rollback_name = "yolo" assert a.rollback_name == "yolo"