2023-10-21 01:36:06 +00:00
|
|
|
""" test sealed_date module """
|
|
|
|
|
|
|
|
import datetime
|
|
|
|
import unittest
|
|
|
|
|
2023-10-21 20:47:05 +00:00
|
|
|
from django.core.exceptions import ValidationError
|
2023-10-21 01:36:06 +00:00
|
|
|
from django.utils import timezone
|
2023-10-21 20:47:05 +00:00
|
|
|
from django.utils import translation
|
|
|
|
|
2023-10-21 01:36:06 +00:00
|
|
|
from bookwyrm.utils import sealed_date
|
|
|
|
|
|
|
|
|
2023-11-09 16:38:27 +00:00
|
|
|
class PartialDateTest(unittest.TestCase):
|
|
|
|
"""test PartialDate class in isolation"""
|
2023-10-24 07:14:38 +00:00
|
|
|
|
|
|
|
# pylint: disable=missing-function-docstring
|
|
|
|
|
2023-10-21 01:36:06 +00:00
|
|
|
def setUp(self):
|
2023-10-24 07:14:38 +00:00
|
|
|
self._dt = datetime.datetime(2023, 10, 20, 17, 33, 10, tzinfo=timezone.utc)
|
2023-10-21 01:36:06 +00:00
|
|
|
|
|
|
|
def test_day_seal(self):
|
2023-11-09 16:38:27 +00:00
|
|
|
sealed = sealed_date.PartialDate.from_datetime(self._dt)
|
2023-10-24 07:14:38 +00:00
|
|
|
self.assertEqual(self._dt, sealed)
|
2023-10-21 19:55:24 +00:00
|
|
|
self.assertEqual("2023-10-20", sealed.partial_isoformat())
|
2023-10-21 23:27:23 +00:00
|
|
|
self.assertTrue(sealed.has_day)
|
|
|
|
self.assertTrue(sealed.has_month)
|
2023-10-21 01:36:06 +00:00
|
|
|
|
|
|
|
def test_month_seal(self):
|
2023-11-09 16:38:27 +00:00
|
|
|
sealed = sealed_date.MonthParts.from_datetime(self._dt)
|
2023-10-24 07:14:38 +00:00
|
|
|
self.assertEqual(self._dt, sealed)
|
2023-10-21 19:55:24 +00:00
|
|
|
self.assertEqual("2023-10", sealed.partial_isoformat())
|
2023-10-21 23:27:23 +00:00
|
|
|
self.assertFalse(sealed.has_day)
|
|
|
|
self.assertTrue(sealed.has_month)
|
2023-10-21 01:36:06 +00:00
|
|
|
|
|
|
|
def test_year_seal(self):
|
2023-11-09 16:38:27 +00:00
|
|
|
sealed = sealed_date.YearParts.from_datetime(self._dt)
|
2023-10-24 07:14:38 +00:00
|
|
|
self.assertEqual(self._dt, sealed)
|
2023-10-21 19:55:24 +00:00
|
|
|
self.assertEqual("2023", sealed.partial_isoformat())
|
2023-10-21 23:27:23 +00:00
|
|
|
self.assertFalse(sealed.has_day)
|
|
|
|
self.assertFalse(sealed.has_month)
|
|
|
|
|
2023-10-23 03:10:01 +00:00
|
|
|
def test_no_naive_datetime(self):
|
|
|
|
with self.assertRaises(ValueError):
|
2023-11-09 16:38:27 +00:00
|
|
|
sealed_date.PartialDate.from_datetime(datetime.datetime(2000, 1, 1))
|
2023-10-23 03:10:01 +00:00
|
|
|
|
2023-10-21 23:27:23 +00:00
|
|
|
def test_parse_year_seal(self):
|
|
|
|
parsed = sealed_date.from_partial_isoformat("1995")
|
|
|
|
expected = datetime.date(1995, 1, 1)
|
|
|
|
self.assertEqual(expected, parsed.date())
|
|
|
|
self.assertFalse(parsed.has_day)
|
|
|
|
self.assertFalse(parsed.has_month)
|
|
|
|
|
|
|
|
def test_parse_year_errors(self):
|
|
|
|
self.assertRaises(ValueError, sealed_date.from_partial_isoformat, "995")
|
|
|
|
self.assertRaises(ValueError, sealed_date.from_partial_isoformat, "1995x")
|
|
|
|
self.assertRaises(ValueError, sealed_date.from_partial_isoformat, "1995-")
|
|
|
|
|
|
|
|
def test_parse_month_seal(self):
|
|
|
|
expected = datetime.date(1995, 5, 1)
|
|
|
|
test_cases = [
|
|
|
|
("parse_month", "1995-05"),
|
|
|
|
("parse_month_lenient", "1995-5"),
|
|
|
|
]
|
|
|
|
for desc, value in test_cases:
|
|
|
|
with self.subTest(desc):
|
|
|
|
parsed = sealed_date.from_partial_isoformat(value)
|
|
|
|
self.assertEqual(expected, parsed.date())
|
|
|
|
self.assertFalse(parsed.has_day)
|
|
|
|
self.assertTrue(parsed.has_month)
|
|
|
|
|
|
|
|
def test_parse_month_dash_required(self):
|
|
|
|
self.assertRaises(ValueError, sealed_date.from_partial_isoformat, "20056")
|
|
|
|
self.assertRaises(ValueError, sealed_date.from_partial_isoformat, "200506")
|
|
|
|
self.assertRaises(ValueError, sealed_date.from_partial_isoformat, "1995-7-")
|
|
|
|
|
|
|
|
def test_parse_day_seal(self):
|
|
|
|
expected = datetime.date(1995, 5, 6)
|
|
|
|
test_cases = [
|
|
|
|
("parse_day", "1995-05-06"),
|
|
|
|
("parse_day_lenient1", "1995-5-6"),
|
|
|
|
("parse_day_lenient2", "1995-05-6"),
|
|
|
|
]
|
|
|
|
for desc, value in test_cases:
|
|
|
|
with self.subTest(desc):
|
|
|
|
parsed = sealed_date.from_partial_isoformat(value)
|
|
|
|
self.assertEqual(expected, parsed.date())
|
|
|
|
self.assertTrue(parsed.has_day)
|
|
|
|
self.assertTrue(parsed.has_month)
|
|
|
|
|
|
|
|
def test_partial_isoformat_no_time_allowed(self):
|
|
|
|
self.assertRaises(ValueError, sealed_date.from_partial_isoformat, "2005-06-07 ")
|
|
|
|
self.assertRaises(ValueError, sealed_date.from_partial_isoformat, "2005-06-07T")
|
|
|
|
self.assertRaises(
|
|
|
|
ValueError, sealed_date.from_partial_isoformat, "2005-06-07T00:00:00"
|
|
|
|
)
|
|
|
|
self.assertRaises(
|
|
|
|
ValueError, sealed_date.from_partial_isoformat, "2005-06-07T00:00:00-03"
|
|
|
|
)
|
2023-10-21 20:47:05 +00:00
|
|
|
|
|
|
|
|
2023-11-09 16:19:18 +00:00
|
|
|
class PartialDateFormFieldTest(unittest.TestCase):
|
2023-11-09 16:38:27 +00:00
|
|
|
"""test form support for PartialDate objects"""
|
2023-10-24 07:14:38 +00:00
|
|
|
|
|
|
|
# pylint: disable=missing-function-docstring
|
|
|
|
|
2023-10-21 20:47:05 +00:00
|
|
|
def setUp(self):
|
2023-10-24 07:14:38 +00:00
|
|
|
self._dt = datetime.datetime(2022, 11, 21, 17, 1, 0, tzinfo=timezone.utc)
|
2023-11-09 16:19:18 +00:00
|
|
|
self.field = sealed_date.PartialDateFormField()
|
2023-10-21 20:47:05 +00:00
|
|
|
|
|
|
|
def test_prepare_value(self):
|
2023-11-09 16:38:27 +00:00
|
|
|
sealed = sealed_date.PartialDate.from_datetime(self._dt)
|
2023-10-21 20:47:05 +00:00
|
|
|
self.assertEqual("2022-11-21", self.field.prepare_value(sealed))
|
|
|
|
|
|
|
|
def test_prepare_value_month(self):
|
2023-11-09 16:38:27 +00:00
|
|
|
sealed = sealed_date.MonthParts.from_datetime(self._dt)
|
2023-10-21 20:47:05 +00:00
|
|
|
self.assertEqual("2022-11-0", self.field.prepare_value(sealed))
|
|
|
|
|
|
|
|
def test_prepare_value_year(self):
|
2023-11-09 16:38:27 +00:00
|
|
|
sealed = sealed_date.YearParts.from_datetime(self._dt)
|
2023-10-21 20:47:05 +00:00
|
|
|
self.assertEqual("2022-0-0", self.field.prepare_value(sealed))
|
|
|
|
|
|
|
|
def test_to_python(self):
|
|
|
|
date = self.field.to_python("2022-11-21")
|
2023-11-09 16:38:27 +00:00
|
|
|
self.assertIsInstance(date, sealed_date.PartialDate)
|
2023-10-21 20:47:05 +00:00
|
|
|
self.assertEqual("2022-11-21", date.partial_isoformat())
|
|
|
|
|
|
|
|
def test_to_python_month(self):
|
|
|
|
date = self.field.to_python("2022-11-0")
|
2023-11-09 16:38:27 +00:00
|
|
|
self.assertIsInstance(date, sealed_date.PartialDate)
|
2023-10-21 20:47:05 +00:00
|
|
|
self.assertEqual("2022-11", date.partial_isoformat())
|
|
|
|
with self.assertRaises(ValidationError):
|
|
|
|
self.field.to_python("2022-0-25")
|
|
|
|
|
|
|
|
def test_to_python_year(self):
|
|
|
|
date = self.field.to_python("2022-0-0")
|
2023-11-09 16:38:27 +00:00
|
|
|
self.assertIsInstance(date, sealed_date.PartialDate)
|
2023-10-21 20:47:05 +00:00
|
|
|
self.assertEqual("2022", date.partial_isoformat())
|
|
|
|
with self.assertRaises(ValidationError):
|
|
|
|
self.field.to_python("0-05-25")
|
|
|
|
|
|
|
|
def test_to_python_other(self):
|
|
|
|
with translation.override("es"):
|
|
|
|
# check super() is called
|
|
|
|
date = self.field.to_python("5/6/97")
|
2023-11-09 16:38:27 +00:00
|
|
|
self.assertIsInstance(date, sealed_date.PartialDate)
|
2023-10-21 20:47:05 +00:00
|
|
|
self.assertEqual("1997-06-05", date.partial_isoformat())
|