| 
									
										
										
										
											2017-02-04 19:58:42 +08:00
										 |  |  | <?php namespace Tests; | 
					
						
							| 
									
										
										
										
											2017-01-22 00:16:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  | use BookStack\Entities\Page; | 
					
						
							| 
									
										
										
										
											2018-10-13 18:27:55 +08:00
										 |  |  | use BookStack\Entities\Repos\EntityRepo; | 
					
						
							|  |  |  | use BookStack\Entities\Repos\PageRepo; | 
					
						
							| 
									
										
										
										
											2017-02-25 20:29:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class PageContentTest extends TestCase | 
					
						
							| 
									
										
										
										
											2017-01-22 00:16:27 +08:00
										 |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_page_includes() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-02-25 20:29:01 +08:00
										 |  |  |         $page = Page::first(); | 
					
						
							| 
									
										
										
										
											2017-12-30 23:50:33 +08:00
										 |  |  |         $secondPage = Page::where('id', '!=', $page->id)->first(); | 
					
						
							| 
									
										
										
										
											2017-01-22 00:16:27 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $secondPage->html = "<p id='section1'>Hello, This is a test</p><p id='section2'>This is a second block of content</p>"; | 
					
						
							|  |  |  |         $secondPage->save(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-25 20:29:01 +08:00
										 |  |  |         $this->asEditor(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $pageContent = $this->get($page->getUrl()); | 
					
						
							|  |  |  |         $pageContent->assertDontSee('Hello, This is a test'); | 
					
						
							| 
									
										
										
										
											2017-01-22 00:16:27 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $originalHtml = $page->html; | 
					
						
							|  |  |  |         $page->html .= "{{@{$secondPage->id}}}"; | 
					
						
							|  |  |  |         $page->save(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-25 20:29:01 +08:00
										 |  |  |         $pageContent = $this->get($page->getUrl()); | 
					
						
							|  |  |  |         $pageContent->assertSee('Hello, This is a test'); | 
					
						
							|  |  |  |         $pageContent->assertSee('This is a second block of content'); | 
					
						
							| 
									
										
										
										
											2017-01-22 00:16:27 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $page->html = $originalHtml . " Well {{@{$secondPage->id}#section2}}"; | 
					
						
							|  |  |  |         $page->save(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-25 20:29:01 +08:00
										 |  |  |         $pageContent = $this->get($page->getUrl()); | 
					
						
							|  |  |  |         $pageContent->assertDontSee('Hello, This is a test'); | 
					
						
							|  |  |  |         $pageContent->assertSee('Well This is a second block of content'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-21 04:03:40 +08:00
										 |  |  |     public function test_saving_page_with_includes() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $page = Page::first(); | 
					
						
							| 
									
										
										
										
											2017-12-30 23:50:33 +08:00
										 |  |  |         $secondPage = Page::where('id', '!=', $page->id)->first(); | 
					
						
							| 
									
										
										
										
											2019-01-06 01:18:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-21 04:03:40 +08:00
										 |  |  |         $this->asEditor(); | 
					
						
							| 
									
										
										
										
											2019-01-06 01:18:40 +08:00
										 |  |  |         $includeTag = '{{@' . $secondPage->id . '}}'; | 
					
						
							|  |  |  |         $page->html = '<p>' . $includeTag . '</p>'; | 
					
						
							| 
									
										
										
										
											2017-09-21 04:03:40 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $resp = $this->put($page->getUrl(), ['name' => $page->name, 'html' => $page->html, 'summary' => '']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $resp->assertStatus(302); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $page = Page::find($page->id); | 
					
						
							| 
									
										
										
										
											2019-01-06 01:18:40 +08:00
										 |  |  |         $this->assertContains($includeTag, $page->html); | 
					
						
							|  |  |  |         $this->assertEquals('', $page->text); | 
					
						
							| 
									
										
										
										
											2017-09-21 04:03:40 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-30 23:50:33 +08:00
										 |  |  |     public function test_page_includes_do_not_break_tables() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $page = Page::first(); | 
					
						
							|  |  |  |         $secondPage = Page::where('id', '!=', $page->id)->first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $content = '<table id="table"><tbody><tr><td>test</td></tr></tbody></table>'; | 
					
						
							|  |  |  |         $secondPage->html = $content; | 
					
						
							|  |  |  |         $secondPage->save(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $page->html = "{{@{$secondPage->id}#table}}"; | 
					
						
							|  |  |  |         $page->save(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->asEditor(); | 
					
						
							|  |  |  |         $pageResp = $this->get($page->getUrl()); | 
					
						
							|  |  |  |         $pageResp->assertSee($content); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-25 20:29:01 +08:00
										 |  |  |     public function test_page_revision_views_viewable() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->asEditor(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-13 18:27:55 +08:00
										 |  |  |         $pageRepo = app(PageRepo::class); | 
					
						
							| 
									
										
										
										
											2017-02-25 20:29:01 +08:00
										 |  |  |         $page = Page::first(); | 
					
						
							| 
									
										
										
										
											2018-10-13 18:27:55 +08:00
										 |  |  |         $pageRepo->updatePage($page, $page->book_id, ['name' => 'updated page', 'html' => '<p>new content</p>', 'summary' => 'page revision testing']); | 
					
						
							| 
									
										
										
										
											2017-02-25 20:29:01 +08:00
										 |  |  |         $pageRevision = $page->revisions->last(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $revisionView = $this->get($page->getUrl() . '/revisions/' . $pageRevision->id); | 
					
						
							|  |  |  |         $revisionView->assertStatus(200); | 
					
						
							|  |  |  |         $revisionView->assertSee('new content'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $revisionView = $this->get($page->getUrl() . '/revisions/' . $pageRevision->id . '/changes'); | 
					
						
							|  |  |  |         $revisionView->assertStatus(200); | 
					
						
							|  |  |  |         $revisionView->assertSee('new content'); | 
					
						
							| 
									
										
										
										
											2017-01-22 00:16:27 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-24 06:19:14 +08:00
										 |  |  |     public function test_page_revision_restore_updates_content() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->asEditor(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-13 18:27:55 +08:00
										 |  |  |         $pageRepo = app(PageRepo::class); | 
					
						
							| 
									
										
										
										
											2017-03-24 06:19:14 +08:00
										 |  |  |         $page = Page::first(); | 
					
						
							| 
									
										
										
										
											2018-10-13 18:27:55 +08:00
										 |  |  |         $pageRepo->updatePage($page, $page->book_id, ['name' => 'updated page abc123', 'html' => '<p>new contente def456</p>', 'summary' => 'initial page revision testing']); | 
					
						
							|  |  |  |         $pageRepo->updatePage($page, $page->book_id, ['name' => 'updated page again', 'html' => '<p>new content</p>', 'summary' => 'page revision testing']); | 
					
						
							| 
									
										
										
										
											2017-03-24 06:19:14 +08:00
										 |  |  |         $page =  Page::find($page->id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $pageView = $this->get($page->getUrl()); | 
					
						
							|  |  |  |         $pageView->assertDontSee('abc123'); | 
					
						
							|  |  |  |         $pageView->assertDontSee('def456'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $revToRestore = $page->revisions()->where('name', 'like', '%abc123')->first(); | 
					
						
							|  |  |  |         $restoreReq = $this->get($page->getUrl() . '/revisions/' . $revToRestore->id . '/restore'); | 
					
						
							|  |  |  |         $page =  Page::find($page->id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $restoreReq->assertStatus(302); | 
					
						
							|  |  |  |         $restoreReq->assertRedirect($page->getUrl()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $pageView = $this->get($page->getUrl()); | 
					
						
							|  |  |  |         $pageView->assertSee('abc123'); | 
					
						
							|  |  |  |         $pageView->assertSee('def456'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-17 23:51:40 +08:00
										 |  |  |     public function test_page_content_scripts_escaped_by_default() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->asEditor(); | 
					
						
							|  |  |  |         $page = Page::first(); | 
					
						
							|  |  |  |         $script = '<script>console.log("hello-test")</script>'; | 
					
						
							|  |  |  |         $page->html = "escape {$script}"; | 
					
						
							|  |  |  |         $page->save(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $pageView = $this->get($page->getUrl()); | 
					
						
							|  |  |  |         $pageView->assertDontSee($script); | 
					
						
							|  |  |  |         $pageView->assertSee(htmlentities($script)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_page_content_scripts_show_when_configured() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->asEditor(); | 
					
						
							|  |  |  |         $page = Page::first(); | 
					
						
							|  |  |  |         config()->push('app.allow_content_scripts', 'true'); | 
					
						
							|  |  |  |         $script = '<script>console.log("hello-test")</script>'; | 
					
						
							|  |  |  |         $page->html = "no escape {$script}"; | 
					
						
							|  |  |  |         $page->save(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $pageView = $this->get($page->getUrl()); | 
					
						
							|  |  |  |         $pageView->assertSee($script); | 
					
						
							|  |  |  |         $pageView->assertDontSee(htmlentities($script)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-22 00:16:27 +08:00
										 |  |  | } |