X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/fd3929e8099d45160f242bea18556ed78ef0eaf8..refs/pull/262/head:/tests/TestCase.php diff --git a/tests/TestCase.php b/tests/TestCase.php index 3f7d846f7..d3620eae0 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -1,6 +1,7 @@ actingAs($this->getAdmin()); + } + + /** + * Get the current admin user. + * @return mixed + */ + public function getAdmin() { if($this->admin === null) { - $this->admin = \BookStack\User::find(1); + $adminRole = \BookStack\Role::getRole('admin'); + $this->admin = $adminRole->users->first(); + } + return $this->admin; + } + + /** + * Set the current editor context to be an editor. + * @return $this + */ + public function asEditor() + { + if($this->editor === null) { + $this->editor = $this->getEditor(); } - return $this->actingAs($this->admin); + return $this->actingAs($this->editor); + } + + /** + * Get a user that's not a system user such as the guest user. + */ + public function getNormalUser() + { + return \BookStack\User::where('system_name', '=', null)->get()->last(); } /** @@ -48,4 +85,150 @@ class TestCase extends Illuminate\Foundation\Testing\TestCase $settings->put($key, $value); } } + + /** + * Create a group of entities that belong to a specific user. + * @param $creatorUser + * @param $updaterUser + * @return array + */ + protected function createEntityChainBelongingToUser($creatorUser, $updaterUser = false) + { + if ($updaterUser === false) $updaterUser = $creatorUser; + $book = factory(BookStack\Book::class)->create(['created_by' => $creatorUser->id, 'updated_by' => $updaterUser->id]); + $chapter = factory(BookStack\Chapter::class)->create(['created_by' => $creatorUser->id, 'updated_by' => $updaterUser->id]); + $page = factory(BookStack\Page::class)->create(['created_by' => $creatorUser->id, 'updated_by' => $updaterUser->id, 'book_id' => $book->id]); + $book->chapters()->saveMany([$chapter]); + $chapter->pages()->saveMany([$page]); + $restrictionService = $this->app[\BookStack\Services\PermissionService::class]; + $restrictionService->buildJointPermissionsForEntity($book); + return [ + 'book' => $book, + 'chapter' => $chapter, + 'page' => $page + ]; + } + + /** + * Quick way to create a new user + * @param array $attributes + * @return mixed + */ + protected function getEditor($attributes = []) + { + $user = factory(\BookStack\User::class)->create($attributes); + $role = \BookStack\Role::getRole('editor'); + $user->attachRole($role);; + return $user; + } + + /** + * Quick way to create a new user without any permissions + * @param array $attributes + * @return mixed + */ + protected function getNewBlankUser($attributes = []) + { + $user = factory(\BookStack\User::class)->create($attributes); + return $user; + } + + /** + * Assert that a given string is seen inside an element. + * + * @param bool|string|null $element + * @param integer $position + * @param string $text + * @param bool $negate + * @return $this + */ + protected function seeInNthElement($element, $position, $text, $negate = false) + { + $method = $negate ? 'assertNotRegExp' : 'assertRegExp'; + + $rawPattern = preg_quote($text, '/'); + + $escapedPattern = preg_quote(e($text), '/'); + + $content = $this->crawler->filter($element)->eq($position)->html(); + + $pattern = $rawPattern == $escapedPattern + ? $rawPattern : "({$rawPattern}|{$escapedPattern})"; + + $this->$method("/$pattern/i", $content); + + return $this; + } + + /** + * Assert that the current page matches a given URI. + * + * @param string $uri + * @return $this + */ + protected function seePageUrlIs($uri) + { + $this->assertEquals( + $uri, $this->currentUri, "Did not land on expected page [{$uri}].\n" + ); + + return $this; + } + + /** + * Do a forced visit that does not error out on exception. + * @param string $uri + * @param array $parameters + * @param array $cookies + * @param array $files + * @return $this + */ + protected function forceVisit($uri, $parameters = [], $cookies = [], $files = []) + { + $method = 'GET'; + $uri = $this->prepareUrlForRequest($uri); + $this->call($method, $uri, $parameters, $cookies, $files); + $this->clearInputs()->followRedirects(); + $this->currentUri = $this->app->make('request')->fullUrl(); + $this->crawler = new Crawler($this->response->getContent(), $uri); + return $this; + } + + /** + * Click the text within the selected element. + * @param $parentElement + * @param $linkText + * @return $this + */ + protected function clickInElement($parentElement, $linkText) + { + $elem = $this->crawler->filter($parentElement); + $link = $elem->selectLink($linkText); + $this->visit($link->link()->getUri()); + return $this; + } + + /** + * Check if the page contains the given element. + * @param string $selector + * @return bool + */ + protected function pageHasElement($selector) + { + $elements = $this->crawler->filter($selector); + $this->assertTrue(count($elements) > 0, "The page does not contain an element matching " . $selector); + return $this; + } + + /** + * Check if the page contains the given element. + * @param string $selector + * @return bool + */ + protected function pageNotHasElement($selector) + { + $elements = $this->crawler->filter($selector); + $this->assertFalse(count($elements) > 0, "The page contains " . count($elements) . " elements matching " . $selector); + return $this; + } }