Created
August 30, 2013 13:19
-
-
Save milibopp/6389779 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def test_weak_and_lazy_loading(): | |
'''Test loading/saving of model references''' | |
class ChainMember(Model): | |
'''This is a simple infinite chain of models referencing each other.''' | |
def __init__(self, number, prev_member=None, next_member=None): | |
Model.__init__(self) | |
self.number = number | |
self.prev_member = ref(prev_member, prev_member.model_id if prev_member is not None else None) | |
self.next_member = ref(next_member, next_member.model_id if next_member is not None else None) | |
@weak_and_lazy | |
def prev_member(self, model_id): | |
try: | |
return self.loader.load(model_id) | |
except KeyError: | |
new_chain = ChainMember(self.number - 1, None, self) | |
self.loader.register(new_chain) | |
return new_chain | |
@weak_and_lazy | |
def next_member(self, model_id): | |
try: | |
return self.loader.load(model_id) | |
except KeyError: | |
new_chain = ChainMember(self.number + 1, self, None) | |
self.loader.register(new_chain) | |
return new_chain | |
# Instantiate loader | |
loader = DefaultLoader() | |
# Create a chain and register it | |
c1 = ChainMember(1) | |
loader.register(c1) | |
# Obtain more members | |
c2 = c1.next_member | |
assert c2.number == 2 | |
c3 = c2.next_member | |
assert c3.prev_member is c1.next_member | |
# Test the loading from the backend by asserting identity after deleting | |
# the second chain member | |
print c2 | |
del c2 | |
print id(c3.prev_member) | |
print id(c1.next_member) | |
assert c3.prev_member is c1.next_member | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment