Skip to content

Route test progress data through repositories for HPPS coverage#7906

Draft
donnapep wants to merge 6 commits intotrunkfrom
update/hpps-backend-integration
Draft

Route test progress data through repositories for HPPS coverage#7906
donnapep wants to merge 6 commits intotrunkfrom
update/hpps-backend-integration

Conversation

@donnapep
Copy link
Contributor

@donnapep donnapep commented Mar 3, 2026

Summary

  • Add Sensei_Progress_Test_Helpers trait that creates progress data through repository-backed methods (user_start_course, user_complete_course, sensei_start_lesson) instead of writing directly to comments via update_course_status() / update_lesson_status()
  • Migrate 10 test files to use the new helpers so HPPS mode actually exercises the tables storage path
  • Add skip_in_hpps_mode() to 26 test methods that depend on quiz-specific statuses (passed, failed, graded, ungraded) or directly manipulate comment meta — concepts that only exist in the comments-based model

Test plan

  • npm run test-php:wp-env — no regressions in normal (comments) mode
  • npm run test-php:wp-env:hpps — HPPS mode passes with 26 new skips (quiz/comment-specific tests); no new failures
  • npm run lint-php — no lint errors on changed files

🤖 Generated with Claude Code

donnapep and others added 4 commits March 3, 2026 16:05
Tests were creating progress data via Sensei_Utils::update_course_status()
and update_lesson_status() directly, which only writes to the comments
backend. This meant HPPS mode tests never exercised the tables path.

Add Sensei_Progress_Test_Helpers trait that routes through the repository
layer (user_start_course, user_complete_course, sensei_start_lesson) so
both storage backends are exercised.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace direct Sensei_Utils::update_course_status() calls with
Sensei_Progress_Test_Helpers methods so these tests exercise the tables
path when running in HPPS mode.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace direct Sensei_Utils::update_lesson_status() calls with
Sensei_Progress_Test_Helpers methods where tests only need 'complete'
or 'in-progress' statuses.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add skip_in_hpps_mode() to tests that depend on quiz-specific statuses
(passed, failed, graded, ungraded) or directly manipulate comment meta.
These concepts only exist in the comments-based model and cannot be
expressed through the repository pattern.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings March 3, 2026 21:07
@donnapep donnapep self-assigned this Mar 3, 2026
@donnapep donnapep added this to the 4.26.0 milestone Mar 3, 2026
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the PHP unit test suite to generate course/lesson progress via repository-backed APIs so that running tests in HPPS (tables) mode exercises the tables storage path, and it conditionally skips tests that are inherently tied to the legacy comment-meta progress model (e.g., quiz-specific statuses).

Changes:

  • Add Sensei_Progress_Test_Helpers trait to create course/lesson progress using Sensei_Utils::user_start_course, Sensei_Utils::user_complete_course, and Sensei_Utils::sensei_start_lesson.
  • Migrate multiple test files from update_course_status() / update_lesson_status() to the new progress helpers.
  • Add skip_in_hpps_mode() to tests that rely on comment-meta / quiz-status concepts not supported in HPPS tables mode.

Reviewed changes

Copilot reviewed 20 out of 20 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
tests/unit-tests/test-class-sensei-utils.php Skips update_course_status()-direct tests in HPPS mode and adds HPPS helpers trait.
tests/unit-tests/test-class-sensei-temporary-user.php Uses progress helpers instead of direct course status updates.
tests/unit-tests/test-class-sensei-temporary-user-cleaner.php Skips a comment-meta–dependent test in HPPS mode.
tests/unit-tests/test-class-sensei-db-query-learners.php Uses progress helpers for course progress setup.
tests/unit-tests/test-class-sensei-course-structure.php Uses lesson completion helper instead of direct lesson status update.
tests/unit-tests/test-class-quiz.php Skips quiz-status–dependent tests in HPPS mode.
tests/unit-tests/test-class-grading.php Skips quiz-status–dependent grading menu tests in HPPS mode.
tests/unit-tests/rest-api/test-class-sensei-rest-api-course-progress-controller.php Uses lesson completion helper for REST controller tests.
tests/unit-tests/reports/overview/services/test-class-sensei-reports-overview-service-courses.php Skips comment-meta–dependent completion-time tests in HPPS mode.
tests/unit-tests/reports/overview/list-table/test-class-sensei-reports-overview-list-table-students.php Uses progress helpers to set active/completed course progress.
tests/unit-tests/reports/overview/list-table/test-class-sensei-reports-overview-list-table-courses.php Uses progress helper to mark course completion.
tests/unit-tests/reports/overview/data-provider/test-class-sensei-reports-overview-data-provider-courses.php Skips comment-meta–dependent tests in HPPS mode.
tests/unit-tests/course-theme/test-class-sensei-course-theme-lesson.php Skips quiz-status–dependent notices in HPPS mode.
tests/unit-tests/blocks/test-class-sensei-lesson-actions-blocks.php Adds HPPS helpers and replaces some lesson status writes with lesson completion helper; skips quiz-status test in HPPS.
tests/unit-tests/blocks/test-class-sensei-course-list-filter-block.php Uses course completion helper in place of direct status updates (with redirect handling adjustments).
tests/unit-tests/blocks/test-class-sensei-continue-course-block.php Uses course completion helper instead of direct course status update.
tests/unit-tests/blocks/test-class-sensei-block-view-results.php Uses course completion helper instead of direct course status update.
tests/unit-tests/admin/tools/test-class-sensei-tool-remove-deleted-user-data.php Skips comment-based cleanup verification test in HPPS mode.
tests/framework/trait-sensei-progress-test-helpers.php Introduces new progress helper trait.
tests/bootstrap.php Loads the new Sensei_Progress_Test_Helpers trait into the test bootstrap.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Comment on lines 268 to +273
$this->prevent_wp_redirect();

