def test_duration_converter_for_invalid(self): """Duration raises the right exception for invalid duration strings.""" test_values = ( # Units in wrong order ('1d1w'), ('1s1y'), # Duplicated units ('1 year 2 years'), ('1 M 10 minutes'), # Unknown substrings ('1MVes'), ('1y3breads'), # Missing amount ('ym'), # Incorrect whitespace (" 1y"), ("1S "), ("1y 1m"), # Garbage ('Guido van Rossum'), ('lemon lemon lemon lemon lemon lemon lemon'), ) converter = Duration() for invalid_duration in test_values: with self.subTest(invalid_duration=invalid_duration): exception_message = f'`{invalid_duration}` is not a valid duration string.' with self.assertRaises(BadArgument, msg=exception_message): asyncio.run(converter.convert(self.context, invalid_duration))
def test_duration_converter_for_valid(self): """Duration returns the correct `datetime` for valid duration strings.""" test_values = ( # Simple duration strings ('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', { "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}), ) converter = Duration() for duration, duration_dict in test_values: expected_datetime = self.fixed_utc_now + relativedelta(**duration_dict) with patch('bot.converters.datetime') as mock_datetime: mock_datetime.utcnow.return_value = self.fixed_utc_now with self.subTest(duration=duration, duration_dict=duration_dict): converted_datetime = asyncio.run(converter.convert(self.context, duration)) self.assertEqual(converted_datetime, expected_datetime)
def test_duration_converter_for_invalid(duration: str): converter = Duration() with pytest.raises(BadArgument, match=f'`{duration}` is not a valid duration string.'): asyncio.run(converter.convert(None, duration))
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