]> BookStack Code Mirror - bookstack/blob - tests/Entity/PageContentTest.php
Update entities.php
[bookstack] / tests / Entity / PageContentTest.php
1 <?php namespace Tests;
2
3 use BookStack\Entities\Page;
4 use BookStack\Entities\Repos\EntityRepo;
5 use BookStack\Entities\Repos\PageRepo;
6
7 class PageContentTest extends TestCase
8 {
9
10     public function test_page_includes()
11     {
12         $page = Page::first();
13         $secondPage = Page::where('id', '!=', $page->id)->first();
14
15         $secondPage->html = "<p id='section1'>Hello, This is a test</p><p id='section2'>This is a second block of content</p>";
16         $secondPage->save();
17
18         $this->asEditor();
19
20         $pageContent = $this->get($page->getUrl());
21         $pageContent->assertDontSee('Hello, This is a test');
22
23         $originalHtml = $page->html;
24         $page->html .= "{{@{$secondPage->id}}}";
25         $page->save();
26
27         $pageContent = $this->get($page->getUrl());
28         $pageContent->assertSee('Hello, This is a test');
29         $pageContent->assertSee('This is a second block of content');
30
31         $page->html = $originalHtml . " Well {{@{$secondPage->id}#section2}}";
32         $page->save();
33
34         $pageContent = $this->get($page->getUrl());
35         $pageContent->assertDontSee('Hello, This is a test');
36         $pageContent->assertSee('Well This is a second block of content');
37     }
38
39     public function test_saving_page_with_includes()
40     {
41         $page = Page::first();
42         $secondPage = Page::where('id', '!=', $page->id)->first();
43
44         $this->asEditor();
45         $includeTag = '{{@' . $secondPage->id . '}}';
46         $page->html = '<p>' . $includeTag . '</p>';
47
48         $resp = $this->put($page->getUrl(), ['name' => $page->name, 'html' => $page->html, 'summary' => '']);
49
50         $resp->assertStatus(302);
51
52         $page = Page::find($page->id);
53         $this->assertContains($includeTag, $page->html);
54         $this->assertEquals('', $page->text);
55     }
56
57     public function test_page_includes_do_not_break_tables()
58     {
59         $page = Page::first();
60         $secondPage = Page::where('id', '!=', $page->id)->first();
61
62         $content = '<table id="table"><tbody><tr><td>test</td></tr></tbody></table>';
63         $secondPage->html = $content;
64         $secondPage->save();
65
66         $page->html = "{{@{$secondPage->id}#table}}";
67         $page->save();
68
69         $this->asEditor();
70         $pageResp = $this->get($page->getUrl());
71         $pageResp->assertSee($content);
72     }
73
74     public function test_page_content_scripts_removed_by_default()
75     {
76         $this->asEditor();
77         $page = Page::first();
78         $script = 'abc123<script>console.log("hello-test")</script>abc123';
79         $page->html = "escape {$script}";
80         $page->save();
81
82         $pageView = $this->get($page->getUrl());
83         $pageView->assertDontSee($script);
84         $pageView->assertSee('abc123abc123');
85     }
86
87     public function test_page_inline_on_attributes_removed_by_default()
88     {
89         $this->asEditor();
90         $page = Page::first();
91         $script = '<p onmouseenter="console.log(\'test\')">Hello</p>';
92         $page->html = "escape {$script}";
93         $page->save();
94
95         $pageView = $this->get($page->getUrl());
96         $pageView->assertDontSee($script);
97         $pageView->assertSee('<p>Hello</p>');
98     }
99
100     public function test_page_content_scripts_show_when_configured()
101     {
102         $this->asEditor();
103         $page = Page::first();
104         config()->push('app.allow_content_scripts', 'true');
105
106         $script = 'abc123<script>console.log("hello-test")</script>abc123';
107         $page->html = "no escape {$script}";
108         $page->save();
109
110         $pageView = $this->get($page->getUrl());
111         $pageView->assertSee($script);
112         $pageView->assertDontSee('abc123abc123');
113     }
114
115     public function test_page_inline_on_attributes_show_if_configured()
116     {
117         $this->asEditor();
118         $page = Page::first();
119         config()->push('app.allow_content_scripts', 'true');
120
121         $script = '<p onmouseenter="console.log(\'test\')">Hello</p>';
122         $page->html = "escape {$script}";
123         $page->save();
124
125         $pageView = $this->get($page->getUrl());
126         $pageView->assertSee($script);
127         $pageView->assertDontSee('<p>Hello</p>');
128     }
129
130     public function test_duplicate_ids_does_not_break_page_render()
131     {
132         $this->asEditor();
133         $pageA = Page::first();
134         $pageB = Page::query()->where('id', '!=', $pageA->id)->first();
135
136         $content = '<ul id="bkmrk-xxx-%28"></ul> <ul id="bkmrk-xxx-%28"></ul>';
137         $pageA->html = $content;
138         $pageA->save();
139
140         $pageB->html = '<ul id="bkmrk-xxx-%28"></ul> <p>{{@'. $pageA->id .'#test}}</p>';
141         $pageB->save();
142
143         $pageView = $this->get($pageB->getUrl());
144         $pageView->assertSuccessful();
145     }
146
147     public function test_duplicate_ids_fixed_on_page_save()
148     {
149         $this->asEditor();
150         $page = Page::first();
151
152         $content = '<ul id="bkmrk-test"><li>test a</li><li><ul id="bkmrk-test"><li>test b</li></ul></li></ul>';
153         $pageSave = $this->put($page->getUrl(), [
154             'name' => $page->name,
155             'html' => $content,
156             'summary' => ''
157         ]);
158         $pageSave->assertRedirect();
159
160         $updatedPage = Page::where('id', '=', $page->id)->first();
161         $this->assertEquals(substr_count($updatedPage->html, "bkmrk-test\""), 1);
162     }
163 }