]> BookStack Code Mirror - bookstack/blob - tests/Entity/EntitySearchTest.php
#47 - Fixes the issues with the test case.
[bookstack] / tests / Entity / EntitySearchTest.php
1 <?php namespace Tests;
2
3
4 class EntitySearchTest extends TestCase
5 {
6
7     public function test_page_search()
8     {
9         $book = \BookStack\Book::all()->first();
10         $page = $book->pages->first();
11
12         $search = $this->asEditor()->get('/search?term=' . urlencode($page->name));
13         $search->assertSee('Search Results');
14         $search->assertSee($page->name);
15     }
16
17     public function test_invalid_page_search()
18     {
19         $resp = $this->asEditor()->get('/search?term=' . urlencode('<p>test</p>'));
20         $resp->assertSee('Search Results');
21         $resp->assertStatus(200);
22         $this->get('/search?term=cat+-')->assertStatus(200);
23     }
24
25     public function test_empty_search_shows_search_page()
26     {
27         $res = $this->asEditor()->get('/search');
28         $res->assertStatus(200);
29     }
30
31     public function test_searching_accents_and_small_terms()
32     {
33         $page = $this->newPage(['name' => 'My new test quaffleachits', 'html' => 'some áéííúü¿¡ test content {a2 orange dog']);
34         $this->asEditor();
35
36         $accentSearch = $this->get('/search?term=' . urlencode('áéíí'));
37         $accentSearch->assertStatus(200)->assertSee($page->name);
38
39         $smallSearch = $this->get('/search?term=' . urlencode('{a'));
40         $smallSearch->assertStatus(200)->assertSee($page->name);
41     }
42
43     public function test_book_search()
44     {
45         $book = \BookStack\Book::first();
46         $page = $book->pages->last();
47         $chapter = $book->chapters->last();
48
49         $pageTestResp = $this->asEditor()->get('/search/book/' . $book->id . '?term=' . urlencode($page->name));
50         $pageTestResp->assertSee($page->name);
51
52         $chapterTestResp = $this->asEditor()->get('/search/book/' . $book->id . '?term=' . urlencode($chapter->name));
53         $chapterTestResp->assertSee($chapter->name);
54     }
55
56     public function test_chapter_search()
57     {
58         $chapter = \BookStack\Chapter::has('pages')->first();
59         $page = $chapter->pages[0];
60
61         $pageTestResp = $this->asEditor()->get('/search/chapter/' . $chapter->id . '?term=' . urlencode($page->name));
62         $pageTestResp->assertSee($page->name);
63     }
64
65     public function test_tag_search()
66     {
67         $newTags = [
68             new \BookStack\Tag([
69                 'name' => 'animal',
70                 'value' => 'cat'
71             ]),
72             new \BookStack\Tag([
73                 'name' => 'color',
74                 'value' => 'red'
75             ])
76         ];
77
78         $pageA = \BookStack\Page::first();
79         $pageA->tags()->saveMany($newTags);
80
81         $pageB = \BookStack\Page::all()->last();
82         $pageB->tags()->create(['name' => 'animal', 'value' => 'dog']);
83
84         $this->asEditor();
85         $tNameSearch = $this->get('/search?term=%5Banimal%5D');
86         $tNameSearch->assertSee($pageA->name)->assertSee($pageB->name);
87
88         $tNameSearch2 = $this->get('/search?term=%5Bcolor%5D');
89         $tNameSearch2->assertSee($pageA->name)->assertDontSee($pageB->name);
90
91         $tNameValSearch = $this->get('/search?term=%5Banimal%3Dcat%5D');
92         $tNameValSearch->assertSee($pageA->name)->assertDontSee($pageB->name);
93     }
94
95     public function test_exact_searches()
96     {
97         $page = $this->newPage(['name' => 'My new test page', 'html' => 'this is a story about an orange donkey']);
98
99         $exactSearchA = $this->asEditor()->get('/search?term=' . urlencode('"story about an orange"'));
100         $exactSearchA->assertStatus(200)->assertSee($page->name);
101
102         $exactSearchB = $this->asEditor()->get('/search?term=' . urlencode('"story not about an orange"'));
103         $exactSearchB->assertStatus(200)->assertDontSee($page->name);
104     }
105
106     public function test_search_filters()
107     {
108         $page = $this->newPage(['name' => 'My new test quaffleachits', 'html' => 'this is about an orange donkey danzorbhsing']);
109         $this->asEditor();
110         $editorId = $this->getEditor()->id;
111
112         // Viewed filter searches
113         $this->get('/search?term=' . urlencode('danzorbhsing {not_viewed_by_me}'))->assertSee($page->name);
114         $this->get('/search?term=' . urlencode('danzorbhsing {viewed_by_me}'))->assertDontSee($page->name);
115         $this->get($page->getUrl());
116         $this->get('/search?term=' . urlencode('danzorbhsing {not_viewed_by_me}'))->assertDontSee($page->name);
117         $this->get('/search?term=' . urlencode('danzorbhsing {viewed_by_me}'))->assertSee($page->name);
118
119         // User filters
120         $this->get('/search?term=' . urlencode('danzorbhsing {created_by:me}'))->assertDontSee($page->name);
121         $this->get('/search?term=' . urlencode('danzorbhsing {updated_by:me}'))->assertDontSee($page->name);
122         $this->get('/search?term=' . urlencode('danzorbhsing {updated_by:'.$editorId.'}'))->assertDontSee($page->name);
123         $page->created_by = $editorId;
124         $page->save();
125         $this->get('/search?term=' . urlencode('danzorbhsing {created_by:me}'))->assertSee($page->name);
126         $this->get('/search?term=' . urlencode('danzorbhsing {created_by:'.$editorId.'}'))->assertSee($page->name);
127         $this->get('/search?term=' . urlencode('danzorbhsing {updated_by:me}'))->assertDontSee($page->name);
128         $page->updated_by = $editorId;
129         $page->save();
130         $this->get('/search?term=' . urlencode('danzorbhsing {updated_by:me}'))->assertSee($page->name);
131         $this->get('/search?term=' . urlencode('danzorbhsing {updated_by:'.$editorId.'}'))->assertSee($page->name);
132
133         // Content filters
134         $this->get('/search?term=' . urlencode('{in_name:danzorbhsing}'))->assertDontSee($page->name);
135         $this->get('/search?term=' . urlencode('{in_body:danzorbhsing}'))->assertSee($page->name);
136         $this->get('/search?term=' . urlencode('{in_name:test quaffleachits}'))->assertSee($page->name);
137         $this->get('/search?term=' . urlencode('{in_body:test quaffleachits}'))->assertDontSee($page->name);
138
139         // Restricted filter
140         $this->get('/search?term=' . urlencode('danzorbhsing {is_restricted}'))->assertDontSee($page->name);
141         $page->restricted = true;
142         $page->save();
143         $this->get('/search?term=' . urlencode('danzorbhsing {is_restricted}'))->assertSee($page->name);
144
145         // Date filters
146         $this->get('/search?term=' . urlencode('danzorbhsing {updated_after:2037-01-01}'))->assertDontSee($page->name);
147         $this->get('/search?term=' . urlencode('danzorbhsing {updated_before:2037-01-01}'))->assertSee($page->name);
148         $page->updated_at = '2037-02-01';
149         $page->save();
150         $this->get('/search?term=' . urlencode('danzorbhsing {updated_after:2037-01-01}'))->assertSee($page->name);
151         $this->get('/search?term=' . urlencode('danzorbhsing {updated_before:2037-01-01}'))->assertDontSee($page->name);
152
153         $this->get('/search?term=' . urlencode('danzorbhsing {created_after:2037-01-01}'))->assertDontSee($page->name);
154         $this->get('/search?term=' . urlencode('danzorbhsing {created_before:2037-01-01}'))->assertSee($page->name);
155         $page->created_at = '2037-02-01';
156         $page->save();
157         $this->get('/search?term=' . urlencode('danzorbhsing {created_after:2037-01-01}'))->assertSee($page->name);
158         $this->get('/search?term=' . urlencode('danzorbhsing {created_before:2037-01-01}'))->assertDontSee($page->name);
159     }
160
161     public function test_ajax_entity_search()
162     {
163         $page = \BookStack\Page::all()->last();
164         $notVisitedPage = \BookStack\Page::first();
165
166         // Visit the page to make popular
167         $this->asEditor()->get($page->getUrl());
168
169         $normalSearch = $this->get('/ajax/search/entities?term=' . urlencode($page->name));
170         $normalSearch->assertSee($page->name);
171
172         $bookSearch = $this->get('/ajax/search/entities?types=book&term=' . urlencode($page->name));
173         $bookSearch->assertDontSee($page->name);
174
175         $defaultListTest = $this->get('/ajax/search/entities');
176         $defaultListTest->assertSee($page->name);
177         $defaultListTest->assertDontSee($notVisitedPage->name);
178     }
179 }