aboutsummaryrefslogtreecommitdiffstats
path: root/tests/test_converters.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_converters.py')
-rw-r--r--tests/test_converters.py113
1 files changed, 66 insertions, 47 deletions
diff --git a/tests/test_converters.py b/tests/test_converters.py
index 3cf00035f..35fc5d88e 100644
--- a/tests/test_converters.py
+++ b/tests/test_converters.py
@@ -3,11 +3,11 @@ import datetime
from unittest.mock import MagicMock, patch
import pytest
+from dateutil.relativedelta import relativedelta
from discord.ext.commands import BadArgument
from bot.converters import (
Duration,
- ExpirationDate,
TagContentConverter,
TagNameConverter,
ValidPythonIdentifier,
@@ -17,18 +17,6 @@ from bot.converters import (
@pytest.mark.parametrize(
('value', 'expected'),
(
- # sorry aliens
- ('2199-01-01T00:00:00', datetime.datetime(2199, 1, 1)),
- )
-)
-def test_expiration_date_converter_for_valid(value: str, expected: datetime.datetime):
- converter = ExpirationDate()
- assert asyncio.run(converter.convert(None, value)) == expected
-
-
- ('value', 'expected'),
- (
('hello', 'hello'),
(' h ello ', 'h ello')
)
@@ -97,46 +85,68 @@ def test_valid_python_identifier_for_invalid(value: str):
FIXED_UTC_NOW = datetime.datetime.fromisoformat('2019-01-01T00:00:00')
- ('duration', 'expected'),
- (
+ params=(
# Simple duration strings
- ('1Y', datetime.datetime.fromisoformat('2020-01-01T00:00:00')),
- ('1y', datetime.datetime.fromisoformat('2020-01-01T00:00:00')),
- ('1year', datetime.datetime.fromisoformat('2020-01-01T00:00:00')),
- ('1years', datetime.datetime.fromisoformat('2020-01-01T00:00:00')),
- ('1m', datetime.datetime.fromisoformat('2019-02-01T00:00:00')),
- ('1month', datetime.datetime.fromisoformat('2019-02-01T00:00:00')),
- ('1months', datetime.datetime.fromisoformat('2019-02-01T00:00:00')),
- ('1w', datetime.datetime.fromisoformat('2019-01-08T00:00:00')),
- ('1W', datetime.datetime.fromisoformat('2019-01-08T00:00:00')),
- ('1week', datetime.datetime.fromisoformat('2019-01-08T00:00:00')),
- ('1weeks', datetime.datetime.fromisoformat('2019-01-08T00:00:00')),
- ('1d', datetime.datetime.fromisoformat('2019-01-02T00:00:00')),
- ('1D', datetime.datetime.fromisoformat('2019-01-02T00:00:00')),
- ('1day', datetime.datetime.fromisoformat('2019-01-02T00:00:00')),
- ('1days', datetime.datetime.fromisoformat('2019-01-02T00:00:00')),
- ('1h', datetime.datetime.fromisoformat('2019-01-01T01:00:00')),
- ('1H', datetime.datetime.fromisoformat('2019-01-01T01:00:00')),
- ('1hour', datetime.datetime.fromisoformat('2019-01-01T01:00:00')),
- ('1hours', datetime.datetime.fromisoformat('2019-01-01T01:00:00')),
- ('1M', datetime.datetime.fromisoformat('2019-01-01T00:01:00')),
- ('1minute', datetime.datetime.fromisoformat('2019-01-01T00:01:00')),
- ('1minutes', datetime.datetime.fromisoformat('2019-01-01T00:01:00')),
- ('1s', datetime.datetime.fromisoformat('2019-01-01T00:00:01')),
- ('1S', datetime.datetime.fromisoformat('2019-01-01T00:00:01')),
- ('1second', datetime.datetime.fromisoformat('2019-01-01T00:00:01')),
- ('1seconds', datetime.datetime.fromisoformat('2019-01-01T00:00:01')),
+ ('1Y', {"years": 1}),
+ ('1y', {"years": 1}),
+ ('1year', {"years": 1}),
+ ('1years', {"years": 1}),
+ ('1m', {"months": 1}),
+ ('1month', {"months": 1}),
+ ('1months', {"months": 1}),
+ ('1w', {"weeks": 1}),
+ ('1W', {"weeks": 1}),
+ ('1week', {"weeks": 1}),
+ ('1weeks', {"weeks": 1}),
+ ('1d', {"days": 1}),
+ ('1D', {"days": 1}),
+ ('1day', {"days": 1}),
+ ('1days', {"days": 1}),
+ ('1h', {"hours": 1}),
+ ('1H', {"hours": 1}),
+ ('1hour', {"hours": 1}),
+ ('1hours', {"hours": 1}),
+ ('1M', {"minutes": 1}),
+ ('1minute', {"minutes": 1}),
+ ('1minutes', {"minutes": 1}),
+ ('1s', {"seconds": 1}),
+ ('1S', {"seconds": 1}),
+ ('1second', {"seconds": 1}),
+ ('1seconds', {"seconds": 1}),
# Complex duration strings
- ('1y1m1w1d1H1M1S', datetime.datetime.fromisoformat('2020-02-09T01:01:01')),
- ('5y100S', datetime.datetime.fromisoformat('2024-01-01T00:01:40')),
- ('2w28H', datetime.datetime.fromisoformat('2019-01-16T04:00:00')),
+ (
+ '1y1m1w1d1H1M1S',
+ {
+ "years": 1,
+ "months": 1,
+ "weeks": 1,
+ "days": 1,
+ "hours": 1,
+ "minutes": 1,
+ "seconds": 1
+ }
+ ),
+ ('5y100S', {"years": 5, "seconds": 100}),
+ ('2w28H', {"weeks": 2, "hours": 28}),
+
+ # Duration strings with spaces
+ ('1 year 2 months', {"years": 1, "months": 2}),
+ ('1d 2H', {"days": 1, "hours": 2}),
+ ('1 week2 days', {"weeks": 1, "days": 2}),
)
)
-def test_duration_converter_for_valid(duration: str, expected: datetime):
- converter = Duration()
+def create_future_datetime(request):
+ """Yields duration string and target datetime.datetime object."""
+ duration, duration_dict = request.param
+ future_datetime = FIXED_UTC_NOW + relativedelta(**duration_dict)
+ yield duration, future_datetime
+
+def test_duration_converter_for_valid(create_future_datetime: tuple):
+ converter = Duration()
+ duration, expected = create_future_datetime
with patch('bot.converters.datetime') as mock_datetime:
mock_datetime.utcnow.return_value = FIXED_UTC_NOW
assert asyncio.run(converter.convert(None, duration)) == expected
@@ -149,6 +159,10 @@ def test_duration_converter_for_valid(duration: str, expected: datetime):
('1d1w'),
('1s1y'),
+ # Duplicated units
+ ('1 year 2 years'),
+ ('1 M 10 minutes'),
+
# Unknown substrings
('1MVes'),
('1y3breads'),
@@ -156,6 +170,11 @@ def test_duration_converter_for_valid(duration: str, expected: datetime):
# Missing amount
('ym'),
+ # Incorrect whitespace
+ (" 1y"),
+ ("1S "),
+ ("1y 1m"),
+
# Garbage
('Guido van Rossum'),
('lemon lemon lemon lemon lemon lemon lemon'),