Example #1
0
 /**
  * Setting up the test environment
  * @return void
  */
 public function setUp()
 {
     $this->resetAfterTest(true);
     set_config('enableglobalsearch', true);
     $this->messagesentareaid = \core_search\manager::generate_areaid('core_message', 'message_sent');
     // Set \core_search::instance to the mock_search_engine as we don't require the search engine to be working to test this.
     $search = testable_core_search::instance();
 }
Example #2
0
 public function setUp()
 {
     $this->resetAfterTest(true);
     $this->setAdminUser();
     set_config('enableglobalsearch', true);
     $this->wikicollabpageareaid = \core_search\manager::generate_areaid('mod_wiki', 'collaborative_page');
     // Set \core_search::instance to the mock_search_engine as we don't require the search engine to be working to test this.
     $search = testable_core_search::instance();
 }
Example #3
0
 /**
  * Constructor.
  *
  * @throws \coding_exception
  * @return void
  */
 public final function __construct()
 {
     $classname = get_class($this);
     // Detect possible issues when defining the class.
     if (strpos($classname, '\\search') === false) {
         throw new \coding_exception('Search area classes should be located in \\PLUGINTYPE_PLUGINNAME\\search\\AREANAME.');
     } else {
         if (strpos($classname, '_') === false) {
             throw new \coding_exception($classname . ' class namespace level 1 should be its component frankenstyle name');
         }
     }
     $this->areaname = substr(strrchr($classname, '\\'), 1);
     $this->componentname = substr($classname, 0, strpos($classname, '\\'));
     $this->areaid = \core_search\manager::generate_areaid($this->componentname, $this->areaname);
     $this->componenttype = substr($this->componentname, 0, strpos($this->componentname, '_'));
 }
Example #4
0
 /**
  * Test engine caches.
  *
  * @return void
  */
 public function test_engine_caches()
 {
     global $DB;
     $engine = new \mock_search\engine();
     $course1 = self::getDataGenerator()->create_course();
     $this->assertEquals($course1->id, $engine->get_course($course1->id)->id);
     $dbreads = $DB->perf_get_reads();
     $engine->get_course($course1->id);
     $this->assertEquals($dbreads, $DB->perf_get_reads());
     $fakearea1 = \core_search\manager::generate_areaid('plugintype_unexisting', 'fakearea');
     $fakearea2 = \core_search\manager::generate_areaid('mod_unexisting', 'morefake');
     $this->assertFalse($engine->get_search_area($fakearea1));
     $this->assertFalse($engine->get_search_area($fakearea2));
     $this->assertFalse($engine->get_search_area($fakearea2));
     $areaid = \core_search\manager::generate_areaid('mod_forum', 'post');
     $this->assertInstanceOf('\\mod_forum\\search\\post', $engine->get_search_area($areaid));
     $dbreads = $DB->perf_get_reads();
     $this->assertInstanceOf('\\mod_forum\\search\\post', $engine->get_search_area($areaid));
     $this->assertEquals($dbreads, $DB->perf_get_reads());
 }
Example #5
0
 /**
  * We ensure that the document has a unique id across search areas.
  *
  * @param int $itemid An id unique to the search area
  * @param string $componentname The search area component Frankenstyle name
  * @param string $areaname The area name (the search area class name)
  * @return void
  */
 public function __construct($itemid, $componentname, $areaname)
 {
     if (!is_numeric($itemid)) {
         throw new \coding_exception('The itemid should be an integer');
     }
     $this->data['areaid'] = \core_search\manager::generate_areaid($componentname, $areaname);
     $this->data['id'] = $this->data['areaid'] . '-' . $itemid;
     $this->data['itemid'] = intval($itemid);
 }
Example #6
0
 /**
  * Test indexing a file we don't consider indexable.
  */
 public function test_index_filtered_file()
 {
     // Get area to work with.
     $areaid = \core_search\manager::generate_areaid('core_mocksearch', 'mock_search_area');
     $area = \core_search\manager::get_search_area($areaid);
     // Get a single record to make a doc from.
     $record = $this->generator->create_record();
     $doc = $area->get_document($record);
     // Now we are going to make some files.
     $fs = get_file_storage();
     $syscontext = \context_system::instance();
     // We need to make a file greater than 1kB in size, which is the lowest filter size.
     $filerecord = new \stdClass();
     $filerecord->filename = 'largefile';
     $filerecord->content = 'Some LargeFindContent to find.';
     for ($i = 0; $i < 200; $i++) {
         $filerecord->content .= ' The quick brown fox jumps over the lazy dog.';
     }
     $this->assertGreaterThan(1024, strlen($filerecord->content));
     $file = $this->generator->create_file($filerecord);
     $doc->add_stored_file($file);
     $filerecord->filename = 'smallfile';
     $filerecord->content = 'Some SmallFindContent to find.';
     $file = $this->generator->create_file($filerecord);
     $doc->add_stored_file($file);
     $this->engine->add_document($doc, true);
     $this->engine->area_index_complete($area->get_area_id());
     $querydata = new stdClass();
     // We shouldn't be able to find the large file contents.
     $querydata->q = 'LargeFindContent';
     $this->assertCount(0, $this->search->search($querydata));
     // But we should be able to find the filename.
     $querydata->q = 'largefile';
     $this->assertCount(1, $this->search->search($querydata));
     // We should be able to find the small file contents.
     $querydata->q = 'SmallFindContent';
     $this->assertCount(1, $this->search->search($querydata));
     // And we should be able to find the filename.
     $querydata->q = 'smallfile';
     $this->assertCount(1, $this->search->search($querydata));
 }
Example #7
0
 /**
  * Adding this test here as get_areas_user_accesses process is the same, results just depend on the context level.
  *
  * @return void
  */
 public function test_search_user_accesses()
 {
     global $DB;
     $this->resetAfterTest();
     $frontpage = $DB->get_record('course', array('id' => SITEID));
     $course1 = $this->getDataGenerator()->create_course();
     $course1ctx = context_course::instance($course1->id);
     $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');
     $frontpageforum = $this->getDataGenerator()->create_module('forum', array('course' => $frontpage->id));
     $forum1 = $this->getDataGenerator()->create_module('forum', array('course' => $course1->id));
     $forum2 = $this->getDataGenerator()->create_module('forum', array('course' => $course1->id));
     $forum3 = $this->getDataGenerator()->create_module('forum', array('course' => $course2->id));
     $frontpageforumcontext = context_module::instance($frontpageforum->cmid);
     $context1 = context_module::instance($forum1->cmid);
     $context2 = context_module::instance($forum2->cmid);
     $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();
     $frontpageandcourse1 = array($frontpageforumcontext->id => $frontpageforumcontext->id, $context1->id => $context1->id, $context2->id => $context2->id);
     $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);
     $contexts = $search->get_areas_user_accesses();
     $this->assertEquals(array($frontpageforumcontext->id => $frontpageforumcontext->id, $context1->id => $context1->id), $contexts[$this->forumpostareaid]);
     // Now test course limited searches.
     set_coursemodule_visible($forum2->cmid, 1);
     $this->getDataGenerator()->enrol_user($student->id, $course2->id, 'student');
     $contexts = $search->get_areas_user_accesses();
     $allcontexts = array($frontpageforumcontext->id => $frontpageforumcontext->id, $context1->id => $context1->id, $context2->id => $context2->id, $context3->id => $context3->id);
     $this->assertEquals($allcontexts, $contexts[$this->forumpostareaid]);
     $this->assertEquals(array($sitectx->id => $sitectx->id, $course1ctx->id => $course1ctx->id, $course2ctx->id => $course2ctx->id), $contexts[$this->mycoursesareaid]);
     $contexts = $search->get_areas_user_accesses(array($course1->id, $course2->id));
     $allcontexts = array($context1->id => $context1->id, $context2->id => $context2->id, $context3->id => $context3->id);
     $this->assertEquals($allcontexts, $contexts[$this->forumpostareaid]);
     $this->assertEquals(array($course1ctx->id => $course1ctx->id, $course2ctx->id => $course2ctx->id), $contexts[$this->mycoursesareaid]);
     $contexts = $search->get_areas_user_accesses(array($course2->id));
     $allcontexts = array($context3->id => $context3->id);
     $this->assertEquals($allcontexts, $contexts[$this->forumpostareaid]);
     $this->assertEquals(array($course2ctx->id => $course2ctx->id), $contexts[$this->mycoursesareaid]);
     $contexts = $search->get_areas_user_accesses(array($course1->id));
     $allcontexts = array($context1->id => $context1->id, $context2->id => $context2->id);
     $this->assertEquals($allcontexts, $contexts[$this->forumpostareaid]);
     $this->assertEquals(array($course1ctx->id => $course1ctx->id), $contexts[$this->mycoursesareaid]);
 }
