blob: 3a9adbdb1f6ddcd935067e0119fcce84e019527a [file]
import pytest
from unittest.mock import AsyncMock
from app.planners.atomic import LogicalPlanner
class AdversaryStub():
atomic_ordering = ['ability_a', 'ability_b', 'ability_c']
class OperationStub():
def __init__(self):
self.adversary = AdversaryStub()
self.agents = ['agent_1']
self.wait_for_links_completion = AsyncMock()
self.apply = AsyncMock(side_effect=self._apply_side_effect)
def _apply_side_effect(self, value):
return value.id
class PlanningSvcStub():
def __init__(self):
self.get_links = AsyncMock()
def set_link_return(self, links):
self.get_links = AsyncMock(return_value=links)
class AbilityStub():
def __init__(self, ability_id):
self.ability_id = ability_id
class LinkStub():
def __init__(self, ability_id):
self.ability = AbilityStub(ability_id)
self.id = 'link_' + ability_id
def __eq__(self, other):
return self.ability.ability_id == other.ability.ability_id and self.id == other.id
@pytest.fixture
def atomic_planner():
planner = LogicalPlanner(
operation=OperationStub(),
planning_svc=PlanningSvcStub()
)
return planner
class TestAtomic():
def test_atomic_with_links_in_order(self, event_loop, atomic_planner):
atomic_planner.planning_svc.set_link_return(
links=[
LinkStub('ability_b'),
LinkStub('ability_c')
]
)
event_loop.run_until_complete(atomic_planner.atomic())
assert atomic_planner.operation.apply.call_count == 1
assert atomic_planner.operation.wait_for_links_completion.call_count == 1
atomic_planner.operation.apply.assert_awaited_with(LinkStub('ability_b'))
atomic_planner.operation.wait_for_links_completion.assert_awaited_with(['link_ability_b'])
def test_atomic_with_links_out_of_order(self, event_loop, atomic_planner):
atomic_planner.planning_svc.set_link_return(
links=[
LinkStub('ability_c'),
LinkStub('ability_b')
]
)
event_loop.run_until_complete(atomic_planner.atomic())
assert atomic_planner.operation.apply.call_count == 1
assert atomic_planner.operation.wait_for_links_completion.call_count == 1
atomic_planner.operation.apply.assert_awaited_with(LinkStub('ability_b'))
atomic_planner.operation.wait_for_links_completion.assert_awaited_with(['link_ability_b'])
def test_atomic_no_links(self, event_loop, atomic_planner):
atomic_planner.planning_svc.set_link_return(
links=[]
)
event_loop.run_until_complete(atomic_planner.atomic())
assert atomic_planner.next_bucket is None
assert atomic_planner.operation.apply.call_count == 0
assert atomic_planner.operation.wait_for_links_completion.call_count == 0