Skip to content

Commit 45a15b4

Browse files
committed
Searching: Split out search tests into their own dir
1 parent 2291d78 commit 45a15b4

File tree

4 files changed

+196
-181
lines changed

4 files changed

+196
-181
lines changed

tests/Entity/EntitySearchTest.php renamed to tests/Search/EntitySearchTest.php

Lines changed: 1 addition & 180 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
<?php
22

3-
namespace Tests\Entity;
3+
namespace Search;
44

55
use BookStack\Activity\Models\Tag;
66
use BookStack\Entities\Models\Book;
7-
use BookStack\Entities\Models\Bookshelf;
8-
use BookStack\Entities\Models\Chapter;
9-
use Illuminate\Support\Str;
107
use Tests\TestCase;
118

129
class EntitySearchTest extends TestCase
@@ -312,113 +309,6 @@ public function test_entity_template_selector_search()
312309
$defaultListTest->assertDontSee($templatePage->name);
313310
}
314311

315-
public function test_sibling_search_for_pages()
316-
{
317-
$chapter = $this->entities->chapterHasPages();
318-
$this->assertGreaterThan(2, count($chapter->pages), 'Ensure we\'re testing with at least 1 sibling');
319-
$page = $chapter->pages->first();
320-
321-
$search = $this->actingAs($this->users->viewer())->get("/search/entity/siblings?entity_id={$page->id}&entity_type=page");
322-
$search->assertSuccessful();
323-
foreach ($chapter->pages as $page) {
324-
$search->assertSee($page->name);
325-
}
326-
327-
$search->assertDontSee($chapter->name);
328-
}
329-
330-
public function test_sibling_search_for_pages_without_chapter()
331-
{
332-
$page = $this->entities->pageNotWithinChapter();
333-
$bookChildren = $page->book->getDirectVisibleChildren();
334-
$this->assertGreaterThan(2, count($bookChildren), 'Ensure we\'re testing with at least 1 sibling');
335-
336-
$search = $this->actingAs($this->users->viewer())->get("/search/entity/siblings?entity_id={$page->id}&entity_type=page");
337-
$search->assertSuccessful();
338-
foreach ($bookChildren as $child) {
339-
$search->assertSee($child->name);
340-
}
341-
342-
$search->assertDontSee($page->book->name);
343-
}
344-
345-
public function test_sibling_search_for_chapters()
346-
{
347-
$chapter = $this->entities->chapter();
348-
$bookChildren = $chapter->book->getDirectVisibleChildren();
349-
$this->assertGreaterThan(2, count($bookChildren), 'Ensure we\'re testing with at least 1 sibling');
350-
351-
$search = $this->actingAs($this->users->viewer())->get("/search/entity/siblings?entity_id={$chapter->id}&entity_type=chapter");
352-
$search->assertSuccessful();
353-
foreach ($bookChildren as $child) {
354-
$search->assertSee($child->name);
355-
}
356-
357-
$search->assertDontSee($chapter->book->name);
358-
}
359-
360-
public function test_sibling_search_for_books()
361-
{
362-
$books = Book::query()->take(10)->get();
363-
$book = $books->first();
364-
$this->assertGreaterThan(2, count($books), 'Ensure we\'re testing with at least 1 sibling');
365-
366-
$search = $this->actingAs($this->users->viewer())->get("/search/entity/siblings?entity_id={$book->id}&entity_type=book");
367-
$search->assertSuccessful();
368-
foreach ($books as $expectedBook) {
369-
$search->assertSee($expectedBook->name);
370-
}
371-
}
372-
373-
public function test_sibling_search_for_shelves()
374-
{
375-
$shelves = Bookshelf::query()->take(10)->get();
376-
$shelf = $shelves->first();
377-
$this->assertGreaterThan(2, count($shelves), 'Ensure we\'re testing with at least 1 sibling');
378-
379-
$search = $this->actingAs($this->users->viewer())->get("/search/entity/siblings?entity_id={$shelf->id}&entity_type=bookshelf");
380-
$search->assertSuccessful();
381-
foreach ($shelves as $expectedShelf) {
382-
$search->assertSee($expectedShelf->name);
383-
}
384-
}
385-
386-
public function test_sibling_search_for_books_provides_results_in_alphabetical_order()
387-
{
388-
$contextBook = $this->entities->book();
389-
$searchBook = $this->entities->book();
390-
391-
$searchBook->name = 'Zebras';
392-
$searchBook->save();
393-
394-
$search = $this->actingAs($this->users->viewer())->get("/search/entity/siblings?entity_id={$contextBook->id}&entity_type=book");
395-
$this->withHtml($search)->assertElementNotContains('a:first-child', 'Zebras');
396-
397-
$searchBook->name = '1AAAAAAArdvarks';
398-
$searchBook->save();
399-
400-
$search = $this->actingAs($this->users->viewer())->get("/search/entity/siblings?entity_id={$contextBook->id}&entity_type=book");
401-
$this->withHtml($search)->assertElementContains('a:first-child', '1AAAAAAArdvarks');
402-
}
403-
404-
public function test_sibling_search_for_shelves_provides_results_in_alphabetical_order()
405-
{
406-
$contextShelf = $this->entities->shelf();
407-
$searchShelf = $this->entities->shelf();
408-
409-
$searchShelf->name = 'Zebras';
410-
$searchShelf->save();
411-
412-
$search = $this->actingAs($this->users->viewer())->get("/search/entity/siblings?entity_id={$contextShelf->id}&entity_type=bookshelf");
413-
$this->withHtml($search)->assertElementNotContains('a:first-child', 'Zebras');
414-
415-
$searchShelf->name = '1AAAAAAArdvarks';
416-
$searchShelf->save();
417-
418-
$search = $this->actingAs($this->users->viewer())->get("/search/entity/siblings?entity_id={$contextShelf->id}&entity_type=bookshelf");
419-
$this->withHtml($search)->assertElementContains('a:first-child', '1AAAAAAArdvarks');
420-
}
421-
422312
public function test_search_works_on_updated_page_content()
423313
{
424314
$page = $this->entities->page();
@@ -453,75 +343,6 @@ public function test_search_ranks_common_words_lower()
453343
$this->withHtml($search)->assertElementContains('.entity-list > .page:nth-child(2)', 'Test page A');
454344
}
455345

