changeset 3644:71860d0737e7 beta

- age tests cannot be dynamic, there are cases when age calculation doesn't work - use parametrized to test age
author Marcin Kuzminski <marcin@python-works.com>
date Sun, 31 Mar 2013 19:31:50 +0200
parents 2a7cbc53f65a
children aef5f5ce5ead
files rhodecode/lib/utils2.py rhodecode/tests/test_libs.py
diffstat 2 files changed, 37 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/lib/utils2.py	Sun Mar 31 19:26:52 2013 +0200
+++ b/rhodecode/lib/utils2.py	Sun Mar 31 19:31:50 2013 +0200
@@ -353,7 +353,7 @@
     return engine
 
 
-def age(prevdate, show_short_version=False):
+def age(prevdate, show_short_version=False, now=None):
     """
     turns a datetime into an age string.
     If show_short_version is True, then it will generate a not so accurate but shorter string,
@@ -364,8 +364,7 @@
     :rtype: unicode
     :returns: unicode words describing age
     """
-    now = datetime.datetime.now()
-    now = now.replace(microsecond=0)
+    now = now or datetime.datetime.now()
     order = ['year', 'month', 'day', 'hour', 'minute', 'second']
     deltas = {}
     future = False
@@ -373,15 +372,13 @@
     if prevdate > now:
         now, prevdate = prevdate, now
         future = True
-
+    if future:
+        prevdate = prevdate.replace(microsecond=0)
     # Get date parts deltas
+    from dateutil import relativedelta
     for part in order:
-        if future:
-            from dateutil import relativedelta
-            d = relativedelta.relativedelta(now, prevdate)
-            deltas[part] = getattr(d, part + 's')
-        else:
-            deltas[part] = getattr(now, part) - getattr(prevdate, part)
+        d = relativedelta.relativedelta(now, prevdate)
+        deltas[part] = getattr(d, part + 's')
 
     # Fix negative offsets (there is 1 second between 10:59:59 and 11:00:00,
     # not 1 hour, -59 minutes and -59 seconds)
--- a/rhodecode/tests/test_libs.py	Sun Mar 31 19:26:52 2013 +0200
+++ b/rhodecode/tests/test_libs.py	Sun Mar 31 19:31:50 2013 +0200
@@ -114,37 +114,42 @@
         ], key=lambda k: k.lower())
         self.assertEqual(s, extract_mentioned_users(sample))
 
-    def test_age(self):
+    @parameterized.expand([
+        (dict(), u'just now'),
+        (dict(seconds= -1), u'1 second ago'),
+        (dict(seconds= -60 * 2), u'2 minutes ago'),
+        (dict(hours= -1), u'1 hour ago'),
+        (dict(hours= -24), u'1 day ago'),
+        (dict(hours= -24 * 5), u'5 days ago'),
+        (dict(months= -1), u'1 month ago'),
+        (dict(months= -1, days= -2), u'1 month and 2 days ago'),
+        (dict(years= -1, months= -1), u'1 year and 1 month ago'),
+    ])
+    def test_age(self, age_args, expected):
         from rhodecode.lib.utils2 import age
         from dateutil import relativedelta
-        n = datetime.datetime.now()
+        n = datetime.datetime(year=2012, month=5, day=17)
         delt = lambda *args, **kwargs: relativedelta.relativedelta(*args, **kwargs)
+        self.assertEqual(age(n + delt(**age_args), now=n), expected)
+
+    @parameterized.expand([
 
-        self.assertEqual(age(n), u'just now')
-        self.assertEqual(age(n + delt(seconds=-1)), u'1 second ago')
-        self.assertEqual(age(n + delt(seconds=-60 * 2)), u'2 minutes ago')
-        self.assertEqual(age(n + delt(hours=-1)), u'1 hour ago')
-        self.assertEqual(age(n + delt(hours=-24)), u'1 day ago')
-        self.assertEqual(age(n + delt(hours=-24 * 5)), u'5 days ago')
-        self.assertEqual(age(n + delt(months=-1)), u'1 month ago')
-        self.assertEqual(age(n + delt(months=-1, days=-2)), u'1 month and 2 days ago')
-        self.assertEqual(age(n + delt(years=-1, months=-1)), u'1 year and 1 month ago')
-
-    def test_age_in_future(self):
+        (dict(), u'just now'),
+        (dict(seconds=1), u'in 1 second'),
+        (dict(seconds=60 * 2), u'in 2 minutes'),
+        (dict(hours=1), u'in 1 hour'),
+        (dict(hours=24), u'in 1 day'),
+        (dict(hours=24 * 5), u'in 5 days'),
+        (dict(months=1), u'in 1 month'),
+        (dict(months=1, days=1), u'in 1 month and 1 day'),
+        (dict(years=1, months=1), u'in 1 year and 1 month')
+    ])
+    def test_age_in_future(self, age_args, expected):
         from rhodecode.lib.utils2 import age
         from dateutil import relativedelta
-        n = datetime.datetime.now()
+        n = datetime.datetime(year=2012, month=5, day=17)
         delt = lambda *args, **kwargs: relativedelta.relativedelta(*args, **kwargs)
-
-        self.assertEqual(age(n), u'just now')
-        self.assertEqual(age(n + delt(seconds=1)), u'in 1 second')
-        self.assertEqual(age(n + delt(seconds=60 * 2)), u'in 2 minutes')
-        self.assertEqual(age(n + delt(hours=1)), u'in 1 hour')
-        self.assertEqual(age(n + delt(hours=24)), u'in 1 day')
-        self.assertEqual(age(n + delt(hours=24 * 5)), u'in 5 days')
-        self.assertEqual(age(n + delt(months=1)), u'in 1 month')
-        self.assertEqual(age(n + delt(months=1, days=1)), u'in 1 month and 1 day')
-        self.assertEqual(age(n + delt(years=1, months=1)), u'in 1 year and 1 month')
+        self.assertEqual(age(n + delt(**age_args), now=n), expected)
 
     def test_tag_exctrator(self):
         sample = (
@@ -216,7 +221,7 @@
         :param text:
         """
         import re
-        #quickly change expected url[] into a link
+        # quickly change expected url[] into a link
         URL_PAT = re.compile(r'(?:url\[)(.+?)(?:\])')
 
         def url_func(match_obj):