Example #8
0
 public function test_search_config()
 {
     $this->resetAfterTest();
     $search = testable_core_search::instance();
     // We should test both plugin types and core subsystems. No core subsystems available yet.
     $searcharea = $search->get_search_area($this->forumpostareaid);
     list($componentname, $varname) = $searcharea->get_config_var_name();
     // Just with a couple of vars should be enough.
     $start = time() - 100;
     $end = time();
     set_config($varname . '_indexingstart', $start, $componentname);
     set_config($varname . '_indexingend', $end, $componentname);
     $configs = $search->get_areas_config(array($this->forumpostareaid => $searcharea));
     $this->assertEquals($start, $configs[$this->forumpostareaid]->indexingstart);
     $this->assertEquals($end, $configs[$this->forumpostareaid]->indexingend);
     try {
         $fakeareaid = \core_search\manager::generate_areaid('mod_unexisting', 'chihuaquita');
         $search->reset_config($fakeareaid);
         $this->fail('An exception should be triggered if the provided search area does not exist.');
     } catch (moodle_exception $ex) {
         $this->assertContains($fakeareaid . ' search area is not available.', $ex->getMessage());
     }
     // We clean it all but enabled components.
     $search->reset_config($this->forumpostareaid);
     $this->assertEquals(1, get_config($componentname, $varname . '_enabled'));
     $this->assertEquals(0, get_config($componentname, $varname . '_indexingstart'));
     $this->assertEquals(0, get_config($componentname, $varname . '_indexingend'));
     $this->assertEquals(0, get_config($componentname, $varname . '_lastindexrun'));
     // No caching.
     $configs = $search->get_areas_config(array($this->forumpostareaid => $searcharea));
     $this->assertEquals(0, $configs[$this->forumpostareaid]->indexingstart);
     $this->assertEquals(0, $configs[$this->forumpostareaid]->indexingend);
     set_config($varname . '_indexingstart', $start, $componentname);
     set_config($varname . '_indexingend', $end, $componentname);
     // All components config should be reset.
     $search->reset_config();
     $this->assertEquals(0, get_config($componentname, $varname . '_indexingstart'));
     $this->assertEquals(0, get_config($componentname, $varname . '_indexingend'));
     $this->assertEquals(0, get_config($componentname, $varname . '_lastindexrun'));
     // No caching.
     $configs = $search->get_areas_config(array($this->forumpostareaid => $searcharea));
     $this->assertEquals(0, $configs[$this->forumpostareaid]->indexingstart);
     $this->assertEquals(0, $configs[$this->forumpostareaid]->indexingend);
 }
Example #9
0
 public function test_delete()
 {
     $this->search->index();
     $querydata = new stdClass();
     $querydata->q = 'message';
     $this->assertCount(2, $this->search->search($querydata));
     $areaid = \core_search\manager::generate_areaid('core_mocksearch', 'role_capabilities');
     $this->search->delete_index($areaid);
     cache_helper::purge_by_definition('core', 'search_results');
     $this->assertCount(0, $this->search->search($querydata));
 }
Example #10
0
 /**
  * Set up function. In this instance we are setting up database
  * records to be used in the unit tests.
  */
 protected function setUp()
 {
     global $DB, $CFG;
     parent::setUp();
     $this->resetAfterTest(true);
     set_config('enableglobalsearch', true);
     $this->databaseentryareaid = \core_search\manager::generate_areaid('mod_data', 'entry');
     // Set \core_search::instance to the mock_search_engine as we don't require the search engine to be working to test this.
     $search = testable_core_search::instance();
 }