summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorScott Gasch <[email protected]>2021-07-08 19:44:27 -0700
committerScott Gasch <[email protected]>2021-07-08 19:44:27 -0700
commit3bc4daf1edc121cd633429187392227f2fa61885 (patch)
tree0663cf35f562c7023c914454c85050d502ad9f3c /tests
parent5fd30ef12c100cbb936aa0fdb515b67cff4064db (diff)
Lots of changes.
Diffstat (limited to 'tests')
-rwxr-xr-xtests/dateparse_utils_test.py203
-rwxr-xr-xtests/dict_utils_test.py62
-rwxr-xr-xtests/simple_acl_test.py47
-rwxr-xr-xtests/string_utils_test.py47
4 files changed, 358 insertions, 1 deletions
diff --git a/tests/dateparse_utils_test.py b/tests/dateparse_utils_test.py
new file mode 100755
index 0000000..ff16e01
--- /dev/null
+++ b/tests/dateparse_utils_test.py
@@ -0,0 +1,203 @@
+#!/usr/bin/env python3
+
+import datetime
+import unittest
+
+import pytz
+
+import dateparse.dateparse_utils as du
+import unittest_utils as uu
+
+
+class TestDateparseUtils(unittest.TestCase):
+
+ @uu.check_method_for_perf_regressions
+ def test_dateparsing(self):
+ dp = du.DateParser(
+ override_now_for_test_purposes = datetime.datetime(2021, 7, 2)
+ )
+ parsable_expressions = [
+ ('today',
+ datetime.datetime(2021, 7, 2)),
+ ('tomorrow',
+ datetime.datetime(2021, 7, 3)),
+ ('yesterday',
+ datetime.datetime(2021, 7, 1)),
+ ('21:30',
+ datetime.datetime(2021, 7, 2, 21, 30, 0, 0)),
+ ('12:01am',
+ datetime.datetime(2021, 7, 2, 0, 1, 0, 0)),
+ ('12:02p',
+ datetime.datetime(2021, 7, 2, 12, 2, 0, 0)),
+ ('0:03',
+ datetime.datetime(2021, 7, 2, 0, 3, 0, 0)),
+ ('last wednesday',
+ datetime.datetime(2021, 6, 30)),
+ ('this wed',
+ datetime.datetime(2021, 7, 7)),
+ ('next wed',
+ datetime.datetime(2021, 7, 14)),
+ ('this coming tues',
+ datetime.datetime(2021, 7, 6)),
+ ('this past monday',
+ datetime.datetime(2021, 6, 28)),
+ ('4 days ago',
+ datetime.datetime(2021, 6, 28)),
+ ('4 mondays ago',
+ datetime.datetime(2021, 6, 7)),
+ ('4 months ago',
+ datetime.datetime(2021, 3, 2)),
+ ('3 days back',
+ datetime.datetime(2021, 6, 29)),
+ ('13 weeks from now',
+ datetime.datetime(2021, 10, 1)),
+ ('1 year from now',
+ datetime.datetime(2022, 7, 2)),
+ ('4 weeks from now',
+ datetime.datetime(2021, 7, 30)),
+ ('3 saturdays ago',
+ datetime.datetime(2021, 6, 12)),
+ ('4 months from today',
+ datetime.datetime(2021, 11, 2)),
+ ('4 years from yesterday',
+ datetime.datetime(2025, 7, 1)),
+ ('4 weeks from tomorrow',
+ datetime.datetime(2021, 7, 31)),
+ ('april 15, 2005',
+ datetime.datetime(2005, 4, 15)),
+ ('april 14',
+ datetime.datetime(2021, 4, 14)),
+ ('9:30am on last wednesday',
+ datetime.datetime(2021, 6, 30, 9, 30)),
+ ('2005/apr/15',
+ datetime.datetime(2005, 4, 15)),
+ ('2005 apr 15',
+ datetime.datetime(2005, 4, 15)),
+ ('the 1st wednesday in may',
+ datetime.datetime(2021, 5, 5)),
+ ('last sun of june',
+ datetime.datetime(2021, 6, 27)),
+ ('this Easter',
+ datetime.datetime(2021, 4, 4)),
+ ('last christmas',
+ datetime.datetime(2020, 12, 25)),
+ ('last Xmas',
+ datetime.datetime(2020, 12, 25)),
+ ('xmas, 1999',
+ datetime.datetime(1999, 12, 25)),
+ ('next mlk day',
+ datetime.datetime(2022, 1, 17)),
+ ('Halloween, 2020',
+ datetime.datetime(2020, 10, 31)),
+ ('5 work days after independence day',
+ datetime.datetime(2021, 7, 12)),
+ ('50 working days from last wed',
+ datetime.datetime(2021, 9, 10)),
+ ('25 working days before columbus day',
+ datetime.datetime(2021, 9, 3)),
+ ('today +1 week',
+ datetime.datetime(2021, 7, 9)),
+ ('sunday -3 weeks',
+ datetime.datetime(2021, 6, 13)),
+ ('4 weeks before xmas, 1999',
+ datetime.datetime(1999, 11, 27)),
+ ('3 days before new years eve, 2000',
+ datetime.datetime(2000, 12, 28)),
+ ('july 4th',
+ datetime.datetime(2021, 7, 4)),
+ ('the ides of march',
+ datetime.datetime(2021, 3, 15)),
+ ('the nones of april',
+ datetime.datetime(2021, 4, 5)),
+ ('the kalends of may',
+ datetime.datetime(2021, 5, 1)),
+ ('9/11/2001',
+ datetime.datetime(2001, 9, 11)),
+ ('4 sundays before veterans\' day',
+ datetime.datetime(2021, 10, 17)),
+ ('xmas eve',
+ datetime.datetime(2021, 12, 24)),
+ ('this friday at 5pm',
+ datetime.datetime(2021, 7, 9, 17, 0, 0)),
+ ('presidents day',
+ datetime.datetime(2021, 2, 15)),
+ ('memorial day, 1921',
+ datetime.datetime(1921, 5, 30)),
+ ('today -4 wednesdays',
+ datetime.datetime(2021, 6, 9)),
+ ('thanksgiving',
+ datetime.datetime(2021, 11, 25)),
+ ('2 sun in jun',
+ datetime.datetime(2021, 6, 13)),
+ ('easter -40 days',
+ datetime.datetime(2021, 2, 23)),
+ ('easter +39 days',
+ datetime.datetime(2021, 5, 13)),
+ ('1st tuesday in nov, 2024',
+ datetime.datetime(2024, 11, 5)),
+ ('2 days before last xmas at 3:14:15.92a',
+ datetime.datetime(2020, 12, 23, 3, 14, 15, 92)),
+ ('3 weeks after xmas, 1995 at midday',
+ datetime.datetime(1996, 1, 15, 12, 0, 0)),
+ ('4 months before easter, 1992 at midnight',
+ datetime.datetime(1991, 12, 19)),
+ ('5 months before halloween, 1995 at noon',
+ datetime.datetime(1995, 5, 31, 12)),
+ ('4 days before last wednesday',
+ datetime.datetime(2021, 6, 26)),
+ ('44 months after today',
+ datetime.datetime(2025, 3, 2)),
+ ('44 years before today',
+ datetime.datetime(1977, 7, 2)),
+ ('44 weeks ago',
+ datetime.datetime(2020, 8, 28)),
+ ('15 minutes to 3am',
+ datetime.datetime(2021, 7, 2, 2, 45)),
+ ('quarter past 4pm',
+ datetime.datetime(2021, 7, 2, 16, 15)),
+ ('half past 9',
+ datetime.datetime(2021, 7, 2, 9, 30)),
+ ('4 seconds to midnight',
+ datetime.datetime(2021, 7, 1, 23, 59, 56)),
+ ('4 seconds to midnight, tomorrow',
+ datetime.datetime(2021, 7, 2, 23, 59, 56)),
+ ('2021/apr/15T21:30:44.55',
+ datetime.datetime(2021, 4, 15, 21, 30, 44, 55)),
+ ('2021/apr/15 at 21:30:44.55',
+ datetime.datetime(2021, 4, 15, 21, 30, 44, 55)),
+ ('2021/4/15 at 21:30:44.55',
+ datetime.datetime(2021, 4, 15, 21, 30, 44, 55)),
+ ('2021/04/15 at 21:30:44.55',
+ datetime.datetime(2021, 4, 15, 21, 30, 44, 55)),
+ ('2021/04/15 at 21:30:44.55Z',
+ datetime.datetime(2021, 4, 15, 21, 30, 44, 55,
+ tzinfo=pytz.timezone('UTC'))),
+ ('2021/04/15 at 21:30:44.55EST',
+ datetime.datetime(2021, 4, 15, 21, 30, 44, 55,
+ tzinfo=pytz.timezone('EST'))),
+ ('13 days after last memorial day at 12 seconds before 4pm',
+ datetime.datetime(2020, 6, 7, 15, 59, 48)),
+ (' 2 days before yesterday at 9am ',
+ datetime.datetime(2021, 6, 29, 9)),
+ ('-3 days before today',
+ datetime.datetime(2021, 7, 5)),
+ ('3 days before yesterday at midnight EST',
+ datetime.datetime(2021, 6, 28, tzinfo=pytz.timezone('EST'))),
+ ]
+
+ for (txt, expected_dt) in parsable_expressions:
+ try:
+ print(f'> {txt}')
+ actual_dt = dp.parse(txt)
+ self.assertIsNotNone(actual_dt)
+ self.assertEqual(
+ actual_dt,
+ expected_dt,
+ f'"{txt}", got "{actual_dt}" while expecting "{expected_dt}"'
+ )
+ except du.ParseException:
+ self.fail(f'Expected "{txt}" to parse successfully.')
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/dict_utils_test.py b/tests/dict_utils_test.py
new file mode 100755
index 0000000..1bdbb9b
--- /dev/null
+++ b/tests/dict_utils_test.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python3
+
+import unittest
+
+import dict_utils as du
+
+
+class TestDictUtils(unittest.TestCase):
+
+ def test_init_or_inc(self):
+ d = {}
+ du.init_or_inc(d, 'a')
+ du.init_or_inc(d, 'b')
+ du.init_or_inc(d, 'a')
+ du.init_or_inc(d, 'b')
+ du.init_or_inc(d, 'c')
+ du.init_or_inc(d, 'c')
+ du.init_or_inc(d, 'd')
+ du.init_or_inc(d, 'e')
+ du.init_or_inc(d, 'a')
+ du.init_or_inc(d, 'b')
+ e = {
+ 'a': 3, 'b': 3, 'c': 2, 'd': 1, 'e': 1
+ }
+ self.assertEqual(d, e)
+
+ def test_shard_coalesce(self):
+ d = {
+ 'a': 3, 'b': 3, 'c': 2, 'd': 1, 'e': 1
+ }
+ shards = du.shard(d, 2)
+ merged = du.coalesce(shards)
+ self.assertEqual(d, merged)
+
+ def test_item_with_max_value(self):
+ d = {
+ 'a': 4, 'b': 3, 'c': 2, 'd': 1, 'e': 1
+ }
+ self.assertEqual('a', du.item_with_max_value(d)[0])
+ self.assertEqual(4, du.item_with_max_value(d)[1])
+ self.assertEqual('a', du.key_with_max_value(d))
+ self.assertEqual(4, du.max_value(d))
+
+ def test_item_with_min_value(self):
+ d = {
+ 'a': 4, 'b': 3, 'c': 2, 'd': 1, 'e': 0
+ }
+ self.assertEqual('e', du.item_with_min_value(d)[0])
+ self.assertEqual(0, du.item_with_min_value(d)[1])
+ self.assertEqual('e', du.key_with_min_value(d))
+ self.assertEqual(0, du.min_value(d))
+
+ def test_min_max_key(self):
+ d = {
+ 'a': 4, 'b': 3, 'c': 2, 'd': 1, 'e': 0
+ }
+ self.assertEqual('a', du.min_key(d))
+ self.assertEqual('e', du.max_key(d))
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/simple_acl_test.py b/tests/simple_acl_test.py
new file mode 100755
index 0000000..7c17415
--- /dev/null
+++ b/tests/simple_acl_test.py
@@ -0,0 +1,47 @@
+#!/usr/bin/env python3
+
+import re
+import unittest
+
+import simple_acl as acl
+
+
+class TestSimpleACL(unittest.TestCase):
+
+ def test_set_based_acl(self):
+ even = acl.SetBasedACL(
+ allow_set = set([2, 4, 6, 8, 10]),
+ deny_set = set([1, 3, 5, 7, 9]),
+ order_to_check_allow_deny = acl.ACL_ORDER_ALLOW_DENY,
+ default_answer = False
+ )
+ self.assertTrue(even(2))
+ self.assertFalse(even(3))
+ self.assertFalse(even(-4))
+
+ def test_wildcard_based_acl(self):
+ a_or_b = acl.StringWildcardBasedACL(
+ allowed_patterns = ['a*', 'b*'],
+ order_to_check_allow_deny = acl.ACL_ORDER_ALLOW_DENY,
+ default_answer = False
+ )
+ self.assertTrue(a_or_b('aardvark'))
+ self.assertTrue(a_or_b('bubblegum'))
+ self.assertFalse(a_or_b('charlie'))
+
+ def test_re_based_acl(self):
+ weird = acl.StringREBasedACL(
+ denied_regexs = [
+ re.compile('^a.*a$'),
+ re.compile('^b.*b$')
+ ],
+ order_to_check_allow_deny = acl.ACL_ORDER_ALLOW_DENY,
+ default_answer = True
+ )
+ self.assertTrue(weird('aardvark'))
+ self.assertFalse(weird('anaconda'))
+ self.assertFalse(weird('beelzebub'))
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/string_utils_test.py b/tests/string_utils_test.py
index 157de0a..0472daa 100755
--- a/tests/string_utils_test.py
+++ b/tests/string_utils_test.py
@@ -3,10 +3,15 @@
import unittest
from ansi import fg, bg, reset
+import bootstrap
import string_utils as su
+import unittest_utils as uu
+
[email protected]_all_methods_for_perf_regressions()
class TestStringUtils(unittest.TestCase):
+
def test_is_none_or_empty(self):
self.assertTrue(su.is_none_or_empty(None))
self.assertTrue(su.is_none_or_empty(""))
@@ -136,5 +141,45 @@ class TestStringUtils(unittest.TestCase):
self.assertTrue(su.is_url("http://user:[email protected]:81/uri/uri#shard?param=value+s"))
self.assertTrue(su.is_url("ftp://127.0.0.1/uri/uri"))
+ def test_is_email(self):
+ self.assertTrue(su.is_email('[email protected]'))
+ self.assertTrue(su.is_email('[email protected]'))
+ self.assertFalse(su.is_email('@yahoo.com'))
+ self.assertFalse(su.is_email('indubidibly'))
+ self.assertFalse(su.is_email('[email protected]'))
+
+ def test_suffix_string_to_number(self):
+ self.assertEqual(1024, su.suffix_string_to_number('1Kb'))
+ self.assertEqual(1024 * 1024, su.suffix_string_to_number('1Mb'))
+ self.assertEqual(1024, su.suffix_string_to_number('1k'))
+ self.assertEqual(1024, su.suffix_string_to_number('1kb'))
+ self.assertEqual(None, su.suffix_string_to_number('1Jl'))
+ self.assertEqual(None, su.suffix_string_to_number('undeniable'))
+
+ def test_number_to_suffix_string(self):
+ self.assertEqual('1.0Kb', su.number_to_suffix_string(1024))
+ self.assertEqual('1.0Mb', su.number_to_suffix_string(1024 * 1024))
+ self.assertEqual('123', su.number_to_suffix_string(123))
+
+ def test_is_credit_card(self):
+ self.assertTrue(su.is_credit_card('4242424242424242'))
+ self.assertTrue(su.is_credit_card('5555555555554444'))
+ self.assertTrue(su.is_credit_card('378282246310005'))
+ self.assertTrue(su.is_credit_card('6011111111111117'))
+ self.assertTrue(su.is_credit_card('4000000360000006'))
+ self.assertFalse(su.is_credit_card('8000000360110099'))
+ self.assertFalse(su.is_credit_card(''))
+
+ def test_is_camel_case(self):
+ self.assertFalse(su.is_camel_case('thisisatest'))
+ self.assertTrue(su.is_camel_case('thisIsATest'))
+ self.assertFalse(su.is_camel_case('this_is_a_test'))
+
+ def test_is_snake_case(self):
+ self.assertFalse(su.is_snake_case('thisisatest'))
+ self.assertFalse(su.is_snake_case('thisIsATest'))
+ self.assertTrue(su.is_snake_case('this_is_a_test'))
+
+
if __name__ == '__main__':
- unittest.main()
+ bootstrap.initialize(unittest.main)()