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.
123 lines
4.7 KiB
Python
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}))
|