Skip to content

[P0] Align public pagination regression assertions with interactive-lift #300

Description

@alexeygrigorev

Product outcome

Restore the public pagination regression contract so the scheduled/full Django gate reflects the accepted shared pagination markup on current main. This is a test-contract correction only: the rendered paginator already intentionally carries the accepted interactive-lift design-system token.

Evidence and ownership boundary

  • On current origin/main face8e4808d65afbf0374d1ced7a88079950d663, content/tests/test_public_pagination.py:423-424 still counts the obsolete exact strings:
    • class="filter-pill pagination-number"
    • class="filter-pill pagination-step"
  • templates/public/_pagination.html:46,52,62 emits the accepted classes with interactive-lift appended.
  • The token was introduced by the accepted a5d08f1 (“Unify clickable card and control interactions”), not by a paginator behavior change.
  • Scheduled run 33513872199 and the integrated v3 Django evidence reproduce the failure; the first failing assertion is line 423.
  • The collection-hub/archive class correction remains in Restore face8e4 formatting, typing, and focused content gates #261, whose groomed scope explicitly limits its focused test changes to test_archive_row.py and test_collection_hub.py. Keep failed structured-component evidence schema-valid #280 is CI evidence orchestration and explicitly excludes product/test pagination changes. This issue therefore owns only the separate test_public_pagination.py stale expectations.
  • Shared paginator behavior and its accepted design-system contract are defined by closed Create one shared public catalogue pagination primitive #178.

Scope

Change only content/tests/test_public_pagination.py:

  1. Update the numeric-control count to match class="filter-pill pagination-number interactive-lift" and retain the expected count of 7.
  2. Update the direction-control count to match class="filter-pill pagination-step interactive-lift" and retain the expected count of 2.
  3. Keep every other pagination assertion unchanged, including control counts, labels, aria-current, arrows, page-window/ellipsis behavior, URLs, canonical/SEO/cache semantics, boundary behavior, empty/single-page behavior, and source/design-system guards.

Acceptance criteria

  • The candidate changes no production template, CSS, Python application code, fixture data, browser harness, generated projection, or Restore face8e4 formatting, typing, and focused content gates #261/Keep failed structured-component evidence schema-valid #280-owned path.
  • The two rendered-class assertions recognize the accepted interactive-lift token and still prove exactly 7 numeric controls and 2 direction controls on the 12-page middle state.
  • No assertion is weakened by removing the control class, reducing the expected count, using a broad substring that can match unrelated markup, or changing the paginator to satisfy the test.
  • content.tests.test_public_pagination passes on the frozen candidate, including all existing query grammar, status, canonical, cache, accessibility, URL-window, boundary, and source-contract cases.
  • The engineer runs the focused module plus make format-check, make lint, and the applicable versioned verification checks; an independent tester recomputes the plan and verifies the same frozen candidate. Final full-Django/full-regression evidence must be green after the separately owned Reconcile non-reproducible public projection after face8e4 #253/Restore face8e4 formatting, typing, and focused content gates #261 and other release blockers are repaired; this issue never waives a red gate.
  • Screenshots are not_applicable: only a regression test file changes and no rendered product input changes.

Non-goals

Dependencies and handoff

No implementation dependency. This is a small independent testing/frontend lane and may be implemented without waiting for #261 because the changed file does not overlap #261's allowed paths. Final release verification remains subject to the common green-base/order recorded in #253/#261 and the release coordinator.

The engineer works uncommitted in an isolated worktree, posts the versioned handoff, and freezes it. A separate tester performs the focused and graph-selected checks. PM accepts only from a passing tester envelope; the orchestrator then owns commit/merge/push under _docs/PROCESS.md.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P0Must-have or release-blockingbugSomething isn't workingfrontendArea: frontendtestingArea: testing

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions