|
1 | 1 | import re |
2 | 2 | from collections.abc import MutableMapping |
| 3 | +from datetime import datetime |
3 | 4 |
|
4 | 5 | import pytest |
5 | 6 | from django.core.cache import cache |
@@ -488,6 +489,83 @@ class TestSerializer(serializers.Serializer): |
488 | 489 | assert rendered == '' |
489 | 490 |
|
490 | 491 |
|
| 492 | +class TestDateTimeFieldHTMLFormRender(TestCase): |
| 493 | + """ |
| 494 | + Default USE_TZ is True. |
| 495 | + Default TIME_ZONE is 'America/Chicago'. |
| 496 | + """ |
| 497 | + |
| 498 | + def _assert_datetime_rendering(self, appointment, expected, datetimefield_kwargs=None): |
| 499 | + datetimefield_kwargs = datetimefield_kwargs or {} |
| 500 | + |
| 501 | + class TestSerializer(serializers.Serializer): |
| 502 | + appointment = serializers.DateTimeField(**datetimefield_kwargs) |
| 503 | + |
| 504 | + serializer = TestSerializer(data={"appointment": appointment}) |
| 505 | + serializer.is_valid() |
| 506 | + renderer = HTMLFormRenderer() |
| 507 | + field = serializer['appointment'] |
| 508 | + rendered = renderer.render_field(field, {}) |
| 509 | + expected_html = ( |
| 510 | + '<input name="appointment" class="form-control" ' |
| 511 | + f'type="datetime-local" value="{expected}">' |
| 512 | + ) |
| 513 | + |
| 514 | + self.assertInHTML(expected_html, rendered) |
| 515 | + |
| 516 | + def test_datetime_field_rendering_milliseconds(self): |
| 517 | + self._assert_datetime_rendering( |
| 518 | + datetime(2024, 12, 24, 0, 55, 30, 345678), "2024-12-24T00:55:30.345" |
| 519 | + ) |
| 520 | + |
| 521 | + def test_datetime_field_rendering_no_seconds_and_no_milliseconds(self): |
| 522 | + self._assert_datetime_rendering( |
| 523 | + datetime(2024, 12, 24, 0, 55, 0, 0), "2024-12-24T00:55:00.000" |
| 524 | + ) |
| 525 | + |
| 526 | + def test_datetime_field_rendering_with_format_as_none(self): |
| 527 | + self._assert_datetime_rendering( |
| 528 | + datetime(2024, 12, 24, 0, 55, 30, 345678), |
| 529 | + "2024-12-24T00:55:30.345", |
| 530 | + {"format": None} |
| 531 | + ) |
| 532 | + |
| 533 | + def test_datetime_field_rendering_with_format(self): |
| 534 | + self._assert_datetime_rendering( |
| 535 | + datetime(2024, 12, 24, 0, 55, 30, 345678), |
| 536 | + "2024-12-24T00:55:00.000", |
| 537 | + {"format": "%a %d %b %Y, %I:%M%p"} |
| 538 | + ) |
| 539 | + |
| 540 | + @override_settings(TIME_ZONE='UTC') |
| 541 | + def test_datetime_field_rendering_utc(self): |
| 542 | + self._assert_datetime_rendering( |
| 543 | + datetime(2024, 12, 24, 0, 55, 30, 345678), |
| 544 | + "2024-12-24T00:55:30.345" |
| 545 | + ) |
| 546 | + |
| 547 | + @override_settings(TIME_ZONE='Asia/Tokyo') # +09:00 |
| 548 | + def test_datetime_field_rendering_non_zero_timezone(self): |
| 549 | + self._assert_datetime_rendering( |
| 550 | + datetime(2024, 12, 24, 0, 55, 30, 345678), |
| 551 | + "2024-12-24T00:55:30.345" |
| 552 | + ) |
| 553 | + |
| 554 | + @override_settings(REST_FRAMEWORK={'DATETIME_FORMAT': '%a %d %b %Y, %I:%M%p'}) |
| 555 | + def test_datetime_field_rendering_with_custom_datetime_format(self): |
| 556 | + self._assert_datetime_rendering( |
| 557 | + datetime(2024, 12, 24, 0, 55, 30, 345678), |
| 558 | + "2024-12-24T00:55:00.000" |
| 559 | + ) |
| 560 | + |
| 561 | + @override_settings(REST_FRAMEWORK={'DATETIME_FORMAT': None}) |
| 562 | + def test_datetime_field_rendering_datetime_format_is_none(self): |
| 563 | + self._assert_datetime_rendering( |
| 564 | + datetime(2024, 12, 24, 0, 55, 30, 345678), |
| 565 | + "2024-12-24T00:55:30.345" |
| 566 | + ) |
| 567 | + |
| 568 | + |
491 | 569 | class TestHTMLFormRenderer(TestCase): |
492 | 570 | def setUp(self): |
493 | 571 | class TestSerializer(serializers.Serializer): |
|
0 commit comments