]> BookStack Code Mirror - bookstack/blobdiff - tests/Entity/EntitySearchTest.php
Fix typos
[bookstack] / tests / Entity / EntitySearchTest.php
index 6929adc74bb60feb92293104094afa2f1f4dfa73..3a9b9f31ba477585092f1f9fbcccc1f35fa5d14d 100644 (file)
@@ -214,7 +214,7 @@ class EntitySearchTest extends TestCase
         $defaultListTest->assertDontSee($notVisitedPage->name);
     }
 
-    public function test_ajax_entity_serach_shows_breadcrumbs()
+    public function test_ajax_entity_search_shows_breadcrumbs()
     {
         $chapter = Chapter::first();
         $page = $chapter->pages->first();
@@ -230,6 +230,21 @@ class EntitySearchTest extends TestCase
         $chapterSearch->assertSee($chapter->book->getShortName(42));
     }
 
+    public function test_ajax_entity_search_reflects_items_without_permission()
+    {
+        $page = Page::query()->first();
+        $baseSelector = 'a[data-entity-type="page"][data-entity-id="' . $page->id . '"]';
+        $searchUrl = '/ajax/search/entities?permission=update&term=' . urlencode($page->name);
+
+        $resp = $this->asEditor()->get($searchUrl);
+        $this->withHtml($resp)->assertElementContains($baseSelector, $page->name);
+        $this->withHtml($resp)->assertElementNotContains($baseSelector, "You don't have the required permissions to select this item");
+
+        $resp = $this->actingAs($this->getViewer())->get($searchUrl);
+        $this->withHtml($resp)->assertElementContains($baseSelector, $page->name);
+        $this->withHtml($resp)->assertElementContains($baseSelector, "You don't have the required permissions to select this item");
+    }
+
     public function test_sibling_search_for_pages()
     {
         $chapter = Chapter::query()->with('pages')->first();
@@ -323,16 +338,16 @@ class EntitySearchTest extends TestCase
         $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);
+        $this->withHtml($search)->assertElementContains('.entity-list > .page:nth-child(1)', 'Test page A');
+        $this->withHtml($search)->assertElementContains('.entity-list > .page:nth-child(2)', 'Test page B');
 
         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);
+        $this->withHtml($search)->assertElementContains('.entity-list > .page:nth-child(1)', 'Test page B');
+        $this->withHtml($search)->assertElementContains('.entity-list > .page:nth-child(2)', 'Test page A');
     }
 
     public function test_terms_in_headers_have_an_adjusted_index_score()
@@ -398,9 +413,20 @@ class EntitySearchTest extends TestCase
         // Content
         $search->assertSee('A <strong>superimportant</strong> page about <strong>meowie</strong>able animals', false);
         // Tag name
-        $search->assertElementContains('.tag-name.highlight', 'SuperImportant');
+        $this->withHtml($search)->assertElementContains('.tag-name.highlight', 'SuperImportant');
         // Tag value
-        $search->assertElementContains('.tag-value.highlight', 'MeowieCat');
+        $this->withHtml($search)->assertElementContains('.tag-value.highlight', 'MeowieCat');
+    }
+
+    public function test_match_highlighting_works_with_multibyte_content()
+    {
+        $this->newPage([
+            'name' => 'Test Page',
+            'html' => '<p>На мен ми трябва нещо добро test</p>',
+        ]);
+
+        $search = $this->asEditor()->get('/search?term=' . urlencode('На мен ми трябва нещо добро'));
+        $search->assertSee('<strong>На</strong> <strong>мен</strong> <strong>ми</strong> <strong>трябва</strong> <strong>нещо</strong> <strong>добро</strong> test', false);
     }
 
     public function test_html_entities_in_item_details_remains_escaped_in_search_results()
@@ -411,4 +437,22 @@ class EntitySearchTest extends TestCase
         $search->assertSee('My &lt;cool&gt; <strong>TestPageContent</strong>', false);
         $search->assertSee('My supercool &lt;great&gt; <strong>TestPageContent</strong> page', false);
     }
+
+    public function test_words_adjacent_to_lines_breaks_can_be_matched_with_normal_terms()
+    {
+        $page = $this->newPage(['name' => 'TermA', 'html' => '
+            <p>TermA<br>TermB<br>TermC</p>
+        ']);
+
+        $search = $this->asEditor()->get('/search?term=' . urlencode('TermB TermC'));
+
+        $search->assertSee($page->getUrl(), false);
+    }
+
+    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}'));
+        $this->withHtml($resp)->assertElementExists('form input[type="hidden"][name="filters[updated_by]"][value="me"]');
+        $this->withHtml($resp)->assertElementExists('form input[type="hidden"][name="filters[created_by]"][value="dan"]');
+    }
 }