def test_add_item_ignores_duplicate_resources(): mock1 = Mock(spec=ResourceSet) res = ResourceSet('foo') res.add_item(mock1) res.add_item(mock1) assert len(res._items) == 1
def test_add_item(): res = ResourceSet('foo') assert len(res._items) == 0 mock = Mock() res.add_item(mock) assert len(res._items) == 1 assert res._items[0] == mock
def test_resource_set_should_ignore_duplicate_executions(): mock1 = ResourceSet('boo') mock1.apply = Mock() res = ResourceSet('foo') res.add_item(mock1) res.apply() res.apply() res.apply() mock1.apply.assert_called_once_with()
def get_root(self): if not self.root_resource_set: self.root_resource_set = ResourceSet('root') self.current_resource_set = self.root_resource_set self.resource_set_stack.append(self.root_resource_set) self.resource_set_list.append(self.root_resource_set) return self.root_resource_set
def test_rollback_exec_sub_stets(): mock1 = Mock(spec=ResourceSet) mock1.is_executed.return_value = False mock2 = Mock(spec=ResourceSet, return_value=False) mock2.is_executed.return_value = False mock3 = Mock(spec=ResourceSet, return_value=False) mock3.is_executed.return_value = False res = ResourceSet('foo') res.add_item(mock1) res.add_item(mock2) res.add_item(mock3) res.rollback() mock1.rollback.assert_called_once_with() mock2.rollback.assert_called_once_with() mock3.rollback.assert_called_once_with()
def test_apply_in_rollback_mode(): mock1 = Mock(spec=ResourceSet) mock1.is_executed.return_value = False mock2 = Mock(spec=ResourceSet) mock2.is_executed.return_value = False mock3 = Mock(spec=ResourceSet) mock3.is_executed.return_value = False res = ResourceSet('foo') res.add_item(mock1) res.add_item(mock2) res.add_item(mock3) res.rollback_mode = True res.apply() mock1.rollback.assert_called_once_with() mock1.mark_executed.assert_called_once_with() mock2.rollback.assert_called_once_with() mock2.mark_executed.assert_called_once_with() mock3.rollback.assert_called_once_with() mock3.mark_executed.assert_called_once_with()
def test_apply_exec_sub_stets(): mock1 = Mock(spec=ResourceSet) mock1.is_executed.return_value = False mock2 = Mock(spec=ResourceSet) mock2.is_executed.return_value = False mock3 = Mock(spec=ResourceSet) mock3.is_executed.return_value = False res = ResourceSet('foo') res.add_item(mock1) res.add_item(mock2) res.add_item(mock3) res.apply() mock1.apply.assert_called_once_with() mock1.mark_executed.assert_called_once_with() mock2.apply.assert_called_once_with() mock2.mark_executed.assert_called_once_with() mock3.apply.assert_called_once_with() mock3.mark_executed.assert_called_once_with()
class Context(object): """ Worker collects resources and builds resource tree """ resources = None # this list holds all references to all resources resource_set_list = None # this list is used as a stack to determine current position inside resource_set tree resource_set_stack = None current_resource_set = None root_resource_set = None env = None def __init__(self): self.reset() def changeset(self): return ChangeSet(self.root_resource_set.apply()) def reset(self): self.env = Environment() self.resources = {} self.resource_set_list = [] self.resource_set_stack = [] self.resource_set_stack = [] self.current_resource_set = None self.root_resource_set = None # internal methods def register_resource(self, resource): """ Register resource or merge if it has conflicting id @param resource: Resource """ ids = resource.get_resource_keys() if ids is None: return items_to_add = [] if not ids: items_to_add.append(resource) else: for id_ in ids: if id_ in self.resources: self.resources[id_].resolve_conflict(resource) items_to_add.append(self.resources[id_]) else: self.resources[id_] = resource items_to_add.append(resource) for item in items_to_add: self.current_resource_set.add_item(item) def resource_set_begin(self, resource_set_instance): """ @param resource_set_instance: @return: """ current = self.get_current() # resource_set stack - push self.resource_set_stack.append(resource_set_instance) current.add_item(resource_set_instance) self.current_resource_set = resource_set_instance # add to resource list self.resource_set_list.append(resource_set_instance) def resource_set_end(self): """ Switch back to parent resource_set """ # resource_set stack - pop self.resource_set_stack.pop() if len(self.resource_set_stack) == 0: self.current_resource_set = None else: self.current_resource_set = self.resource_set_stack[-1] def get_root(self): if not self.root_resource_set: self.root_resource_set = ResourceSet('root') self.current_resource_set = self.root_resource_set self.resource_set_stack.append(self.root_resource_set) self.resource_set_list.append(self.root_resource_set) return self.root_resource_set def get_current(self): return self.current_resource_set or self.get_root() def apply(self, *args): res = self.get_current() for resource in args: res.add_item(resource) def to_xml(self): root = BeautifulSoup().new_tag("context") if self.root_resource_set: root.append(self.root_resource_set.to_xml()) return root