MDL-54707 search: Add user context to get_areas_user_accesses
authorDavid Monllao <davidm@moodle.com>
Thu, 2 Jun 2016 03:42:13 +0000 (11:42 +0800)
committerDavid Monllao <davidm@moodle.com>
Sun, 26 Jun 2016 19:23:16 +0000 (21:23 +0200)
search/classes/manager.php
search/tests/fixtures/mock_search_area.php
search/tests/fixtures/testable_core_search.php
search/tests/manager_test.php

index faaf5c1..49824f7 100644 (file)
@@ -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;
+                }
             }
         }
 
index 8a638d7..c747685 100644 (file)
@@ -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.
      *
index 256f0b8..bce1437 100644 (file)
@@ -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);
+    }
 }
index 20db8ab..e6db62d 100644 (file)
@@ -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);