/** * 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(); }
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(); }
/** * 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, '_')); }
/** * 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()); }
/** * 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); }
/** * 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)); }
/** * 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]); }
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); }
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)); }
/** * 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(); }