mock 'time()' in cache tests

instead of calling 'sleep()' to let time advance.

This shortens the time needed to run those tests,
and ensures consistent results.
(Tests would randomly fail when using 'sleep()')
pull/750/head
Mike Fährmann 4 years ago
parent 42f29c3e11
commit 8b60bd6a91
No known key found for this signature in database
GPG Key ID: 5680CA389D365A88

@ -57,7 +57,7 @@ class MemoryCacheDecorator(CacheDecorator):
value, expires = self.cache[key]
except KeyError:
expires = 0
if expires < timestamp:
if expires <= timestamp:
value = self.func(*args, **kwargs)
expires = timestamp + self.maxage
self.cache[key] = value, expires

@ -10,8 +10,8 @@
import os
import sys
import unittest
from unittest.mock import patch
import time
import tempfile
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
@ -86,32 +86,50 @@ class TestCache(unittest.TestCase):
self.assertEqual(ka(9, 9, 2), 6)
def test_expires_mem(self):
@cache.memcache(maxage=1)
@cache.memcache(maxage=2)
def ex(a, b, c):
return a+b+c
self.assertEqual(ex(1, 1, 1), 3)
self.assertEqual(ex(2, 2, 2), 3)
self.assertEqual(ex(3, 3, 3), 3)
with patch("time.time") as tmock:
tmock.return_value = 0.001
self.assertEqual(ex(1, 1, 1), 3)
self.assertEqual(ex(2, 2, 2), 3)
self.assertEqual(ex(3, 3, 3), 3)
time.sleep(2)
self.assertEqual(ex(3, 3, 3), 9)
self.assertEqual(ex(2, 2, 2), 9)
self.assertEqual(ex(1, 1, 1), 9)
# value is still cached after 1 second
tmock.return_value += 1.0
self.assertEqual(ex(3, 3, 3), 3)
self.assertEqual(ex(2, 2, 2), 3)
self.assertEqual(ex(1, 1, 1), 3)
# new value after 'maxage' seconds
tmock.return_value += 1.0
self.assertEqual(ex(3, 3, 3), 9)
self.assertEqual(ex(2, 2, 2), 9)
self.assertEqual(ex(1, 1, 1), 9)
def test_expires_db(self):
@cache.cache(maxage=1)
@cache.cache(maxage=2)
def ex(a, b, c):
return a+b+c
self.assertEqual(ex(1, 1, 1), 3)
self.assertEqual(ex(2, 2, 2), 3)
self.assertEqual(ex(3, 3, 3), 3)
time.sleep(2)
self.assertEqual(ex(3, 3, 3), 9)
self.assertEqual(ex(2, 2, 2), 9)
self.assertEqual(ex(1, 1, 1), 9)
with patch("time.time") as tmock:
tmock.return_value = 0.999
self.assertEqual(ex(1, 1, 1), 3)
self.assertEqual(ex(2, 2, 2), 3)
self.assertEqual(ex(3, 3, 3), 3)
# value is still cached after 1 second
tmock.return_value += 1.0
self.assertEqual(ex(3, 3, 3), 3)
self.assertEqual(ex(2, 2, 2), 3)
self.assertEqual(ex(1, 1, 1), 3)
# new value after 'maxage' seconds
tmock.return_value += 1.0
self.assertEqual(ex(3, 3, 3), 9)
self.assertEqual(ex(2, 2, 2), 9)
self.assertEqual(ex(1, 1, 1), 9)
def test_update_mem_simple(self):
@cache.memcache(keyarg=0)

Loading…
Cancel
Save