$this->expectException( Sensei_WP_Redirect_Exception::class );
Sensei_Utils::update_course_status( $student, $this->course2->ID, 'complete' );
try {
$this->complete_course_progress( $student, $this->course2->ID );
} catch ( Sensei_WP_Redirect_Exception $e ) {
// Expected: course completion triggers a redirect.
}
Copy link

Copilot AI Mar 3, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The redirect expectation was removed here: the try/catch swallows Sensei_WP_Redirect_Exception and the test will now pass even if course completion no longer triggers a redirect. Either restore an explicit assertion that the redirect happens (as before), or remove the redirect handling entirely (and update the comment) if redirects are no longer expected for this progress setup.

Copilot uses AI. Check for mistakes.
Comment on lines 296 to +301
$this->prevent_wp_redirect();

$this->expectException( Sensei_WP_Redirect_Exception::class );
Sensei_Utils::update_course_status( $student, $this->course1->ID, 'complete' );
try {
$this->complete_course_progress( $student, $this->course1->ID );
} catch ( Sensei_WP_Redirect_Exception $e ) {
// Expected: course completion triggers a redirect.
}
Copy link

Copilot AI Mar 3, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same issue as above: the try/catch makes this test non-assertive about whether a redirect occurs on course completion. Please either assert the redirect explicitly or remove the redirect-prevention/catch if course completion should be side-effect free in this test.

Copilot uses AI. Check for mistakes.
Comment on lines 330 to +335
$this->prevent_wp_redirect();

$this->expectException( Sensei_WP_Redirect_Exception::class );
Sensei_Utils::update_course_status( $student, $this->course1->ID, 'complete' );
try {
$this->complete_course_progress( $student, $this->course1->ID );
} catch ( Sensei_WP_Redirect_Exception $e ) {
// Expected: course completion triggers a redirect.
}
Copy link

Copilot AI Mar 3, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This try/catch currently doesn't enforce the intended behavior (redirect on completion) and can silently pass if no redirect happens. Consider restoring an explicit expectation/assertion, or simplify by removing redirect handling if complete_course_progress is meant to avoid triggering redirects.

Copilot uses AI. Check for mistakes.
Comment on lines +38 to +40
private function complete_course_progress( int $user_id, int $course_id ): void {
Sensei_Utils::user_complete_course( $course_id, $user_id, false );
}
Copy link

Copilot AI Mar 3, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

complete_course_progress() currently delegates to Sensei_Utils::user_complete_course(...), which only marks the course complete when all lessons are complete. That means this helper may fail to complete a course in tests that create lessons but don’t complete them, despite the method name/doc implying it always completes. Consider either (a) renaming/documenting it as a “recalculate completion” helper, or (b) updating the implementation to guarantee completion (e.g., complete lesson progress first or mark course progress complete directly via the repository).

Copilot uses AI. Check for mistakes.
donnapep and others added 2 commits March 4, 2026 08:17
The repository's create() already writes percent/complete metadata
in comments mode. The redundant update_comment_meta() call used the
progress ID directly, which in HPPS mode is a table row ID — risking
silent data corruption on an unrelated comment with a matching ID.

Also skip date-filter analysis tests in HPPS mode since both the
tests and the production code they cover rely on comment meta.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
In sensei_start_lesson() and user_complete_course(), comment meta
writes use the progress ID which in HPPS mode is a table row ID,
not a comment ID. This could silently corrupt an unrelated comment
with a matching ID. Skip these writes when using tables storage.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@donnapep donnapep marked this pull request as draft March 4, 2026 16:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants