|
2 | 2 |
|
3 | 3 | import re |
4 | 4 | import sys |
| 5 | +import zoneinfo |
5 | 6 | from collections import OrderedDict |
6 | 7 | from datetime import datetime, timedelta, timezone |
7 | 8 | from json import JSONDecodeError |
|
19 | 20 | assert_count_equal, |
20 | 21 | assert_datetime_about_now, |
21 | 22 | assert_datetime_about_now_utc, |
| 23 | + assert_datetime_now, |
22 | 24 | assert_dict_equal, |
23 | 25 | assert_dict_superset, |
24 | 26 | assert_equal, |
@@ -879,6 +881,72 @@ def test_assert_has_attr__does_not_have_attribute__custom_message(self): |
879 | 881 | with _assert_raises_assertion(expected): |
880 | 882 | assert_has_attr(d, "foo", msg_fmt="{msg};{obj!r};{attribute}") |
881 | 883 |
|
| 884 | + # assert_datetime_now() |
| 885 | + |
| 886 | + def test_assert_datetime_now__naive_dt(self): |
| 887 | + expected_message = "^expected timezone-aware datetime object, got " |
| 888 | + with assert_raises_regex(AssertionError, expected_message): |
| 889 | + assert_datetime_now(datetime.now()) |
| 890 | + |
| 891 | + def test_assert_datetime_now__close(self): |
| 892 | + assert_datetime_now(datetime.now(timezone.utc)) |
| 893 | + assert_datetime_now(datetime.now(zoneinfo.ZoneInfo("Europe/Berlin"))) |
| 894 | + |
| 895 | + def test_assert_datetime_now__none__default_message(self): |
| 896 | + expected_message = r"^None is not a valid date/time$" |
| 897 | + with assert_raises_regex(AssertionError, expected_message): |
| 898 | + assert_datetime_now(None) |
| 899 | + |
| 900 | + def test_assert_datetime_now__none__custom_message(self): |
| 901 | + dt = datetime.now().date().isoformat() |
| 902 | + expected = "None is not a valid date/time;None;{}".format(dt) |
| 903 | + with _assert_raises_assertion(expected): |
| 904 | + assert_datetime_now( |
| 905 | + None, msg_fmt="{msg};{actual!r};{now:%Y-%m-%d}" |
| 906 | + ) |
| 907 | + |
| 908 | + def test_assert_datetime_now__too_low(self): |
| 909 | + then = datetime.now(timezone.utc) - timedelta(minutes=1) |
| 910 | + with assert_raises(AssertionError): |
| 911 | + assert_datetime_now(then) |
| 912 | + |
| 913 | + def test_assert_datetime_now__too_high(self): |
| 914 | + then = datetime.now(timezone.utc) + timedelta(minutes=1) |
| 915 | + with assert_raises(AssertionError): |
| 916 | + assert_datetime_now(then) |
| 917 | + |
| 918 | + def test_assert_datetime_now__default_message(self): |
| 919 | + then = datetime(1990, 4, 13, 12, 30, 15, tzinfo=timezone.utc) |
| 920 | + expected_message = ( |
| 921 | + r"^datetime.datetime\(1990, 4, 13, 12, 30, 15, tzinfo=datetime.timezone.utc\) " |
| 922 | + "is not close to current date/time$" |
| 923 | + ) |
| 924 | + with assert_raises_regex(AssertionError, expected_message): |
| 925 | + assert_datetime_now(then) |
| 926 | + |
| 927 | + def test_assert_datetime_now__custom_message(self): |
| 928 | + then = datetime(1990, 4, 13, 12, 30, 15, tzinfo=timezone.utc) |
| 929 | + now = datetime.now().date().isoformat() |
| 930 | + expected = ( |
| 931 | + "datetime.datetime(1990, 4, 13, 12, 30, 15, tzinfo=datetime.timezone.utc) " |
| 932 | + f"is not close to current date/time;12:30;{now}" |
| 933 | + ) |
| 934 | + with _assert_raises_assertion(expected): |
| 935 | + assert_datetime_now( |
| 936 | + then, msg_fmt="{msg};{actual:%H:%M};{now:%Y-%m-%d}" |
| 937 | + ) |
| 938 | + |
| 939 | + def test_assert_datetime_now__check_utc(self): |
| 940 | + assert_datetime_now(datetime.now(timezone.utc), check_utc=True) |
| 941 | + |
| 942 | + def test_assert_datetime_now__check_utc_fail(self): |
| 943 | + expected = r"^expected tzinfo of datetime.datetime\(.*\) to be UTC" |
| 944 | + with assert_raises_regex(AssertionError, expected): |
| 945 | + assert_datetime_now( |
| 946 | + datetime.now(zoneinfo.ZoneInfo("Europe/Berlin")), |
| 947 | + check_utc=True, |
| 948 | + ) |
| 949 | + |
882 | 950 | # assert_datetime_about_now() |
883 | 951 |
|
884 | 952 | def test_assert_datetime_about_now__aware_dt(self): |
|
0 commit comments