From 763b07b760e842b6b1ea341a4b4a3e93b594a3c3 Mon Sep 17 00:00:00 2001 From: Dmitry Merkushin Date: Tue, 6 Aug 2024 19:49:39 -0600 Subject: [PATCH] Pass checks argument to sensei_can_user_view_lesson filter (#7657) --- .../update-sensei-can-user-view-lesson-args | 4 ++ includes/sensei-functions.php | 25 +++++++++--- tests/unit-tests/test-sensei-functions.php | 39 +++++++++++++++++++ 3 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 changelog/update-sensei-can-user-view-lesson-args diff --git a/changelog/update-sensei-can-user-view-lesson-args b/changelog/update-sensei-can-user-view-lesson-args new file mode 100644 index 0000000000..01584ad89b --- /dev/null +++ b/changelog/update-sensei-can-user-view-lesson-args @@ -0,0 +1,4 @@ +Significance: patch +Type: added + +Pass checks argument to sensei_can_user_view_lesson filter. diff --git a/includes/sensei-functions.php b/includes/sensei-functions.php index 9d13753381..2087b40796 100644 --- a/includes/sensei-functions.php +++ b/includes/sensei-functions.php @@ -156,24 +156,37 @@ function sensei_can_user_view_lesson( $lesson_id = null, $user_id = null ) { $pre_requisite_complete = true; }; - $can_user_view_lesson = ! sensei_is_login_required() - || sensei_all_access( $user_id ) + $login_not_required = ! sensei_is_login_required(); + $user_has_all_access = sensei_all_access( $user_id ); + + $can_user_view_lesson = $login_not_required + || $user_has_all_access || ( $user_can_view_course_content && $pre_requisite_complete ) || $is_preview_lesson; + $checks = array( + 'login_not_required' => $login_not_required, + 'user_has_all_access' => $user_has_all_access, + 'user_can_view_course_content' => $user_can_view_course_content, + 'pre_requisite_complete' => $pre_requisite_complete, + 'is_preview_lesson' => $is_preview_lesson, + ); + /** * Filter if the user can view lesson and quiz content. * * @since 1.9.0 + * @since $$next-version$$ Added $checks parameter. * * @hook sensei_can_user_view_lesson * - * @param {bool} $can_user_view_lesson True if they can view lesson/quiz content. - * @param {int} $lesson_id Lesson post ID. - * @param {int} $user_id User ID. + * @param {bool} $can_user_view_lesson True if they can view lesson/quiz content. + * @param {int} $lesson_id Lesson post ID. + * @param {int} $user_id User ID. + * $param {array} $checks Array of checks that were made to determine access. * @return {bool} Filtered access. */ - return apply_filters( 'sensei_can_user_view_lesson', $can_user_view_lesson, $lesson_id, $user_id ); + return apply_filters( 'sensei_can_user_view_lesson', $can_user_view_lesson, $lesson_id, $user_id, $checks ); } if ( ! function_exists( 'sensei_light_or_dark' ) ) { diff --git a/tests/unit-tests/test-sensei-functions.php b/tests/unit-tests/test-sensei-functions.php index 880101f12d..02e88743cf 100644 --- a/tests/unit-tests/test-sensei-functions.php +++ b/tests/unit-tests/test-sensei-functions.php @@ -2,11 +2,26 @@ class Sensei_Functions_Test extends WP_UnitTestCase { + /** + * Sensei factory. + * + * @var \Sensei_Factory + */ + protected $factory; + + public function setUp(): void { + parent::setUp(); + + $this->factory = new \Sensei_Factory(); + } + public function tearDown(): void { // Ensure explicit theme support is removed. remove_theme_support( 'sensei' ); parent::tearDown(); + + $this->factory->tearDown(); } /** @@ -108,6 +123,30 @@ public function testSenseiUserRegistrationUrl() { ); } + public function testSenseiCanUserViewLesson_WhenCalled_FiresFilterWithChecksArgument() { + /* Arrange. */ + $lesson_id = $this->factory->lesson->create(); + $user_id = $this->factory->user->create(); + + $has_checks = false; + $filter = function ( $can_view_lesson, $lesson_id, $user_id, $checks ) use ( &$has_checks ) { + $has_checks = is_array( $checks ) && isset( + $checks['login_not_required'], + $checks['user_has_all_access'], + $checks['user_can_view_course_content'], + $checks['pre_requisite_complete'], + $checks['is_preview_lesson'] + ); + }; + add_filter( 'sensei_can_user_view_lesson', $filter, 10, 4 ); + + /* Act. */ + sensei_can_user_view_lesson( $lesson_id, $user_id ); + + /* Assert. */ + $this->assertTrue( $has_checks ); + } + /** * Filter for setting theme to Twenty Sixteen. *