fix: resolve ruff/mypy lint errors and fix E2E test failures
Some checks failed
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / ci (pull_request) Failing after 1m19s
CI / pr-e2e (pull_request) Successful in 1m31s

- Use datetime.timedelta instead of timezone.timedelta (mypy)
- Fix import ordering (ruff I001)
- Fix admin sidebar E2E selector: use #wagtail-sidebar (Wagtail 7)
- Set deterministic published_date on seeded E2E articles for stable ordering
- Fix nightly test strict-mode violation: exact=True for Comments heading

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
Mark
2026-03-03 14:24:01 +00:00
parent 2b1e7ff4eb
commit be8d6d4a12
4 changed files with 25 additions and 7 deletions

View File

@@ -1,3 +1,5 @@
from datetime import timedelta
import pytest
from django.test import override_settings
from django.utils import timezone
@@ -32,7 +34,7 @@ def test_published_date_preserved_when_explicitly_set(home_page):
index = ArticleIndexPage(title="Articles", slug="articles")
home_page.add_child(instance=index)
author = AuthorFactory()
custom_date = timezone.now() - timezone.timedelta(days=30)
custom_date = timezone.now() - timedelta(days=30)
article = ArticlePage(
title="Custom Date",
slug="custom-date",
@@ -60,7 +62,7 @@ def test_homepage_orders_articles_by_published_date(home_page):
author=author,
summary="s",
body=[("rich_text", "<p>body</p>")],
published_date=timezone.now() - timezone.timedelta(days=10),
published_date=timezone.now() - timedelta(days=10),
)
index.add_child(instance=older)
older.save_revision().publish()
@@ -94,7 +96,7 @@ def test_article_index_orders_by_published_date(home_page, rf):
author=author,
summary="s",
body=[("rich_text", "<p>b</p>")],
published_date=timezone.now() - timezone.timedelta(days=5),
published_date=timezone.now() - timedelta(days=5),
)
index.add_child(instance=old)
old.save_revision().publish()

View File

@@ -20,6 +20,8 @@ class Command(BaseCommand):
def handle(self, *args, **options):
import datetime
from django.utils import timezone
root = Page.get_first_root_node()
home = HomePage.objects.child_of(root).first()
@@ -43,6 +45,9 @@ class Command(BaseCommand):
)
# Primary article — comments enabled, used by nightly journey test
# published_date is set explicitly to ensure deterministic ordering
# (most recent first) so this article appears at the top of listings.
now = timezone.now()
article = ArticlePage.objects.child_of(article_index).filter(slug="nightly-playwright-journey").first()
if article is None:
article = ArticlePage(
@@ -52,9 +57,12 @@ class Command(BaseCommand):
summary="Seeded article for nightly browser journey.",
body=[("rich_text", "<p>Seeded article body for nightly browser checks.</p>")],
comments_enabled=True,
published_date=now,
)
article_index.add_child(instance=article)
article.save_revision().publish()
# Ensure deterministic ordering — primary article always newest
ArticlePage.objects.filter(pk=article.pk).update(published_date=now)
# Seed one approved top-level comment on the primary article for reply E2E tests
if not Comment.objects.filter(article=article, author_name="E2E Approved Commenter").exists():
@@ -78,9 +86,13 @@ class Command(BaseCommand):
summary="An article with tags for E2E filter tests.",
body=[("rich_text", "<p>This article is tagged with AI Tools.</p>")],
comments_enabled=True,
published_date=now - datetime.timedelta(hours=1),
)
article_index.add_child(instance=tagged_article)
tagged_article.save_revision().publish()
ArticlePage.objects.filter(pk=tagged_article.pk).update(
published_date=now - datetime.timedelta(hours=1)
)
tagged_article.tags.add(tag)
tagged_article.save()
@@ -94,6 +106,7 @@ class Command(BaseCommand):
summary="An article with comments disabled.",
body=[("rich_text", "<p>Comments are disabled on this one.</p>")],
comments_enabled=False,
published_date=now - datetime.timedelta(hours=2),
)
article_index.add_child(instance=no_comments_article)
# Explicitly persist False after add_child (which internally calls save())
@@ -101,6 +114,9 @@ class Command(BaseCommand):
ArticlePage.objects.filter(pk=no_comments_article.pk).update(comments_enabled=False)
no_comments_article.comments_enabled = False
no_comments_article.save_revision().publish()
ArticlePage.objects.filter(pk=no_comments_article.pk).update(
published_date=now - datetime.timedelta(hours=2)
)
# About page
if not AboutPage.objects.child_of(home).filter(slug="about").exists():

View File

@@ -32,7 +32,7 @@ def test_nightly_playwright_journey() -> None:
article_url = article_href if article_href.startswith("http") else f"{base_url}{article_href}"
page.goto(article_url, wait_until="networkidle")
expect(page.get_by_role("heading", name="Comments")).to_be_visible()
expect(page.get_by_role("heading", name="Comments", exact=True)).to_be_visible()
expect(page.get_by_role("button", name="Post comment")).to_be_visible()
page.goto(f"{base_url}/feed/", wait_until="networkidle")