456-
public function test_terms_in_headers_have_an_adjusted_index_score()
457-
{
458-
$page = $this->entities->newPage(['name' => 'Test page A', 'html' => '
459-
<p>TermA</p>
460-
<h1>TermB <strong>TermNested</strong></h1>
461-
<h2>TermC</h2>
462-
<h3>TermD</h3>
463-
<h4>TermE</h4>
464-
<h5>TermF</h5>
465-
<h6>TermG</h6>
466-
']);
467-
468-
$scoreByTerm = $page->searchTerms()->pluck('score', 'term');
469-
470-
$this->assertEquals(1, $scoreByTerm->get('TermA'));
471-
$this->assertEquals(10, $scoreByTerm->get('TermB'));
472-
$this->assertEquals(10, $scoreByTerm->get('TermNested'));
473-
$this->assertEquals(5, $scoreByTerm->get('TermC'));
474-
$this->assertEquals(4, $scoreByTerm->get('TermD'));
475-
$this->assertEquals(3, $scoreByTerm->get('TermE'));
476-
$this->assertEquals(2, $scoreByTerm->get('TermF'));
477-
// Is 1.5 but stored as integer, rounding up
478-
$this->assertEquals(2, $scoreByTerm->get('TermG'));
479-
}
480-
481-
public function test_indexing_works_as_expected_for_page_with_lots_of_terms()
482-
{
483-
$this->markTestSkipped('Time consuming test');
484-
485-
$count = 100000;
486-
$text = '';
487-
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_#';
488-
for ($i = 0; $i < $count; $i++) {
489-
$text .= substr(str_shuffle($chars), 0, 5) . ' ';
490-
}
491-
492-
$page = $this->entities->newPage(['name' => 'Test page A', 'html' => '<p>' . $text . '</p>']);
493-
494-
$termCount = $page->searchTerms()->count();
495-
496-
// Expect at least 90% unique rate
497-
$this->assertGreaterThan($count * 0.9, $termCount);
498-
}
499-
500-
public function test_name_and_content_terms_are_merged_to_single_score()
501-
{
502-
$page = $this->entities->newPage(['name' => 'TermA', 'html' => '
503-
<p>TermA</p>
504-
']);
505-
506-
$scoreByTerm = $page->searchTerms()->pluck('score', 'term');
507-
508-
// Scores 40 for being in the name then 1 for being in the content
509-
$this->assertEquals(41, $scoreByTerm->get('TermA'));
510-
}
511-
512-
public function test_tag_names_and_values_are_indexed_for_search()
513-
{
514-
$page = $this->entities->newPage(['name' => 'PageA', 'html' => '<p>content</p>', 'tags' => [
515-
['name' => 'Animal', 'value' => 'MeowieCat'],
516-
['name' => 'SuperImportant'],
517-
]]);
518-
519-
$scoreByTerm = $page->searchTerms()->pluck('score', 'term');
520-
$this->assertEquals(5, $scoreByTerm->get('MeowieCat'));
521-
$this->assertEquals(3, $scoreByTerm->get('Animal'));
522-
$this->assertEquals(3, $scoreByTerm->get('SuperImportant'));
523-
}
524-
525346
public function test_matching_terms_in_search_results_are_highlighted()
526347
{
527348
$this->entities->newPage(['name' => 'My Meowie Cat', 'html' => '<p>A superimportant page about meowieable animals</p>', 'tags' => [

tests/Search/SearchIndexingTest.php

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?php
2+
3+
namespace Search;
4+
5+
use Tests\TestCase;
6+
7+
class SearchIndexingTest extends TestCase
8+
{
9+
public function test_terms_in_headers_have_an_adjusted_index_score()
10+
{
11+
$page = $this->entities->newPage(['name' => 'Test page A', 'html' => '
12+
<p>TermA</p>
13+
<h1>TermB <strong>TermNested</strong></h1>
14+
<h2>TermC</h2>
15+
<h3>TermD</h3>
16+
<h4>TermE</h4>
17+
<h5>TermF</h5>
18+
<h6>TermG</h6>
19+
']);
20+
21+
$scoreByTerm = $page->searchTerms()->pluck('score', 'term');
22+
23+
$this->assertEquals(1, $scoreByTerm->get('TermA'));
24+
$this->assertEquals(10, $scoreByTerm->get('TermB'));
25+
$this->assertEquals(10, $scoreByTerm->get('TermNested'));
26+
$this->assertEquals(5, $scoreByTerm->get('TermC'));
27+
$this->assertEquals(4, $scoreByTerm->get('TermD'));
28+
$this->assertEquals(3, $scoreByTerm->get('TermE'));
29+
$this->assertEquals(2, $scoreByTerm->get('TermF'));
30+
// Is 1.5 but stored as integer, rounding up
31+
$this->assertEquals(2, $scoreByTerm->get('TermG'));
32+
}
33+
34+
public function test_indexing_works_as_expected_for_page_with_lots_of_terms()
35+
{
36+
$this->markTestSkipped('Time consuming test');
37+
38+
$count = 100000;
39+
$text = '';
40+
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_#';
41+
for ($i = 0; $i < $count; $i++) {
42+
$text .= substr(str_shuffle($chars), 0, 5) . ' ';
43+
}
44+
45+
$page = $this->entities->newPage(['name' => 'Test page A', 'html' => '<p>' . $text . '</p>']);
46+
47+
$termCount = $page->searchTerms()->count();
48+
49+
// Expect at least 90% unique rate
50+
$this->assertGreaterThan($count * 0.9, $termCount);
51+
}
52+
53+
public function test_name_and_content_terms_are_merged_to_single_score()
54+
{
55+
$page = $this->entities->newPage(['name' => 'TermA', 'html' => '
56+
<p>TermA</p>
57+
']);
58+
59+
$scoreByTerm = $page->searchTerms()->pluck('score', 'term');
60+
61+
// Scores 40 for being in the name then 1 for being in the content
62+
$this->assertEquals(41, $scoreByTerm->get('TermA'));
63+
}
64+
65+
public function test_tag_names_and_values_are_indexed_for_search()
66+
{
67+
$page = $this->entities->newPage(['name' => 'PageA', 'html' => '<p>content</p>', 'tags' => [
68+
['name' => 'Animal', 'value' => 'MeowieCat'],
69+
['name' => 'SuperImportant'],
70+
]]);
71+
72+
$scoreByTerm = $page->searchTerms()->pluck('score', 'term');
73+
$this->assertEquals(5, $scoreByTerm->get('MeowieCat'));
74+
$this->assertEquals(3, $scoreByTerm->get('Animal'));
75+
$this->assertEquals(3, $scoreByTerm->get('SuperImportant'));
76+
}
77+
}

tests/Entity/SearchOptionsTest.php renamed to tests/Search/SearchOptionsTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?php
22

3-
namespace Tests\Entity;
3+
namespace Search;
44

55
use BookStack\Search\Options\ExactSearchOption;
66
use BookStack\Search\Options\FilterSearchOption;

0 commit comments

Comments
 (0)