public function test_ousearch_query() { global $DB; $this->resetAfterTest(); // Create a bunch of search documents within test_zombie plugin. self::$zombiedocuments = array(1 => (object) array('title' => 'Document title', 'content' => 'First zombie document'), 2 => (object) array('title' => 'Another title', 'content' => 'Title title first'), 3 => (object) array('title' => 'Document title', 'content' => 'Not a zombie document title'), 4 => (object) array('title' => 'Delete me', 'content' => 'Delete me'), 100 => (object) array('title' => 'Bottle quantity', 'content' => 'There are this many bottles on the wall: 0')); for ($i = 101; $i <= 199; $i++) { self::$zombiedocuments[$i] = self::$zombiedocuments[100]; self::$zombiedocuments[$i]->content = str_replace(': 0', ': ' . ($i - 100), self::$zombiedocuments[$i]->content); } foreach (self::$zombiedocuments as $key => $content) { $doc = new local_ousearch_document(); $doc->init_test('zombie'); $doc->set_int_refs($key); $doc->update($content->title, $content->content, null, null, null); } // Search for single unique term. $result = $this->do_zombie_query('not'); $this->assertTrue($result->success); $this->assertEquals(array(3), $this->get_result_ids($result)); // Search for nonexistent word. $result = $this->do_zombie_query('xyzzy'); $this->assertFalse($result->success); $this->assertEquals('xyzzy', $result->problemword); // Search for nothing. $result = $this->do_zombie_query(' '); $this->assertFalse($result->success); $this->assertEquals('', $result->problemword); // Search for pair of terms. $result = $this->do_zombie_query('first document'); $this->assertTrue($result->success); $this->assertEquals(array(1), $this->get_result_ids($result)); // Search for quoted terms. $result = $this->do_zombie_query('"title title"'); $this->assertTrue($result->success); $this->assertEquals(array(2), $this->get_result_ids($result)); // Negative terms. $result = $this->do_zombie_query('title -not'); $this->assertTrue($result->success); $this->assertEquals(array(1, 2), $this->get_result_ids($result)); // Negative quoted terms. $result = $this->do_zombie_query('title -"not frog"'); $this->assertTrue($result->success); $this->assertEquals(array(1, 2, 3), $this->get_result_ids($result)); $result = $this->do_zombie_query('title -"not a"'); $this->assertTrue($result->success); $this->assertEquals(array(1, 2), $this->get_result_ids($result)); // Deleting stale results (those which the module responsible can no // longer find). $before = $DB->count_records('local_ousearch_documents'); unset(self::$zombiedocuments[4]); $result = $this->do_zombie_query('delete'); $this->assertEquals(1, count(phpunit_util::get_debugging_messages())); phpunit_util::reset_debugging(); $this->assertTrue($result->success); $this->assertEquals(array(), $this->get_result_ids($result)); $this->assertEquals($before - 1, $DB->count_records('local_ousearch_documents')); // Ranking based on title vs content and number of occurrences. $result = $this->do_zombie_query('title'); $this->assertTrue($result->success); $this->assertEquals(array(1, 2, 3), $this->get_result_ids($result)); $this->assertEquals(2, $result->results[0]->intref1); $this->assertEquals(18, $result->results[0]->totalscore); // Managing result lists. $found = array(); $dbstart = 0; for ($i = 0; $i < 10; $i++) { $result = $this->do_zombie_query('bottles', $dbstart); $this->assertTrue($result->success); $this->assertEquals(10, count($result->results)); foreach ($result->results as $thing) { $found[$thing->intref1] = true; } $dbstart = $result->dbstart; } $this->assertEquals(100, count($found)); $result = $this->do_zombie_query('bottles', $dbstart); $this->assertTrue($result->success); $this->assertEquals(0, count($result->results)); }