|
1 | 1 | #!/usr/bin/env python |
2 | 2 |
|
| 3 | +import datetime as real_datetime |
3 | 4 | import os |
4 | 5 | import unittest |
5 | 6 | from collections import OrderedDict |
|
9 | 10 | from time import tzset |
10 | 11 | from unittest.mock import Mock, patch |
11 | 12 |
|
| 13 | +import pytest |
12 | 14 | from parameterized import param, parameterized |
13 | 15 |
|
14 | 16 | import dateparser |
@@ -832,13 +834,68 @@ def test_get_date_tuple(self, date_string, expected_result): |
832 | 834 | self.when_get_date_tuple_is_called(date_string) |
833 | 835 | self.then_returned_tuple_is(expected_result) |
834 | 836 |
|
| 837 | + @parameterized.expand( |
| 838 | + [ |
| 839 | + param( |
| 840 | + "Mo", |
| 841 | + datetime(2025, 7, 28, 0, 0), |
| 842 | + ), |
| 843 | + param( |
| 844 | + "Tu", |
| 845 | + datetime(2025, 7, 29, 0, 0), |
| 846 | + ), |
| 847 | + param( |
| 848 | + "We", |
| 849 | + datetime(2025, 7, 30, 0, 0), |
| 850 | + ), |
| 851 | + param( |
| 852 | + "Th", |
| 853 | + datetime(2025, 7, 31, 0, 0), |
| 854 | + ), |
| 855 | + param( |
| 856 | + "Fr", |
| 857 | + datetime(2025, 8, 1, 0, 0), |
| 858 | + ), |
| 859 | + param( |
| 860 | + "Sa", |
| 861 | + datetime(2025, 7, 26, 0, 0), |
| 862 | + ), |
| 863 | + param( |
| 864 | + "Su", |
| 865 | + datetime(2025, 7, 27, 0, 0), |
| 866 | + ), |
| 867 | + ] |
| 868 | + ) |
| 869 | + def test_short_weekday_names(self, date_string, expected): |
| 870 | + if "Mo" in date_string: |
| 871 | + pytest.xfail( |
| 872 | + "Known bug: 'Mo' is being interpreted as a month instead of a weekday and needs to be fixed." |
| 873 | + ) |
| 874 | + |
| 875 | + self.given_parser(["en"]) |
| 876 | + self.given_now(2025, 8, 1) |
| 877 | + self.when_date_string_is_parsed(date_string) |
| 878 | + self.then_parsed_datetime_is(expected) |
| 879 | + |
835 | 880 | def given_now(self, year, month, day, **time): |
836 | | - now = datetime(year, month, day, **time) |
837 | | - datetime_mock = Mock(wraps=datetime) |
838 | | - datetime_mock.utcnow = Mock(return_value=now) |
839 | | - datetime_mock.now = Mock(return_value=now) |
840 | | - datetime_mock.today = Mock(return_value=now) |
841 | | - self.add_patch(patch("dateparser.date.datetime", new=datetime_mock)) |
| 881 | + now = real_datetime.datetime(year, month, day, **time) |
| 882 | + |
| 883 | + # Patch the datetime *class* in each target module |
| 884 | + class DateParserDateTime(real_datetime.datetime): |
| 885 | + @classmethod |
| 886 | + def now(cls, tz=None): |
| 887 | + return now.replace(tzinfo=tz) if tz else now |
| 888 | + |
| 889 | + @classmethod |
| 890 | + def utcnow(cls): |
| 891 | + return now |
| 892 | + |
| 893 | + @classmethod |
| 894 | + def today(cls): |
| 895 | + return now |
| 896 | + |
| 897 | + self.add_patch(patch("dateparser.date.datetime", DateParserDateTime)) |
| 898 | + self.add_patch(patch("dateparser.parser.datetime", DateParserDateTime)) |
842 | 899 |
|
843 | 900 | def given_parser(self, restrict_to_languages=None, **params): |
844 | 901 | self.parser = date.DateDataParser(languages=restrict_to_languages, **params) |
|
0 commit comments