From 25ba053ff2bb5d842f846f4739ab710a4b50dfa4 Mon Sep 17 00:00:00 2001 From: David Monllao Date: Thu, 2 Jun 2016 11:42:13 +0800 Subject: [PATCH] MDL-54707 search: Add user context to get_areas_user_accesses --- search/classes/manager.php | 11 ++++++++++- search/tests/fixtures/mock_search_area.php | 6 ++++++ search/tests/fixtures/testable_core_search.php | 15 +++++++++++++++ search/tests/manager_test.php | 14 ++++++++++++++ 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/search/classes/manager.php b/search/classes/manager.php index faaf5c1c88d..49824f7f4e9 100644 --- a/search/classes/manager.php +++ b/search/classes/manager.php @@ -346,7 +346,16 @@ class manager { $systemcontextid = \context_system::instance()->id; foreach ($areasbylevel[CONTEXT_SYSTEM] as $areaid => $searchclass) { - $areascontexts[$areaid][] = $systemcontextid; + $areascontexts[$areaid][$systemcontextid] = $systemcontextid; + } + } + + if (!empty($areasbylevel[CONTEXT_USER])) { + if ($usercontext = \context_user::instance($USER->id, IGNORE_MISSING)) { + // Extra checking although only logged users should reach this point, guest users have a valid context id. + foreach ($areasbylevel[CONTEXT_USER] as $areaid => $searchclass) { + $areascontexts[$areaid][$usercontext->id] = $usercontext->id; + } } } diff --git a/search/tests/fixtures/mock_search_area.php b/search/tests/fixtures/mock_search_area.php index 8a638d7a759..c74768526ce 100644 --- a/search/tests/fixtures/mock_search_area.php +++ b/search/tests/fixtures/mock_search_area.php @@ -29,6 +29,12 @@ defined('MOODLE_INTERNAL') || die; class mock_search_area extends \core_search\area\base { + /** + * Multiple context level so we can test get_areas_user_accesses. + * @var int[] + */ + protected static $levels = [CONTEXT_SYSTEM, CONTEXT_USER]; + /** * To make things easier, base class required config stuff. * diff --git a/search/tests/fixtures/testable_core_search.php b/search/tests/fixtures/testable_core_search.php index 256f0b83e33..bce1437d889 100644 --- a/search/tests/fixtures/testable_core_search.php +++ b/search/tests/fixtures/testable_core_search.php @@ -29,6 +29,11 @@ require_once(__DIR__ . '/mock_search_engine.php'); /** * Core search class adapted to unit test. * + * Note that by default all core search areas are returned when calling get_search_areas_list, + * if you want to use the mock search area you can use testable_core_search::add_search_area + * although if you want to add mock search areas on top of the core ones you should call + * testable_core_search::add_core_search_areas before calling testable_core_search::add_search_area. + * * @package core_search * @copyright 2015 David Monllao {@link http://www.davidmonllao.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later @@ -82,4 +87,14 @@ class testable_core_search extends \core_search\manager { self::$enabledsearchareas[$areaid] = $searcharea; self::$allsearchareas[$areaid] = $searcharea; } + + /** + * Loads all core search areas. + * + * @return void + */ + public function add_core_search_areas() { + self::get_search_areas_list(false); + self::get_search_areas_list(true); + } } diff --git a/search/tests/manager_test.php b/search/tests/manager_test.php index 20db8ab1720..e6db62de637 100644 --- a/search/tests/manager_test.php +++ b/search/tests/manager_test.php @@ -26,6 +26,7 @@ defined('MOODLE_INTERNAL') || die(); require_once(__DIR__ . '/fixtures/testable_core_search.php'); +require_once(__DIR__ . '/fixtures/mock_search_area.php'); /** * Unit tests for search manager. @@ -165,8 +166,11 @@ class search_manager_testcase extends advanced_testcase { $course2 = $this->getDataGenerator()->create_course(); $course2ctx = context_course::instance($course2->id); $teacher = $this->getDataGenerator()->create_user(); + $teacherctx = context_user::instance($teacher->id); $student = $this->getDataGenerator()->create_user(); + $studentctx = context_user::instance($student->id); $noaccess = $this->getDataGenerator()->create_user(); + $noaccessctx = context_user::instance($noaccess->id); $this->getDataGenerator()->enrol_user($teacher->id, $course1->id, 'teacher'); $this->getDataGenerator()->enrol_user($student->id, $course1->id, 'student'); @@ -180,17 +184,23 @@ class search_manager_testcase extends advanced_testcase { $context3 = context_module::instance($forum3->cmid); $search = testable_core_search::instance(); + $mockareaid = \core_search\manager::generate_areaid('core_mocksearch', 'mock_search_area'); + $search->add_core_search_areas(); + $search->add_search_area($mockareaid, new core_mocksearch\search\mock_search_area()); $this->setAdminUser(); $this->assertTrue($search->get_areas_user_accesses()); $sitectx = \context_course::instance(SITEID); + $systemctxid = \context_system::instance()->id; // Can access the frontpage ones. $this->setUser($noaccess); $contexts = $search->get_areas_user_accesses(); $this->assertEquals(array($frontpageforumcontext->id => $frontpageforumcontext->id), $contexts[$this->forumpostareaid]); $this->assertEquals(array($sitectx->id => $sitectx->id), $contexts[$this->mycoursesareaid]); + $mockctxs = array($noaccessctx->id => $noaccessctx->id, $systemctxid => $systemctxid); + $this->assertEquals($mockctxs, $contexts[$mockareaid]); $this->setUser($teacher); $contexts = $search->get_areas_user_accesses(); @@ -199,12 +209,16 @@ class search_manager_testcase extends advanced_testcase { $this->assertEquals($frontpageandcourse1, $contexts[$this->forumpostareaid]); $this->assertEquals(array($sitectx->id => $sitectx->id, $course1ctx->id => $course1ctx->id), $contexts[$this->mycoursesareaid]); + $mockctxs = array($teacherctx->id => $teacherctx->id, $systemctxid => $systemctxid); + $this->assertEquals($mockctxs, $contexts[$mockareaid]); $this->setUser($student); $contexts = $search->get_areas_user_accesses(); $this->assertEquals($frontpageandcourse1, $contexts[$this->forumpostareaid]); $this->assertEquals(array($sitectx->id => $sitectx->id, $course1ctx->id => $course1ctx->id), $contexts[$this->mycoursesareaid]); + $mockctxs = array($studentctx->id => $studentctx->id, $systemctxid => $systemctxid); + $this->assertEquals($mockctxs, $contexts[$mockareaid]); // Hide the activity. set_coursemodule_visible($forum2->cmid, 0);