diff options
| author | Scott Gasch <[email protected]> | 2021-07-08 19:44:27 -0700 |
|---|---|---|
| committer | Scott Gasch <[email protected]> | 2021-07-08 19:44:27 -0700 |
| commit | 3bc4daf1edc121cd633429187392227f2fa61885 (patch) | |
| tree | 0663cf35f562c7023c914454c85050d502ad9f3c /tests | |
| parent | 5fd30ef12c100cbb936aa0fdb515b67cff4064db (diff) | |
Lots of changes.
Diffstat (limited to 'tests')
| -rwxr-xr-x | tests/dateparse_utils_test.py | 203 | ||||
| -rwxr-xr-x | tests/dict_utils_test.py | 62 | ||||
| -rwxr-xr-x | tests/simple_acl_test.py | 47 | ||||
| -rwxr-xr-x | tests/string_utils_test.py | 47 |
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)() |
