pillar/tests/test_web/test_utils.py
Sybren A. Stüvel a9e40ccf10 Python 3.6 compatibility: bytes vs strings stuff
These changes mostly revolve around the change in ObjectId constructor
when running on Python 3.6. Where on 2.7 the constructor would accept
12- and 24-byte strings, now only 12-byte bytes and 24-character strings
are accepted. Good thing, but required some changes in our code.

Other changes include hashing of strings, which isn't supported, so they
are converted to bytes first, and sometimes converted back afterwards.
2017-03-03 14:14:36 +01:00

123 lines
4.7 KiB
Python

# -*- encoding: utf-8 -*-
import unittest
import datetime
from bson import tz_util
from pillar.web import utils
class IsValidIdTest(unittest.TestCase):
def test_valid(self):
# 24-byte hex strings
self.assertTrue(utils.is_valid_id(24 * 'a'))
self.assertTrue(utils.is_valid_id(24 * 'a'))
self.assertTrue(utils.is_valid_id('deadbeefbeefcacedeadcace'))
self.assertTrue(utils.is_valid_id('deadbeefbeefcacedeadcace'))
# 12-byte arbitrary ASCII bytes
self.assertTrue(utils.is_valid_id(b'DeadBeefCake'))
self.assertTrue(utils.is_valid_id(b'DeadBeefCake'))
# 12-byte object
self.assertTrue(utils.is_valid_id('beef€67890'.encode()))
def test_bad_length(self):
self.assertFalse(utils.is_valid_id(23 * 'a'))
self.assertFalse(utils.is_valid_id(25 * 'a'))
def test_non_string(self):
self.assertFalse(utils.is_valid_id(None))
self.assertFalse(utils.is_valid_id(1234))
self.assertFalse(utils.is_valid_id([24 * 'a']))
def test_bad_content(self):
# 24-character non-hexadecimal string
self.assertFalse(utils.is_valid_id('deadbeefbeefcakedeadcake'))
# unicode variant of valid 12-byte str object
self.assertFalse(utils.is_valid_id('beef€67890'))
class PrettyDateTest(unittest.TestCase):
def test_none(self):
from pillar.web.utils import pretty_date
self.assertIsNone(pretty_date(None))
def test_past(self):
from pillar.web.utils import pretty_date
now = datetime.datetime(2016, 11, 8, 11, 46, 30, 0, tz_util.utc) # a Tuesday
def pd(**diff):
return pretty_date(now - datetime.timedelta(**diff), now=now)
self.assertEqual('just now', pd(seconds=5))
self.assertEqual('5m ago', pd(minutes=5))
self.assertEqual('last Tuesday', pd(days=7))
self.assertEqual('1 week ago', pd(days=8))
self.assertEqual('2 weeks ago', pd(days=14))
self.assertEqual('08 Oct', pd(days=31))
self.assertEqual('08 Oct 2015', pd(days=31 + 366))
def test_future(self):
from pillar.web.utils import pretty_date
def pd(**diff):
return pretty_date(now + datetime.timedelta(**diff), now=now)
now = datetime.datetime(2016, 11, 8, 11, 46, 30, 0, tz_util.utc) # a Tuesday
self.assertEqual('just now', pd(seconds=5))
self.assertEqual('in 5m', pd(minutes=5))
self.assertEqual('next Tuesday', pd(days=7))
self.assertEqual('in 1 week', pd(days=8))
self.assertEqual('in 2 weeks', pd(days=14))
self.assertEqual('08 Dec', pd(days=30))
self.assertEqual('08 Dec 2017', pd(days=30 + 365))
def test_past_with_time(self):
from pillar.web.utils import pretty_date
now = datetime.datetime(2016, 11, 8, 11, 46, 30, 0, tz_util.utc) # a Tuesday
def pd(**diff):
return pretty_date(now - datetime.timedelta(**diff), detail=True, now=now)
self.assertEqual('just now', pd(seconds=5))
self.assertEqual('5m ago', pd(minutes=5))
self.assertEqual('last Tuesday at 11:46', pd(days=7))
self.assertEqual('1 week ago at 11:46', pd(days=8))
self.assertEqual('2 weeks ago at 11:46', pd(days=14))
self.assertEqual('08 Oct at 11:46', pd(days=31))
self.assertEqual('08 Oct 2015 at 11:46', pd(days=31 + 366))
def test_future_with_time(self):
from pillar.web.utils import pretty_date
def pd(**diff):
return pretty_date(now + datetime.timedelta(**diff), detail=True, now=now)
now = datetime.datetime(2016, 11, 8, 11, 46, 30, 0, tz_util.utc) # a Tuesday
self.assertEqual('just now', pd(seconds=5))
self.assertEqual('in 5m', pd(minutes=5))
self.assertEqual('next Tuesday at 11:46', pd(days=7))
self.assertEqual('in 1 week at 11:46', pd(days=8))
self.assertEqual('in 2 weeks at 11:46', pd(days=14))
self.assertEqual('08 Dec at 11:46', pd(days=30))
self.assertEqual('08 Dec 2017 at 11:46', pd(days=30 + 365))
class EvePaginationTest(unittest.TestCase):
def test_last_page_index(self):
from pillar.web.utils import last_page_index as lpi
self.assertEqual(1, lpi({'total': 0, 'max_results': 313}))
self.assertEqual(1, lpi({'total': 5, 'max_results': 10}))
self.assertEqual(1, lpi({'total': 5, 'max_results': 5}))
self.assertEqual(2, lpi({'total': 6, 'max_results': 5}))
self.assertEqual(2, lpi({'total': 9, 'max_results': 5}))
self.assertEqual(2, lpi({'total': 10, 'max_results': 5}))
self.assertEqual(3, lpi({'total': 11, 'max_results': 5}))
self.assertEqual(404129352, lpi({'total': 2828905463, 'max_results': 7}))