| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 03:35:40 +08:00
										 |  |  | class RestrictionsTest extends BrowserKitTest | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     protected $user; | 
					
						
							| 
									
										
										
										
											2016-03-31 03:15:44 +08:00
										 |  |  |     protected $viewer; | 
					
						
							| 
									
										
										
										
											2016-04-24 23:54:20 +08:00
										 |  |  |     protected $restrictionService; | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     public function setUp() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         parent::setUp(); | 
					
						
							| 
									
										
										
										
											2016-05-07 21:29:43 +08:00
										 |  |  |         $this->user = $this->getEditor(); | 
					
						
							| 
									
										
										
										
											2016-03-31 03:15:44 +08:00
										 |  |  |         $this->viewer = $this->getViewer(); | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |         $this->restrictionService = $this->app[\BookStack\Services\PermissionService::class]; | 
					
						
							| 
									
										
										
										
											2016-03-31 03:15:44 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     protected function getViewer() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $role = \BookStack\Role::getRole('viewer'); | 
					
						
							|  |  |  |         $viewer = $this->getNewBlankUser(); | 
					
						
							|  |  |  |         $viewer->attachRole($role);; | 
					
						
							|  |  |  |         return $viewer; | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |      * Manually set some permissions on an entity. | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |      * @param \BookStack\Entity $entity | 
					
						
							|  |  |  |      * @param $actions | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function setEntityRestrictions(\BookStack\Entity $entity, $actions) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $entity->restricted = true; | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |         $entity->permissions()->delete(); | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |         $role = $this->user->roles->first(); | 
					
						
							| 
									
										
										
										
											2016-03-31 03:15:44 +08:00
										 |  |  |         $viewerRole = $this->viewer->roles->first(); | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |         foreach ($actions as $action) { | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |             $entity->permissions()->create([ | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |                 'role_id' => $role->id, | 
					
						
							|  |  |  |                 'action' => strtolower($action) | 
					
						
							|  |  |  |             ]); | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |             $entity->permissions()->create([ | 
					
						
							| 
									
										
										
										
											2016-03-31 03:15:44 +08:00
										 |  |  |                 'role_id' => $viewerRole->id, | 
					
						
							|  |  |  |                 'action' => strtolower($action) | 
					
						
							|  |  |  |             ]); | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |         $entity->save(); | 
					
						
							| 
									
										
										
										
											2016-04-24 23:54:20 +08:00
										 |  |  |         $entity->load('permissions'); | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |         $this->restrictionService->buildJointPermissionsForEntity($entity); | 
					
						
							|  |  |  |         $entity->load('jointPermissions'); | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_book_view_restriction() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $book = \BookStack\Book::first(); | 
					
						
							|  |  |  |         $bookPage = $book->pages->first(); | 
					
						
							|  |  |  |         $bookChapter = $book->chapters->first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $bookUrl = $book->getUrl(); | 
					
						
							|  |  |  |         $this->actingAs($this->user) | 
					
						
							|  |  |  |             ->visit($bookUrl) | 
					
						
							|  |  |  |             ->seePageIs($bookUrl); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($book, []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->forceVisit($bookUrl) | 
					
						
							|  |  |  |             ->see('Book not found'); | 
					
						
							|  |  |  |         $this->forceVisit($bookPage->getUrl()) | 
					
						
							| 
									
										
										
										
											2017-01-02 00:05:44 +08:00
										 |  |  |             ->see('Page not found'); | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |         $this->forceVisit($bookChapter->getUrl()) | 
					
						
							| 
									
										
										
										
											2017-01-02 00:05:44 +08:00
										 |  |  |             ->see('Chapter not found'); | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($book, ['view']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->visit($bookUrl) | 
					
						
							|  |  |  |             ->see($book->name); | 
					
						
							|  |  |  |         $this->visit($bookPage->getUrl()) | 
					
						
							|  |  |  |             ->see($bookPage->name); | 
					
						
							|  |  |  |         $this->visit($bookChapter->getUrl()) | 
					
						
							|  |  |  |             ->see($bookChapter->name); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_book_create_restriction() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $book = \BookStack\Book::first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $bookUrl = $book->getUrl(); | 
					
						
							| 
									
										
										
										
											2016-03-31 03:15:44 +08:00
										 |  |  |         $this->actingAs($this->viewer) | 
					
						
							|  |  |  |             ->visit($bookUrl) | 
					
						
							|  |  |  |             ->dontSeeInElement('.action-buttons', 'New Page') | 
					
						
							|  |  |  |             ->dontSeeInElement('.action-buttons', 'New Chapter'); | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |         $this->actingAs($this->user) | 
					
						
							|  |  |  |             ->visit($bookUrl) | 
					
						
							|  |  |  |             ->seeInElement('.action-buttons', 'New Page') | 
					
						
							|  |  |  |             ->seeInElement('.action-buttons', 'New Chapter'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($book, ['view', 'delete', 'update']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->forceVisit($bookUrl . '/chapter/create') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  |         $this->forceVisit($bookUrl . '/page/create') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  |         $this->visit($bookUrl)->dontSeeInElement('.action-buttons', 'New Page') | 
					
						
							|  |  |  |             ->dontSeeInElement('.action-buttons', 'New Chapter'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($book, ['view', 'create']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->visit($bookUrl . '/chapter/create') | 
					
						
							|  |  |  |             ->type('test chapter', 'name') | 
					
						
							|  |  |  |             ->type('test description for chapter', 'description') | 
					
						
							|  |  |  |             ->press('Save Chapter') | 
					
						
							|  |  |  |             ->seePageIs($bookUrl . '/chapter/test-chapter'); | 
					
						
							|  |  |  |         $this->visit($bookUrl . '/page/create') | 
					
						
							|  |  |  |             ->type('test page', 'name') | 
					
						
							|  |  |  |             ->type('test content', 'html') | 
					
						
							|  |  |  |             ->press('Save Page') | 
					
						
							|  |  |  |             ->seePageIs($bookUrl . '/page/test-page'); | 
					
						
							|  |  |  |         $this->visit($bookUrl)->seeInElement('.action-buttons', 'New Page') | 
					
						
							|  |  |  |             ->seeInElement('.action-buttons', 'New Chapter'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_book_update_restriction() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $book = \BookStack\Book::first(); | 
					
						
							|  |  |  |         $bookPage = $book->pages->first(); | 
					
						
							|  |  |  |         $bookChapter = $book->chapters->first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $bookUrl = $book->getUrl(); | 
					
						
							|  |  |  |         $this->actingAs($this->user) | 
					
						
							|  |  |  |             ->visit($bookUrl . '/edit') | 
					
						
							|  |  |  |             ->see('Edit Book'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($book, ['view', 'delete']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->forceVisit($bookUrl . '/edit') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  |         $this->forceVisit($bookPage->getUrl() . '/edit') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  |         $this->forceVisit($bookChapter->getUrl() . '/edit') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($book, ['view', 'update']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->visit($bookUrl . '/edit') | 
					
						
							|  |  |  |             ->seePageIs($bookUrl . '/edit'); | 
					
						
							|  |  |  |         $this->visit($bookPage->getUrl() . '/edit') | 
					
						
							|  |  |  |             ->seePageIs($bookPage->getUrl() . '/edit'); | 
					
						
							|  |  |  |         $this->visit($bookChapter->getUrl() . '/edit') | 
					
						
							|  |  |  |             ->see('Edit Chapter'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_book_delete_restriction() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $book = \BookStack\Book::first(); | 
					
						
							|  |  |  |         $bookPage = $book->pages->first(); | 
					
						
							|  |  |  |         $bookChapter = $book->chapters->first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $bookUrl = $book->getUrl(); | 
					
						
							|  |  |  |         $this->actingAs($this->user) | 
					
						
							|  |  |  |             ->visit($bookUrl . '/delete') | 
					
						
							|  |  |  |             ->see('Delete Book'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($book, ['view', 'update']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->forceVisit($bookUrl . '/delete') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  |         $this->forceVisit($bookPage->getUrl() . '/delete') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  |         $this->forceVisit($bookChapter->getUrl() . '/delete') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($book, ['view', 'delete']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->visit($bookUrl . '/delete') | 
					
						
							|  |  |  |             ->seePageIs($bookUrl . '/delete')->see('Delete Book'); | 
					
						
							|  |  |  |         $this->visit($bookPage->getUrl() . '/delete') | 
					
						
							|  |  |  |             ->seePageIs($bookPage->getUrl() . '/delete')->see('Delete Page'); | 
					
						
							|  |  |  |         $this->visit($bookChapter->getUrl() . '/delete') | 
					
						
							|  |  |  |             ->see('Delete Chapter'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_chapter_view_restriction() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $chapter = \BookStack\Chapter::first(); | 
					
						
							|  |  |  |         $chapterPage = $chapter->pages->first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $chapterUrl = $chapter->getUrl(); | 
					
						
							|  |  |  |         $this->actingAs($this->user) | 
					
						
							|  |  |  |             ->visit($chapterUrl) | 
					
						
							|  |  |  |             ->seePageIs($chapterUrl); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($chapter, []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->forceVisit($chapterUrl) | 
					
						
							|  |  |  |             ->see('Chapter not found'); | 
					
						
							|  |  |  |         $this->forceVisit($chapterPage->getUrl()) | 
					
						
							|  |  |  |             ->see('Page not found'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($chapter, ['view']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->visit($chapterUrl) | 
					
						
							|  |  |  |             ->see($chapter->name); | 
					
						
							|  |  |  |         $this->visit($chapterPage->getUrl()) | 
					
						
							|  |  |  |             ->see($chapterPage->name); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_chapter_create_restriction() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $chapter = \BookStack\Chapter::first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $chapterUrl = $chapter->getUrl(); | 
					
						
							|  |  |  |         $this->actingAs($this->user) | 
					
						
							|  |  |  |             ->visit($chapterUrl) | 
					
						
							|  |  |  |             ->seeInElement('.action-buttons', 'New Page'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($chapter, ['view', 'delete', 'update']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->forceVisit($chapterUrl . '/create-page') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  |         $this->visit($chapterUrl)->dontSeeInElement('.action-buttons', 'New Page'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($chapter, ['view', 'create']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->visit($chapterUrl . '/create-page') | 
					
						
							|  |  |  |             ->type('test page', 'name') | 
					
						
							|  |  |  |             ->type('test content', 'html') | 
					
						
							|  |  |  |             ->press('Save Page') | 
					
						
							|  |  |  |             ->seePageIs($chapter->book->getUrl() . '/page/test-page'); | 
					
						
							|  |  |  |         $this->visit($chapterUrl)->seeInElement('.action-buttons', 'New Page'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_chapter_update_restriction() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $chapter = \BookStack\Chapter::first(); | 
					
						
							|  |  |  |         $chapterPage = $chapter->pages->first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $chapterUrl = $chapter->getUrl(); | 
					
						
							|  |  |  |         $this->actingAs($this->user) | 
					
						
							|  |  |  |             ->visit($chapterUrl . '/edit') | 
					
						
							|  |  |  |             ->see('Edit Chapter'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($chapter, ['view', 'delete']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->forceVisit($chapterUrl . '/edit') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  |         $this->forceVisit($chapterPage->getUrl() . '/edit') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($chapter, ['view', 'update']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->visit($chapterUrl . '/edit') | 
					
						
							|  |  |  |             ->seePageIs($chapterUrl . '/edit')->see('Edit Chapter'); | 
					
						
							|  |  |  |         $this->visit($chapterPage->getUrl() . '/edit') | 
					
						
							|  |  |  |             ->seePageIs($chapterPage->getUrl() . '/edit'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_chapter_delete_restriction() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $chapter = \BookStack\Chapter::first(); | 
					
						
							|  |  |  |         $chapterPage = $chapter->pages->first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $chapterUrl = $chapter->getUrl(); | 
					
						
							|  |  |  |         $this->actingAs($this->user) | 
					
						
							|  |  |  |             ->visit($chapterUrl . '/delete') | 
					
						
							|  |  |  |             ->see('Delete Chapter'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($chapter, ['view', 'update']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->forceVisit($chapterUrl . '/delete') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  |         $this->forceVisit($chapterPage->getUrl() . '/delete') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($chapter, ['view', 'delete']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->visit($chapterUrl . '/delete') | 
					
						
							|  |  |  |             ->seePageIs($chapterUrl . '/delete')->see('Delete Chapter'); | 
					
						
							|  |  |  |         $this->visit($chapterPage->getUrl() . '/delete') | 
					
						
							|  |  |  |             ->seePageIs($chapterPage->getUrl() . '/delete')->see('Delete Page'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_page_view_restriction() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $page = \BookStack\Page::first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $pageUrl = $page->getUrl(); | 
					
						
							|  |  |  |         $this->actingAs($this->user) | 
					
						
							|  |  |  |             ->visit($pageUrl) | 
					
						
							|  |  |  |             ->seePageIs($pageUrl); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($page, ['update', 'delete']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->forceVisit($pageUrl) | 
					
						
							|  |  |  |             ->see('Page not found'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($page, ['view']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->visit($pageUrl) | 
					
						
							|  |  |  |             ->see($page->name); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_page_update_restriction() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $page = \BookStack\Chapter::first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $pageUrl = $page->getUrl(); | 
					
						
							|  |  |  |         $this->actingAs($this->user) | 
					
						
							|  |  |  |             ->visit($pageUrl . '/edit') | 
					
						
							|  |  |  |             ->seeInField('name', $page->name); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($page, ['view', 'delete']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->forceVisit($pageUrl . '/edit') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($page, ['view', 'update']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->visit($pageUrl . '/edit') | 
					
						
							|  |  |  |             ->seePageIs($pageUrl . '/edit')->seeInField('name', $page->name); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_page_delete_restriction() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $page = \BookStack\Page::first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $pageUrl = $page->getUrl(); | 
					
						
							|  |  |  |         $this->actingAs($this->user) | 
					
						
							|  |  |  |             ->visit($pageUrl . '/delete') | 
					
						
							|  |  |  |             ->see('Delete Page'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($page, ['view', 'update']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->forceVisit($pageUrl . '/delete') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($page, ['view', 'delete']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->visit($pageUrl . '/delete') | 
					
						
							|  |  |  |             ->seePageIs($pageUrl . '/delete')->see('Delete Page'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_book_restriction_form() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $book = \BookStack\Book::first(); | 
					
						
							| 
									
										
										
										
											2016-03-31 03:15:44 +08:00
										 |  |  |         $this->asAdmin()->visit($book->getUrl() . '/permissions') | 
					
						
							|  |  |  |             ->see('Book Permissions') | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |             ->check('restricted') | 
					
						
							|  |  |  |             ->check('restrictions[2][view]') | 
					
						
							| 
									
										
										
										
											2016-03-31 03:15:44 +08:00
										 |  |  |             ->press('Save Permissions') | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |             ->seeInDatabase('books', ['id' => $book->id, 'restricted' => true]) | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |             ->seeInDatabase('entity_permissions', [ | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |                 'restrictable_id' => $book->id, | 
					
						
							|  |  |  |                 'restrictable_type' => 'BookStack\Book', | 
					
						
							|  |  |  |                 'role_id' => '2', | 
					
						
							|  |  |  |                 'action' => 'view' | 
					
						
							|  |  |  |             ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_chapter_restriction_form() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $chapter = \BookStack\Chapter::first(); | 
					
						
							| 
									
										
										
										
											2016-03-31 03:15:44 +08:00
										 |  |  |         $this->asAdmin()->visit($chapter->getUrl() . '/permissions') | 
					
						
							|  |  |  |             ->see('Chapter Permissions') | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |             ->check('restricted') | 
					
						
							|  |  |  |             ->check('restrictions[2][update]') | 
					
						
							| 
									
										
										
										
											2016-03-31 03:15:44 +08:00
										 |  |  |             ->press('Save Permissions') | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |             ->seeInDatabase('chapters', ['id' => $chapter->id, 'restricted' => true]) | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |             ->seeInDatabase('entity_permissions', [ | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |                 'restrictable_id' => $chapter->id, | 
					
						
							|  |  |  |                 'restrictable_type' => 'BookStack\Chapter', | 
					
						
							|  |  |  |                 'role_id' => '2', | 
					
						
							|  |  |  |                 'action' => 'update' | 
					
						
							|  |  |  |             ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_page_restriction_form() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $page = \BookStack\Page::first(); | 
					
						
							| 
									
										
										
										
											2016-03-31 03:15:44 +08:00
										 |  |  |         $this->asAdmin()->visit($page->getUrl() . '/permissions') | 
					
						
							|  |  |  |             ->see('Page Permissions') | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |             ->check('restricted') | 
					
						
							|  |  |  |             ->check('restrictions[2][delete]') | 
					
						
							| 
									
										
										
										
											2016-03-31 03:15:44 +08:00
										 |  |  |             ->press('Save Permissions') | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |             ->seeInDatabase('pages', ['id' => $page->id, 'restricted' => true]) | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |             ->seeInDatabase('entity_permissions', [ | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |                 'restrictable_id' => $page->id, | 
					
						
							|  |  |  |                 'restrictable_type' => 'BookStack\Page', | 
					
						
							|  |  |  |                 'role_id' => '2', | 
					
						
							|  |  |  |                 'action' => 'delete' | 
					
						
							|  |  |  |             ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_restricted_pages_not_visible_in_book_navigation_on_pages() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $chapter = \BookStack\Chapter::first(); | 
					
						
							|  |  |  |         $page = $chapter->pages->first(); | 
					
						
							|  |  |  |         $page2 = $chapter->pages[2]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($page, []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->actingAs($this->user) | 
					
						
							|  |  |  |             ->visit($page2->getUrl()) | 
					
						
							|  |  |  |             ->dontSeeInElement('.sidebar-page-list', $page->name); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_restricted_pages_not_visible_in_book_navigation_on_chapters() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $chapter = \BookStack\Chapter::first(); | 
					
						
							|  |  |  |         $page = $chapter->pages->first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($page, []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->actingAs($this->user) | 
					
						
							|  |  |  |             ->visit($chapter->getUrl()) | 
					
						
							|  |  |  |             ->dontSeeInElement('.sidebar-page-list', $page->name); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_restricted_pages_not_visible_on_chapter_pages() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $chapter = \BookStack\Chapter::first(); | 
					
						
							|  |  |  |         $page = $chapter->pages->first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($page, []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->actingAs($this->user) | 
					
						
							|  |  |  |             ->visit($chapter->getUrl()) | 
					
						
							|  |  |  |             ->dontSee($page->name); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-31 03:15:44 +08:00
										 |  |  |     public function test_book_create_restriction_override() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $book = \BookStack\Book::first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $bookUrl = $book->getUrl(); | 
					
						
							|  |  |  |         $this->actingAs($this->viewer) | 
					
						
							|  |  |  |             ->visit($bookUrl) | 
					
						
							|  |  |  |             ->dontSeeInElement('.action-buttons', 'New Page') | 
					
						
							|  |  |  |             ->dontSeeInElement('.action-buttons', 'New Chapter'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($book, ['view', 'delete', 'update']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->forceVisit($bookUrl . '/chapter/create') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  |         $this->forceVisit($bookUrl . '/page/create') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  |         $this->visit($bookUrl)->dontSeeInElement('.action-buttons', 'New Page') | 
					
						
							|  |  |  |             ->dontSeeInElement('.action-buttons', 'New Chapter'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($book, ['view', 'create']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->visit($bookUrl . '/chapter/create') | 
					
						
							|  |  |  |             ->type('test chapter', 'name') | 
					
						
							|  |  |  |             ->type('test description for chapter', 'description') | 
					
						
							|  |  |  |             ->press('Save Chapter') | 
					
						
							|  |  |  |             ->seePageIs($bookUrl . '/chapter/test-chapter'); | 
					
						
							|  |  |  |         $this->visit($bookUrl . '/page/create') | 
					
						
							|  |  |  |             ->type('test page', 'name') | 
					
						
							|  |  |  |             ->type('test content', 'html') | 
					
						
							|  |  |  |             ->press('Save Page') | 
					
						
							|  |  |  |             ->seePageIs($bookUrl . '/page/test-page'); | 
					
						
							|  |  |  |         $this->visit($bookUrl)->seeInElement('.action-buttons', 'New Page') | 
					
						
							|  |  |  |             ->seeInElement('.action-buttons', 'New Chapter'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_book_update_restriction_override() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $book = \BookStack\Book::first(); | 
					
						
							|  |  |  |         $bookPage = $book->pages->first(); | 
					
						
							|  |  |  |         $bookChapter = $book->chapters->first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $bookUrl = $book->getUrl(); | 
					
						
							|  |  |  |         $this->actingAs($this->viewer) | 
					
						
							|  |  |  |             ->visit($bookUrl . '/edit') | 
					
						
							|  |  |  |             ->dontSee('Edit Book'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($book, ['view', 'delete']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->forceVisit($bookUrl . '/edit') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  |         $this->forceVisit($bookPage->getUrl() . '/edit') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  |         $this->forceVisit($bookChapter->getUrl() . '/edit') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($book, ['view', 'update']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->visit($bookUrl . '/edit') | 
					
						
							|  |  |  |             ->seePageIs($bookUrl . '/edit'); | 
					
						
							|  |  |  |         $this->visit($bookPage->getUrl() . '/edit') | 
					
						
							|  |  |  |             ->seePageIs($bookPage->getUrl() . '/edit'); | 
					
						
							|  |  |  |         $this->visit($bookChapter->getUrl() . '/edit') | 
					
						
							|  |  |  |             ->see('Edit Chapter'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_book_delete_restriction_override() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $book = \BookStack\Book::first(); | 
					
						
							|  |  |  |         $bookPage = $book->pages->first(); | 
					
						
							|  |  |  |         $bookChapter = $book->chapters->first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $bookUrl = $book->getUrl(); | 
					
						
							|  |  |  |         $this->actingAs($this->viewer) | 
					
						
							|  |  |  |             ->visit($bookUrl . '/delete') | 
					
						
							|  |  |  |             ->dontSee('Delete Book'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($book, ['view', 'update']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->forceVisit($bookUrl . '/delete') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  |         $this->forceVisit($bookPage->getUrl() . '/delete') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  |         $this->forceVisit($bookChapter->getUrl() . '/delete') | 
					
						
							|  |  |  |             ->see('You do not have permission')->seePageIs('/'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->setEntityRestrictions($book, ['view', 'delete']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->visit($bookUrl . '/delete') | 
					
						
							|  |  |  |             ->seePageIs($bookUrl . '/delete')->see('Delete Book'); | 
					
						
							|  |  |  |         $this->visit($bookPage->getUrl() . '/delete') | 
					
						
							|  |  |  |             ->seePageIs($bookPage->getUrl() . '/delete')->see('Delete Page'); | 
					
						
							|  |  |  |         $this->visit($bookChapter->getUrl() . '/delete') | 
					
						
							|  |  |  |             ->see('Delete Chapter'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  | } |