|
| 1 | +from unittest.mock import MagicMock, Mock |
| 2 | + |
| 3 | +import pytest |
| 4 | + |
| 5 | +from cadence.decision_loop import DecisionContext, ITask |
| 6 | +from cadence.replay_interceptor import make_replay_aware |
| 7 | +import cadence.decision_loop |
| 8 | + |
| 9 | +a_captured = None |
| 10 | +b_captured = None |
| 11 | + |
| 12 | + |
| 13 | +@pytest.fixture() |
| 14 | +def task_decision_context_replaying(): |
| 15 | + task: ITask = Mock() |
| 16 | + task.decider = Mock() |
| 17 | + decision_context = MagicMock() |
| 18 | + decision_context.is_replaying = Mock(return_value=True) |
| 19 | + task.decider.decision_context = decision_context |
| 20 | + return task |
| 21 | + |
| 22 | + |
| 23 | +@pytest.fixture() |
| 24 | +def task_decision_context_not_replaying(): |
| 25 | + task: ITask = Mock() |
| 26 | + task.decider = Mock() |
| 27 | + decision_context = MagicMock() |
| 28 | + decision_context.is_replaying = Mock(return_value=False) |
| 29 | + task.decider.decision_context = decision_context |
| 30 | + return task |
| 31 | + |
| 32 | + |
| 33 | +@pytest.fixture() |
| 34 | +def target(): |
| 35 | + return Target() |
| 36 | + |
| 37 | +class Target: |
| 38 | + def do_stuff(self, a, b=1): |
| 39 | + global a_captured, b_captured |
| 40 | + a_captured = a |
| 41 | + b_captured = b |
| 42 | + |
| 43 | + |
| 44 | +@pytest.mark.asyncio |
| 45 | +async def test_get_replay_aware_interceptor_not_replaying(task_decision_context_not_replaying, target: Target): |
| 46 | + cadence.decision_loop.current_task.set(task_decision_context_not_replaying) |
| 47 | + global a_captured, b_captured |
| 48 | + a_captured = None |
| 49 | + b_captured = None |
| 50 | + target = Target() |
| 51 | + original_fn = target.do_stuff |
| 52 | + make_replay_aware(target) |
| 53 | + assert target.do_stuff != original_fn |
| 54 | + target.do_stuff(20, b=30) |
| 55 | + assert a_captured == 20 |
| 56 | + assert b_captured == 30 |
| 57 | + |
| 58 | + |
| 59 | +@pytest.mark.asyncio |
| 60 | +async def test_get_replay_aware_interceptor_replaying(task_decision_context_replaying, target: Target): |
| 61 | + cadence.decision_loop.current_task.set(task_decision_context_replaying) |
| 62 | + global a_captured, b_captured |
| 63 | + a_captured = None |
| 64 | + b_captured = None |
| 65 | + original_fn = target.do_stuff |
| 66 | + make_replay_aware(target) |
| 67 | + assert target.do_stuff != original_fn |
| 68 | + target.do_stuff(20, b=30) |
| 69 | + assert a_captured is None |
| 70 | + assert b_captured is None |
0 commit comments