|
4 | 4 | from django.contrib import admin
|
5 | 5 | from django.core.exceptions import ValidationError
|
6 | 6 | from django.core.files.base import ContentFile
|
| 7 | +from django.template.defaultfilters import date as datefilter |
7 | 8 | from django.test import SimpleTestCase, TestCase, override_settings
|
8 | 9 | from django.urls import reverse
|
9 | 10 | from django.utils.safestring import SafeString
|
@@ -567,3 +568,89 @@ def test_no_diamond_and_platinum_members(self):
|
567 | 568 | self.assertNotContains(response, member.display_name)
|
568 | 569 | self.assertNotContains(response, member.url)
|
569 | 570 | self.assertNotContains(response, member.description)
|
| 571 | + |
| 572 | + |
| 573 | +class RoadmapViewTestCase(TestCase): |
| 574 | + |
| 575 | + @classmethod |
| 576 | + def setUpTestData(cls): |
| 577 | + # Define release schedule for 5.2, 6.0, and 6.1 series. |
| 578 | + cls.release_schedule = { |
| 579 | + "5.2": [ |
| 580 | + ("a1", datetime.date(2025, 1, 15)), |
| 581 | + ("b1", datetime.date(2025, 2, 19)), |
| 582 | + ("rc1", datetime.date(2025, 3, 19)), |
| 583 | + ("", datetime.date(2025, 4, 2)), # final |
| 584 | + ], |
| 585 | + "6.0": [ |
| 586 | + ("a1", datetime.date(2025, 9, 17)), |
| 587 | + ("b1", datetime.date(2025, 10, 22)), |
| 588 | + ("rc1", datetime.date(2025, 11, 19)), |
| 589 | + ("", datetime.date(2025, 12, 3)), # final |
| 590 | + ], |
| 591 | + "6.1": [ |
| 592 | + ("a1", datetime.date(2026, 5, 20)), |
| 593 | + ("b1", datetime.date(2026, 6, 24)), |
| 594 | + ("rc1", datetime.date(2026, 7, 22)), |
| 595 | + ("", datetime.date(2026, 8, 5)), # final |
| 596 | + ], |
| 597 | + } |
| 598 | + for series, milestones in cls.release_schedule.items(): |
| 599 | + for milestone, date in milestones: |
| 600 | + version = f"{series}{milestone}" if milestone else series |
| 601 | + Release.objects.create( |
| 602 | + version=version, |
| 603 | + is_active=True, |
| 604 | + date=date, |
| 605 | + is_lts=series.endswith(".2"), |
| 606 | + ) |
| 607 | + |
| 608 | + def test_roadmap_page_renders_series_title(self): |
| 609 | + for series in self.release_schedule.keys(): |
| 610 | + url = reverse("roadmap", kwargs={"series": series}) |
| 611 | + response = self.client.get(url) |
| 612 | + self.assertContains(response, f"Django {series} Roadmap", html=True) |
| 613 | + |
| 614 | + def test_roadmap_page_contains_milestones(self): |
| 615 | + for series, releases in self.release_schedule.items(): |
| 616 | + with self.subTest(series=series): |
| 617 | + url = reverse("roadmap", kwargs={"series": series}) |
| 618 | + response = self.client.get(url) |
| 619 | + for detail, date in [ |
| 620 | + (f"Django {series} alpha; feature freeze.", releases[0][1]), |
| 621 | + ( |
| 622 | + f"Django {series} beta; non-release blocking bug fix freeze.", |
| 623 | + releases[1][1], |
| 624 | + ), |
| 625 | + ( |
| 626 | + f"Django {series} RC 1; translation string freeze.", |
| 627 | + releases[2][1], |
| 628 | + ), |
| 629 | + (f"Django {series} final.", releases[3][1]), |
| 630 | + ]: |
| 631 | + expected = f"<tr><td>{datefilter(date)}</td><td>{detail}</td></tr>" |
| 632 | + self.assertContains(response, expected, html=True) |
| 633 | + |
| 634 | + def test_series_non_digits(self): |
| 635 | + for series in (0, "", "a.b", "2.2.0"): |
| 636 | + with self.subTest(series=series): |
| 637 | + response = self.client.get(f"/download/{series}/roadmap/") |
| 638 | + self.assertEqual(response.status_code, 404) |
| 639 | + |
| 640 | + def test_major_lower_bound(self): |
| 641 | + for minor in (0, 1, 2, 3, 11): |
| 642 | + with self.subTest(minor=minor): |
| 643 | + response = self.client.get(f"/download/1.{minor}/roadmap/") |
| 644 | + self.assertEqual(response.status_code, 404) |
| 645 | + |
| 646 | + def test_links_to_contributing_and_release_process_present(self): |
| 647 | + url = reverse("roadmap", kwargs={"series": "20.0"}) |
| 648 | + response = self.client.get(url) |
| 649 | + self.assertContains( |
| 650 | + response, |
| 651 | + 'href="http://docs.djangoproject.com/en/dev/internals/contributing/"', |
| 652 | + ) |
| 653 | + self.assertContains( |
| 654 | + response, |
| 655 | + 'href="http://docs.djangoproject.com/en/dev/internals/release-process/"', |
| 656 | + ) |
0 commit comments