| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |  | <?php | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | namespace Tests\Entity; | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-16 03:09:33 +08:00
										 |  |  |  | use BookStack\Actions\Tag; | 
					
						
							| 
									
										
										
										
											2020-11-22 08:17:45 +08:00
										 |  |  |  | use BookStack\Entities\Models\Book; | 
					
						
							|  |  |  |  | use BookStack\Entities\Models\Bookshelf; | 
					
						
							|  |  |  |  | use BookStack\Entities\Models\Chapter; | 
					
						
							|  |  |  |  | use BookStack\Entities\Models\Page; | 
					
						
							| 
									
										
										
										
											2020-04-04 08:16:05 +08:00
										 |  |  |  | use Tests\TestCase; | 
					
						
							| 
									
										
										
										
											2017-07-27 23:10:58 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  | class EntitySearchTest extends TestCase | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  |     public function test_page_search() | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-02-16 03:09:33 +08:00
										 |  |  |  |         $book = Book::all()->first(); | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |  |         $page = $book->pages->first(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |         $search = $this->asEditor()->get('/search?term=' . urlencode($page->name)); | 
					
						
							|  |  |  |  |         $search->assertSee('Search Results'); | 
					
						
							| 
									
										
										
										
											2021-11-13 22:51:59 +08:00
										 |  |  |  |         $search->assertSeeText($page->name, true); | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-23 19:34:30 +08:00
										 |  |  |  |     public function test_bookshelf_search() | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-11-13 21:43:41 +08:00
										 |  |  |  |         /** @var Bookshelf $shelf */ | 
					
						
							|  |  |  |  |         $shelf = Bookshelf::query()->first(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-13 22:51:59 +08:00
										 |  |  |  |         $search = $this->asEditor()->get('/search?term=' . urlencode($shelf->name) . '  {type:bookshelf}'); | 
					
						
							|  |  |  |  |         $search->assertSee('Search Results'); | 
					
						
							|  |  |  |  |         $search->assertSeeText($shelf->name, true); | 
					
						
							| 
									
										
										
										
											2018-09-23 19:34:30 +08:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |  |     public function test_invalid_page_search() | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |         $resp = $this->asEditor()->get('/search?term=' . urlencode('<p>test</p>')); | 
					
						
							|  |  |  |  |         $resp->assertSee('Search Results'); | 
					
						
							|  |  |  |  |         $resp->assertStatus(200); | 
					
						
							|  |  |  |  |         $this->get('/search?term=cat+-')->assertStatus(200); | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |     public function test_empty_search_shows_search_page() | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |         $res = $this->asEditor()->get('/search'); | 
					
						
							|  |  |  |  |         $res->assertStatus(200); | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |     public function test_searching_accents_and_small_terms() | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-10-16 02:24:06 +08:00
										 |  |  |  |         $page = $this->newPage(['name' => 'My new test quaffleachits', 'html' => 'some áéííúü¿¡ test content a2 orange dog']); | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |         $this->asEditor(); | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |         $accentSearch = $this->get('/search?term=' . urlencode('áéíí')); | 
					
						
							|  |  |  |  |         $accentSearch->assertStatus(200)->assertSee($page->name); | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-16 02:24:06 +08:00
										 |  |  |  |         $smallSearch = $this->get('/search?term=' . urlencode('a2')); | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |         $smallSearch->assertStatus(200)->assertSee($page->name); | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |     public function test_book_search() | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-02-16 03:09:33 +08:00
										 |  |  |  |         $book = Book::first(); | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |         $page = $book->pages->last(); | 
					
						
							|  |  |  |  |         $chapter = $book->chapters->last(); | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |         $pageTestResp = $this->asEditor()->get('/search/book/' . $book->id . '?term=' . urlencode($page->name)); | 
					
						
							|  |  |  |  |         $pageTestResp->assertSee($page->name); | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |         $chapterTestResp = $this->asEditor()->get('/search/book/' . $book->id . '?term=' . urlencode($chapter->name)); | 
					
						
							|  |  |  |  |         $chapterTestResp->assertSee($chapter->name); | 
					
						
							| 
									
										
										
										
											2016-08-26 00:17:26 +08:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |     public function test_chapter_search() | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-02-16 03:09:33 +08:00
										 |  |  |  |         $chapter = Chapter::has('pages')->first(); | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |         $page = $chapter->pages[0]; | 
					
						
							| 
									
										
										
										
											2016-06-12 19:48:06 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |         $pageTestResp = $this->asEditor()->get('/search/chapter/' . $chapter->id . '?term=' . urlencode($page->name)); | 
					
						
							|  |  |  |  |         $pageTestResp->assertSee($page->name); | 
					
						
							| 
									
										
										
										
											2016-10-30 20:15:11 +08:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-12 21:21:16 +08:00
										 |  |  |  |     public function test_tag_search() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $newTags = [ | 
					
						
							| 
									
										
										
										
											2020-02-16 03:09:33 +08:00
										 |  |  |  |             new Tag([ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |  |                 'name'  => 'animal', | 
					
						
							|  |  |  |  |                 'value' => 'cat', | 
					
						
							| 
									
										
										
										
											2016-11-12 21:21:16 +08:00
										 |  |  |  |             ]), | 
					
						
							| 
									
										
										
										
											2020-02-16 03:09:33 +08:00
										 |  |  |  |             new Tag([ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |  |                 'name'  => 'color', | 
					
						
							|  |  |  |  |                 'value' => 'red', | 
					
						
							|  |  |  |  |             ]), | 
					
						
							| 
									
										
										
										
											2016-11-12 21:21:16 +08:00
										 |  |  |  |         ]; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-27 23:10:58 +08:00
										 |  |  |  |         $pageA = Page::first(); | 
					
						
							| 
									
										
										
										
											2016-11-12 21:21:16 +08:00
										 |  |  |  |         $pageA->tags()->saveMany($newTags); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-27 23:10:58 +08:00
										 |  |  |  |         $pageB = Page::all()->last(); | 
					
						
							| 
									
										
										
										
											2016-11-12 21:21:16 +08:00
										 |  |  |  |         $pageB->tags()->create(['name' => 'animal', 'value' => 'dog']); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |         $this->asEditor(); | 
					
						
							|  |  |  |  |         $tNameSearch = $this->get('/search?term=%5Banimal%5D'); | 
					
						
							|  |  |  |  |         $tNameSearch->assertSee($pageA->name)->assertSee($pageB->name); | 
					
						
							| 
									
										
										
										
											2016-11-12 21:21:16 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |         $tNameSearch2 = $this->get('/search?term=%5Bcolor%5D'); | 
					
						
							|  |  |  |  |         $tNameSearch2->assertSee($pageA->name)->assertDontSee($pageB->name); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $tNameValSearch = $this->get('/search?term=%5Banimal%3Dcat%5D'); | 
					
						
							|  |  |  |  |         $tNameValSearch->assertSee($pageA->name)->assertDontSee($pageB->name); | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     public function test_exact_searches() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $page = $this->newPage(['name' => 'My new test page', 'html' => 'this is a story about an orange donkey']); | 
					
						
							| 
									
										
										
										
											2016-11-12 21:21:16 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |         $exactSearchA = $this->asEditor()->get('/search?term=' . urlencode('"story about an orange"')); | 
					
						
							|  |  |  |  |         $exactSearchA->assertStatus(200)->assertSee($page->name); | 
					
						
							| 
									
										
										
										
											2016-11-12 21:21:16 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |         $exactSearchB = $this->asEditor()->get('/search?term=' . urlencode('"story not about an orange"')); | 
					
						
							|  |  |  |  |         $exactSearchB->assertStatus(200)->assertDontSee($page->name); | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-13 02:03:44 +08:00
										 |  |  |  |     public function test_search_terms_with_delimiters_are_converted_to_exact_matches() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $this->asEditor(); | 
					
						
							|  |  |  |  |         $page = $this->newPage(['name' => 'Delimiter test', 'html' => '<p>1.1 2,2 3?3 4:4 5;5 (8) <9> "10" \'11\' `12`</p>']); | 
					
						
							|  |  |  |  |         $terms = explode(' ', '1.1 2,2 3?3 4:4 5;5 (8) <9> "10" \'11\' `12`'); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         foreach ($terms as $term) { | 
					
						
							|  |  |  |  |             $search = $this->get('/search?term=' . urlencode($term)); | 
					
						
							|  |  |  |  |             $search->assertSee($page->name); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |     public function test_search_filters() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $page = $this->newPage(['name' => 'My new test quaffleachits', 'html' => 'this is about an orange donkey danzorbhsing']); | 
					
						
							|  |  |  |  |         $this->asEditor(); | 
					
						
							|  |  |  |  |         $editorId = $this->getEditor()->id; | 
					
						
							| 
									
										
										
										
											2021-03-11 07:04:18 +08:00
										 |  |  |  |         $editorSlug = $this->getEditor()->slug; | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         // Viewed filter searches
 | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {not_viewed_by_me}'))->assertSee($page->name); | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {viewed_by_me}'))->assertDontSee($page->name); | 
					
						
							|  |  |  |  |         $this->get($page->getUrl()); | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {not_viewed_by_me}'))->assertDontSee($page->name); | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {viewed_by_me}'))->assertSee($page->name); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         // User filters
 | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {created_by:me}'))->assertDontSee($page->name); | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {updated_by:me}'))->assertDontSee($page->name); | 
					
						
							| 
									
										
										
										
											2021-02-14 18:40:02 +08:00
										 |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {owned_by:me}'))->assertDontSee($page->name); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {updated_by:' . $editorSlug . '}'))->assertDontSee($page->name); | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |         $page->created_by = $editorId; | 
					
						
							|  |  |  |  |         $page->save(); | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {created_by:me}'))->assertSee($page->name); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {created_by: ' . $editorSlug . '}'))->assertSee($page->name); | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {updated_by:me}'))->assertDontSee($page->name); | 
					
						
							| 
									
										
										
										
											2021-02-14 18:40:02 +08:00
										 |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {owned_by:me}'))->assertDontSee($page->name); | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  |         $page->updated_by = $editorId; | 
					
						
							|  |  |  |  |         $page->save(); | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {updated_by:me}'))->assertSee($page->name); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {updated_by:' . $editorSlug . '}'))->assertSee($page->name); | 
					
						
							| 
									
										
										
										
											2021-02-14 18:40:02 +08:00
										 |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {owned_by:me}'))->assertDontSee($page->name); | 
					
						
							|  |  |  |  |         $page->owned_by = $editorId; | 
					
						
							|  |  |  |  |         $page->save(); | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {owned_by:me}'))->assertSee($page->name); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {owned_by:' . $editorSlug . '}'))->assertSee($page->name); | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         // Content filters
 | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('{in_name:danzorbhsing}'))->assertDontSee($page->name); | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('{in_body:danzorbhsing}'))->assertSee($page->name); | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('{in_name:test quaffleachits}'))->assertSee($page->name); | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('{in_body:test quaffleachits}'))->assertDontSee($page->name); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         // Restricted filter
 | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {is_restricted}'))->assertDontSee($page->name); | 
					
						
							|  |  |  |  |         $page->restricted = true; | 
					
						
							|  |  |  |  |         $page->save(); | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {is_restricted}'))->assertSee($page->name); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         // Date filters
 | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {updated_after:2037-01-01}'))->assertDontSee($page->name); | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {updated_before:2037-01-01}'))->assertSee($page->name); | 
					
						
							|  |  |  |  |         $page->updated_at = '2037-02-01'; | 
					
						
							|  |  |  |  |         $page->save(); | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {updated_after:2037-01-01}'))->assertSee($page->name); | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {updated_before:2037-01-01}'))->assertDontSee($page->name); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {created_after:2037-01-01}'))->assertDontSee($page->name); | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {created_before:2037-01-01}'))->assertSee($page->name); | 
					
						
							|  |  |  |  |         $page->created_at = '2037-02-01'; | 
					
						
							|  |  |  |  |         $page->save(); | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {created_after:2037-01-01}'))->assertSee($page->name); | 
					
						
							|  |  |  |  |         $this->get('/search?term=' . urlencode('danzorbhsing {created_before:2037-01-01}'))->assertDontSee($page->name); | 
					
						
							| 
									
										
										
										
											2016-11-12 21:21:16 +08:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-12 19:48:06 +08:00
										 |  |  |  |     public function test_ajax_entity_search() | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-09-23 22:15:44 +08:00
										 |  |  |  |         $page = $this->newPage(['name' => 'my ajax search test', 'html' => 'ajax test']); | 
					
						
							| 
									
										
										
										
											2017-07-27 23:10:58 +08:00
										 |  |  |  |         $notVisitedPage = Page::first(); | 
					
						
							| 
									
										
										
										
											2017-04-16 17:47:44 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         // Visit the page to make popular
 | 
					
						
							|  |  |  |  |         $this->asEditor()->get($page->getUrl()); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $normalSearch = $this->get('/ajax/search/entities?term=' . urlencode($page->name)); | 
					
						
							|  |  |  |  |         $normalSearch->assertSee($page->name); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $bookSearch = $this->get('/ajax/search/entities?types=book&term=' . urlencode($page->name)); | 
					
						
							|  |  |  |  |         $bookSearch->assertDontSee($page->name); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $defaultListTest = $this->get('/ajax/search/entities'); | 
					
						
							|  |  |  |  |         $defaultListTest->assertSee($page->name); | 
					
						
							|  |  |  |  |         $defaultListTest->assertDontSee($notVisitedPage->name); | 
					
						
							| 
									
										
										
										
											2016-06-12 19:48:06 +08:00
										 |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-07-27 23:10:58 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     public function test_ajax_entity_serach_shows_breadcrumbs() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $chapter = Chapter::first(); | 
					
						
							|  |  |  |  |         $page = $chapter->pages->first(); | 
					
						
							|  |  |  |  |         $this->asEditor(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $pageSearch = $this->get('/ajax/search/entities?term=' . urlencode($page->name)); | 
					
						
							|  |  |  |  |         $pageSearch->assertSee($page->name); | 
					
						
							| 
									
										
										
										
											2019-04-07 01:36:17 +08:00
										 |  |  |  |         $pageSearch->assertSee($chapter->getShortName(42)); | 
					
						
							|  |  |  |  |         $pageSearch->assertSee($page->book->getShortName(42)); | 
					
						
							| 
									
										
										
										
											2017-07-27 23:10:58 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         $chapterSearch = $this->get('/ajax/search/entities?term=' . urlencode($chapter->name)); | 
					
						
							|  |  |  |  |         $chapterSearch->assertSee($chapter->name); | 
					
						
							| 
									
										
										
										
											2019-04-07 01:36:17 +08:00
										 |  |  |  |         $chapterSearch->assertSee($chapter->book->getShortName(42)); | 
					
						
							| 
									
										
										
										
											2017-07-27 23:10:58 +08:00
										 |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-02-16 03:09:33 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     public function test_sibling_search_for_pages() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $chapter = Chapter::query()->with('pages')->first(); | 
					
						
							|  |  |  |  |         $this->assertGreaterThan(2, count($chapter->pages), 'Ensure we\'re testing with at least 1 sibling'); | 
					
						
							|  |  |  |  |         $page = $chapter->pages->first(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $search = $this->actingAs($this->getViewer())->get("/search/entity/siblings?entity_id={$page->id}&entity_type=page"); | 
					
						
							|  |  |  |  |         $search->assertSuccessful(); | 
					
						
							|  |  |  |  |         foreach ($chapter->pages as $page) { | 
					
						
							|  |  |  |  |             $search->assertSee($page->name); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $search->assertDontSee($chapter->name); | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     public function test_sibling_search_for_pages_without_chapter() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $page = Page::query()->where('chapter_id', '=', 0)->firstOrFail(); | 
					
						
							|  |  |  |  |         $bookChildren = $page->book->getDirectChildren(); | 
					
						
							|  |  |  |  |         $this->assertGreaterThan(2, count($bookChildren), 'Ensure we\'re testing with at least 1 sibling'); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $search = $this->actingAs($this->getViewer())->get("/search/entity/siblings?entity_id={$page->id}&entity_type=page"); | 
					
						
							|  |  |  |  |         $search->assertSuccessful(); | 
					
						
							|  |  |  |  |         foreach ($bookChildren as $child) { | 
					
						
							|  |  |  |  |             $search->assertSee($child->name); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $search->assertDontSee($page->book->name); | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     public function test_sibling_search_for_chapters() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $chapter = Chapter::query()->firstOrFail(); | 
					
						
							|  |  |  |  |         $bookChildren = $chapter->book->getDirectChildren(); | 
					
						
							|  |  |  |  |         $this->assertGreaterThan(2, count($bookChildren), 'Ensure we\'re testing with at least 1 sibling'); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $search = $this->actingAs($this->getViewer())->get("/search/entity/siblings?entity_id={$chapter->id}&entity_type=chapter"); | 
					
						
							|  |  |  |  |         $search->assertSuccessful(); | 
					
						
							|  |  |  |  |         foreach ($bookChildren as $child) { | 
					
						
							|  |  |  |  |             $search->assertSee($child->name); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $search->assertDontSee($chapter->book->name); | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     public function test_sibling_search_for_books() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $books = Book::query()->take(10)->get(); | 
					
						
							|  |  |  |  |         $book = $books->first(); | 
					
						
							|  |  |  |  |         $this->assertGreaterThan(2, count($books), 'Ensure we\'re testing with at least 1 sibling'); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $search = $this->actingAs($this->getViewer())->get("/search/entity/siblings?entity_id={$book->id}&entity_type=book"); | 
					
						
							|  |  |  |  |         $search->assertSuccessful(); | 
					
						
							|  |  |  |  |         foreach ($books as $expectedBook) { | 
					
						
							|  |  |  |  |             $search->assertSee($expectedBook->name); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     public function test_sibling_search_for_shelves() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $shelves = Bookshelf::query()->take(10)->get(); | 
					
						
							|  |  |  |  |         $shelf = $shelves->first(); | 
					
						
							|  |  |  |  |         $this->assertGreaterThan(2, count($shelves), 'Ensure we\'re testing with at least 1 sibling'); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $search = $this->actingAs($this->getViewer())->get("/search/entity/siblings?entity_id={$shelf->id}&entity_type=bookshelf"); | 
					
						
							|  |  |  |  |         $search->assertSuccessful(); | 
					
						
							|  |  |  |  |         foreach ($shelves as $expectedShelf) { | 
					
						
							|  |  |  |  |             $search->assertSee($expectedShelf->name); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-05-23 07:46:13 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     public function test_search_works_on_updated_page_content() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $page = Page::query()->first(); | 
					
						
							|  |  |  |  |         $this->asEditor(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $update = $this->put($page->getUrl(), [ | 
					
						
							|  |  |  |  |             'name' => $page->name, | 
					
						
							|  |  |  |  |             'html' => '<p>dog pandabearmonster spaghetti</p>', | 
					
						
							|  |  |  |  |         ]); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $search = $this->asEditor()->get('/search?term=pandabearmonster'); | 
					
						
							|  |  |  |  |         $search->assertStatus(200); | 
					
						
							|  |  |  |  |         $search->assertSeeText($page->name); | 
					
						
							|  |  |  |  |         $search->assertSee($page->getUrl()); | 
					
						
							|  |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-11-09 23:05:02 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     public function test_search_ranks_common_words_lower() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $this->newPage(['name' => 'Test page A', 'html' => '<p>dog biscuit dog dog</p>']); | 
					
						
							|  |  |  |  |         $this->newPage(['name' => 'Test page B', 'html' => '<p>cat biscuit</p>']); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $search = $this->asEditor()->get('/search?term=cat+dog+biscuit'); | 
					
						
							|  |  |  |  |         $search->assertElementContains('.entity-list > .page', 'Test page A', 1); | 
					
						
							|  |  |  |  |         $search->assertElementContains('.entity-list > .page', 'Test page B', 2); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         for ($i = 0; $i < 2; $i++) { | 
					
						
							|  |  |  |  |             $this->newPage(['name' => 'Test page ' . $i, 'html' => '<p>dog</p>']); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $search = $this->asEditor()->get('/search?term=cat+dog+biscuit'); | 
					
						
							|  |  |  |  |         $search->assertElementContains('.entity-list > .page', 'Test page B', 1); | 
					
						
							|  |  |  |  |         $search->assertElementContains('.entity-list > .page', 'Test page A', 2); | 
					
						
							|  |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-11-12 21:47:23 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     public function test_terms_in_headers_have_an_adjusted_index_score() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $page = $this->newPage(['name' => 'Test page A', 'html' => ' | 
					
						
							|  |  |  |  |             <p>TermA</p> | 
					
						
							|  |  |  |  |             <h1>TermB <strong>TermNested</strong></h1> | 
					
						
							|  |  |  |  |             <h2>TermC</h2> | 
					
						
							|  |  |  |  |             <h3>TermD</h3> | 
					
						
							|  |  |  |  |             <h4>TermE</h4> | 
					
						
							|  |  |  |  |             <h5>TermF</h5> | 
					
						
							|  |  |  |  |             <h6>TermG</h6> | 
					
						
							|  |  |  |  |         ']); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-13 01:06:01 +08:00
										 |  |  |  |         $scoreByTerm = $page->searchTerms()->pluck('score', 'term'); | 
					
						
							| 
									
										
										
										
											2021-11-12 21:47:23 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         $this->assertEquals(1, $scoreByTerm->get('TermA')); | 
					
						
							|  |  |  |  |         $this->assertEquals(10, $scoreByTerm->get('TermB')); | 
					
						
							|  |  |  |  |         $this->assertEquals(10, $scoreByTerm->get('TermNested')); | 
					
						
							|  |  |  |  |         $this->assertEquals(5, $scoreByTerm->get('TermC')); | 
					
						
							|  |  |  |  |         $this->assertEquals(4, $scoreByTerm->get('TermD')); | 
					
						
							|  |  |  |  |         $this->assertEquals(3, $scoreByTerm->get('TermE')); | 
					
						
							|  |  |  |  |         $this->assertEquals(2, $scoreByTerm->get('TermF')); | 
					
						
							|  |  |  |  |         // Is 1.5 but stored as integer, rounding up
 | 
					
						
							|  |  |  |  |         $this->assertEquals(2, $scoreByTerm->get('TermG')); | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     public function test_name_and_content_terms_are_merged_to_single_score() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $page = $this->newPage(['name' => 'TermA', 'html' => ' | 
					
						
							|  |  |  |  |             <p>TermA</p> | 
					
						
							|  |  |  |  |         ']); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-13 01:06:01 +08:00
										 |  |  |  |         $scoreByTerm = $page->searchTerms()->pluck('score', 'term'); | 
					
						
							| 
									
										
										
										
											2021-11-12 21:47:23 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         // Scores 40 for being in the name then 1 for being in the content
 | 
					
						
							|  |  |  |  |         $this->assertEquals(41, $scoreByTerm->get('TermA')); | 
					
						
							|  |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-11-13 01:06:01 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     public function test_tag_names_and_values_are_indexed_for_search() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $page = $this->newPage(['name' => 'PageA', 'html' => '<p>content</p>', 'tags' => [ | 
					
						
							|  |  |  |  |             ['name' => 'Animal', 'value' => 'MeowieCat'], | 
					
						
							|  |  |  |  |             ['name' => 'SuperImportant'], | 
					
						
							|  |  |  |  |         ]]); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $scoreByTerm = $page->searchTerms()->pluck('score', 'term'); | 
					
						
							|  |  |  |  |         $this->assertEquals(5, $scoreByTerm->get('MeowieCat')); | 
					
						
							|  |  |  |  |         $this->assertEquals(3, $scoreByTerm->get('Animal')); | 
					
						
							|  |  |  |  |         $this->assertEquals(3, $scoreByTerm->get('SuperImportant')); | 
					
						
							|  |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-11-13 21:26:11 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     public function test_matching_terms_in_search_results_are_highlighted() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $this->newPage(['name' => 'My Meowie Cat', 'html' => '<p>A superimportant page about meowieable animals</p>', 'tags' => [ | 
					
						
							|  |  |  |  |             ['name' => 'Animal', 'value' => 'MeowieCat'], | 
					
						
							|  |  |  |  |             ['name' => 'SuperImportant'], | 
					
						
							|  |  |  |  |         ]]); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $search = $this->asEditor()->get('/search?term=SuperImportant+Meowie'); | 
					
						
							|  |  |  |  |         // Title
 | 
					
						
							|  |  |  |  |         $search->assertSee('My <strong>Meowie</strong> Cat', false); | 
					
						
							|  |  |  |  |         // Content
 | 
					
						
							|  |  |  |  |         $search->assertSee('A <strong>superimportant</strong> page about <strong>meowie</strong>able animals', false); | 
					
						
							|  |  |  |  |         // Tag name
 | 
					
						
							|  |  |  |  |         $search->assertElementContains('.tag-name.highlight', 'SuperImportant'); | 
					
						
							|  |  |  |  |         // Tag value
 | 
					
						
							|  |  |  |  |         $search->assertElementContains('.tag-value.highlight', 'MeowieCat'); | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-18 18:38:33 +08:00
										 |  |  |  |     public function test_match_highlighting_works_with_multibyte_content() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $this->newPage([ | 
					
						
							|  |  |  |  |             'name' => 'Test Page', | 
					
						
							| 
									
										
										
										
											2021-12-18 19:43:05 +08:00
										 |  |  |  |             'html' => '<p>На мен ми трябва нещо добро test</p>', | 
					
						
							| 
									
										
										
										
											2021-12-18 18:38:33 +08:00
										 |  |  |  |         ]); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $search = $this->asEditor()->get('/search?term=' . urlencode('На мен ми трябва нещо добро')); | 
					
						
							|  |  |  |  |         $search->assertSee('<strong>На</strong> <strong>мен</strong> <strong>ми</strong> <strong>трябва</strong> <strong>нещо</strong> <strong>добро</strong> test', false); | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-13 21:26:11 +08:00
										 |  |  |  |     public function test_html_entities_in_item_details_remains_escaped_in_search_results() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $this->newPage(['name' => 'My <cool> TestPageContent', 'html' => '<p>My supercool <great> TestPageContent page</p>']); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         $search = $this->asEditor()->get('/search?term=TestPageContent'); | 
					
						
							|  |  |  |  |         $search->assertSee('My <cool> <strong>TestPageContent</strong>', false); | 
					
						
							|  |  |  |  |         $search->assertSee('My supercool <great> <strong>TestPageContent</strong> page', false); | 
					
						
							|  |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-11-14 23:07:13 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     public function test_searches_with_user_filters_adds_them_into_advanced_search_form() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $resp = $this->asEditor()->get('/search?term=' . urlencode('test {updated_by:me} {created_by:dan}')); | 
					
						
							|  |  |  |  |         $resp->assertElementExists('form input[type="hidden"][name="filters[updated_by]"][value="me"]'); | 
					
						
							|  |  |  |  |         $resp->assertElementExists('form input[type="hidden"][name="filters[created_by]"][value="dan"]'); | 
					
						
							|  |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |  | } |