Quick run through of applying new test entity helper class

This commit is contained in:
Dan Brown 2022-09-29 22:11:16 +01:00
parent b56f7355aa
commit 900e853b15
No known key found for this signature in database
GPG Key ID: 46D9F943C24A2EF9
47 changed files with 198 additions and 286 deletions

View File

@ -2,7 +2,6 @@
namespace BookStack\Api; namespace BookStack\Api;
use BookStack\Model;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;

View File

@ -6,8 +6,6 @@ use BookStack\Actions\Activity;
use BookStack\Actions\ActivityLogger; use BookStack\Actions\ActivityLogger;
use BookStack\Actions\ActivityType; use BookStack\Actions\ActivityType;
use BookStack\Auth\UserRepo; use BookStack\Auth\UserRepo;
use BookStack\Entities\Models\Chapter;
use BookStack\Entities\Models\Page;
use BookStack\Entities\Repos\PageRepo; use BookStack\Entities\Repos\PageRepo;
use BookStack\Entities\Tools\TrashCan; use BookStack\Entities\Tools\TrashCan;
use Carbon\Carbon; use Carbon\Carbon;
@ -15,8 +13,7 @@ use Tests\TestCase;
class AuditLogTest extends TestCase class AuditLogTest extends TestCase
{ {
/** @var ActivityLogger */ protected ActivityLogger $activityService;
protected $activityService;
protected function setUp(): void protected function setUp(): void
{ {

View File

@ -7,7 +7,6 @@ use BookStack\Actions\ActivityType;
use BookStack\Actions\DispatchWebhookJob; use BookStack\Actions\DispatchWebhookJob;
use BookStack\Actions\Webhook; use BookStack\Actions\Webhook;
use BookStack\Auth\User; use BookStack\Auth\User;
use BookStack\Entities\Models\Page;
use Illuminate\Http\Client\Request; use Illuminate\Http\Client\Request;
use Illuminate\Support\Facades\Bus; use Illuminate\Support\Facades\Bus;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;

View File

@ -5,9 +5,6 @@ namespace Tests\Actions;
use BookStack\Actions\ActivityType; use BookStack\Actions\ActivityType;
use BookStack\Actions\Webhook; use BookStack\Actions\Webhook;
use BookStack\Actions\WebhookFormatter; use BookStack\Actions\WebhookFormatter;
use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Chapter;
use BookStack\Entities\Models\Page;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Tests\TestCase; use Tests\TestCase;
@ -16,9 +13,9 @@ class WebhookFormatTesting extends TestCase
public function test_entity_events_show_related_user_info() public function test_entity_events_show_related_user_info()
{ {
$events = [ $events = [
ActivityType::BOOK_UPDATE => Book::query()->first(), ActivityType::BOOK_UPDATE => $this->entities->book(),
ActivityType::CHAPTER_CREATE => Chapter::query()->first(), ActivityType::CHAPTER_CREATE => $this->entities->chapter(),
ActivityType::PAGE_MOVE => Page::query()->first(), ActivityType::PAGE_MOVE => $this->entities->page(),
]; ];
foreach ($events as $event => $entity) { foreach ($events as $event => $entity) {

View File

@ -68,7 +68,7 @@ class BooksApiTest extends TestCase
public function test_read_endpoint() public function test_read_endpoint()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$book = Book::visible()->first(); $book = $this->entities->book();
$resp = $this->getJson($this->baseEndpoint . "/{$book->id}"); $resp = $this->getJson($this->baseEndpoint . "/{$book->id}");
@ -91,8 +91,7 @@ class BooksApiTest extends TestCase
public function test_read_endpoint_includes_chapter_and_page_contents() public function test_read_endpoint_includes_chapter_and_page_contents()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
/** @var Book $book */ $book = $this->entities->bookHasChaptersAndPages();
$book = Book::visible()->has('chapters')->has('pages')->first();
$chapter = $book->chapters()->first(); $chapter = $book->chapters()->first();
$chapterPage = $chapter->pages()->first(); $chapterPage = $chapter->pages()->first();
@ -123,7 +122,7 @@ class BooksApiTest extends TestCase
public function test_update_endpoint() public function test_update_endpoint()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$book = Book::visible()->first(); $book = $this->entities->book();
$details = [ $details = [
'name' => 'My updated API book', 'name' => 'My updated API book',
'description' => 'A book created via the API', 'description' => 'A book created via the API',
@ -140,7 +139,7 @@ class BooksApiTest extends TestCase
public function test_update_increments_updated_date_if_only_tags_are_sent() public function test_update_increments_updated_date_if_only_tags_are_sent()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$book = Book::visible()->first(); $book = $this->entities->book();
DB::table('books')->where('id', '=', $book->id)->update(['updated_at' => Carbon::now()->subWeek()]); DB::table('books')->where('id', '=', $book->id)->update(['updated_at' => Carbon::now()->subWeek()]);
$details = [ $details = [
@ -156,7 +155,7 @@ class BooksApiTest extends TestCase
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
/** @var Book $book */ /** @var Book $book */
$book = Book::visible()->first(); $book = $this->entities->book();
$this->assertNull($book->cover); $this->assertNull($book->cover);
$file = $this->getTestImage('image.png'); $file = $this->getTestImage('image.png');
@ -191,7 +190,7 @@ class BooksApiTest extends TestCase
public function test_delete_endpoint() public function test_delete_endpoint()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$book = Book::visible()->first(); $book = $this->entities->book();
$resp = $this->deleteJson($this->baseEndpoint . "/{$book->id}"); $resp = $this->deleteJson($this->baseEndpoint . "/{$book->id}");
$resp->assertStatus(204); $resp->assertStatus(204);
@ -201,7 +200,7 @@ class BooksApiTest extends TestCase
public function test_export_html_endpoint() public function test_export_html_endpoint()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$book = Book::visible()->first(); $book = $this->entities->book();
$resp = $this->get($this->baseEndpoint . "/{$book->id}/export/html"); $resp = $this->get($this->baseEndpoint . "/{$book->id}/export/html");
$resp->assertStatus(200); $resp->assertStatus(200);
@ -212,7 +211,7 @@ class BooksApiTest extends TestCase
public function test_export_plain_text_endpoint() public function test_export_plain_text_endpoint()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$book = Book::visible()->first(); $book = $this->entities->book();
$resp = $this->get($this->baseEndpoint . "/{$book->id}/export/plaintext"); $resp = $this->get($this->baseEndpoint . "/{$book->id}/export/plaintext");
$resp->assertStatus(200); $resp->assertStatus(200);
@ -223,7 +222,7 @@ class BooksApiTest extends TestCase
public function test_export_pdf_endpoint() public function test_export_pdf_endpoint()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$book = Book::visible()->first(); $book = $this->entities->book();
$resp = $this->get($this->baseEndpoint . "/{$book->id}/export/pdf"); $resp = $this->get($this->baseEndpoint . "/{$book->id}/export/pdf");
$resp->assertStatus(200); $resp->assertStatus(200);
@ -249,7 +248,7 @@ class BooksApiTest extends TestCase
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$this->removePermissionFromUser($this->getEditor(), 'content-export'); $this->removePermissionFromUser($this->getEditor(), 'content-export');
$book = Book::visible()->first(); $book = $this->entities->book();
foreach ($types as $type) { foreach ($types as $type) {
$resp = $this->get($this->baseEndpoint . "/{$book->id}/export/{$type}"); $resp = $this->get($this->baseEndpoint . "/{$book->id}/export/{$type}");
$this->assertPermissionError($resp); $this->assertPermissionError($resp);

View File

@ -2,7 +2,6 @@
namespace Tests\Api; namespace Tests\Api;
use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Chapter; use BookStack\Entities\Models\Chapter;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
@ -95,7 +94,7 @@ class ChaptersApiTest extends TestCase
public function test_read_endpoint() public function test_read_endpoint()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$chapter = Chapter::visible()->first(); $chapter = $this->entities->chapter();
$page = $chapter->pages()->first(); $page = $chapter->pages()->first();
$resp = $this->getJson($this->baseEndpoint . "/{$chapter->id}"); $resp = $this->getJson($this->baseEndpoint . "/{$chapter->id}");
@ -127,7 +126,7 @@ class ChaptersApiTest extends TestCase
public function test_update_endpoint() public function test_update_endpoint()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$chapter = Chapter::visible()->first(); $chapter = $this->entities->chapter();
$details = [ $details = [
'name' => 'My updated API chapter', 'name' => 'My updated API chapter',
'description' => 'A chapter created via the API', 'description' => 'A chapter created via the API',
@ -152,7 +151,7 @@ class ChaptersApiTest extends TestCase
public function test_update_increments_updated_date_if_only_tags_are_sent() public function test_update_increments_updated_date_if_only_tags_are_sent()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$chapter = Chapter::visible()->first(); $chapter = $this->entities->chapter();
DB::table('chapters')->where('id', '=', $chapter->id)->update(['updated_at' => Carbon::now()->subWeek()]); DB::table('chapters')->where('id', '=', $chapter->id)->update(['updated_at' => Carbon::now()->subWeek()]);
$details = [ $details = [
@ -167,7 +166,7 @@ class ChaptersApiTest extends TestCase
public function test_delete_endpoint() public function test_delete_endpoint()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$chapter = Chapter::visible()->first(); $chapter = $this->entities->chapter();
$resp = $this->deleteJson($this->baseEndpoint . "/{$chapter->id}"); $resp = $this->deleteJson($this->baseEndpoint . "/{$chapter->id}");
$resp->assertStatus(204); $resp->assertStatus(204);
@ -177,7 +176,7 @@ class ChaptersApiTest extends TestCase
public function test_export_html_endpoint() public function test_export_html_endpoint()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$chapter = Chapter::visible()->first(); $chapter = $this->entities->chapter();
$resp = $this->get($this->baseEndpoint . "/{$chapter->id}/export/html"); $resp = $this->get($this->baseEndpoint . "/{$chapter->id}/export/html");
$resp->assertStatus(200); $resp->assertStatus(200);
@ -188,7 +187,7 @@ class ChaptersApiTest extends TestCase
public function test_export_plain_text_endpoint() public function test_export_plain_text_endpoint()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$chapter = Chapter::visible()->first(); $chapter = $this->entities->chapter();
$resp = $this->get($this->baseEndpoint . "/{$chapter->id}/export/plaintext"); $resp = $this->get($this->baseEndpoint . "/{$chapter->id}/export/plaintext");
$resp->assertStatus(200); $resp->assertStatus(200);
@ -199,7 +198,7 @@ class ChaptersApiTest extends TestCase
public function test_export_pdf_endpoint() public function test_export_pdf_endpoint()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$chapter = Chapter::visible()->first(); $chapter = $this->entities->chapter();
$resp = $this->get($this->baseEndpoint . "/{$chapter->id}/export/pdf"); $resp = $this->get($this->baseEndpoint . "/{$chapter->id}/export/pdf");
$resp->assertStatus(200); $resp->assertStatus(200);

View File

@ -2,7 +2,6 @@
namespace Tests\Api; namespace Tests\Api;
use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Chapter; use BookStack\Entities\Models\Chapter;
use BookStack\Entities\Models\Page; use BookStack\Entities\Models\Page;
use Carbon\Carbon; use Carbon\Carbon;
@ -95,11 +94,11 @@ class PagesApiTest extends TestCase
'chapter_id' => ['The chapter id field is required when book id is not present.'], 'chapter_id' => ['The chapter id field is required when book id is not present.'],
])); ]));
$chapter = Chapter::visible()->first(); $chapter = $this->entities->chapter();
$resp = $this->postJson($this->baseEndpoint, array_merge($details, ['chapter_id' => $chapter->id])); $resp = $this->postJson($this->baseEndpoint, array_merge($details, ['chapter_id' => $chapter->id]));
$resp->assertStatus(200); $resp->assertStatus(200);
$book = Book::visible()->first(); $book = $this->entities->book();
$resp = $this->postJson($this->baseEndpoint, array_merge($details, ['book_id' => $book->id])); $resp = $this->postJson($this->baseEndpoint, array_merge($details, ['book_id' => $book->id]));
$resp->assertStatus(200); $resp->assertStatus(200);
} }
@ -107,7 +106,7 @@ class PagesApiTest extends TestCase
public function test_markdown_can_be_provided_for_create() public function test_markdown_can_be_provided_for_create()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$book = Book::visible()->first(); $book = $this->entities->book();
$details = [ $details = [
'book_id' => $book->id, 'book_id' => $book->id,
'name' => 'My api page', 'name' => 'My api page',
@ -126,7 +125,7 @@ class PagesApiTest extends TestCase
public function test_read_endpoint() public function test_read_endpoint()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$page = Page::visible()->first(); $page = $this->entities->page();
$resp = $this->getJson($this->baseEndpoint . "/{$page->id}"); $resp = $this->getJson($this->baseEndpoint . "/{$page->id}");
$resp->assertStatus(200); $resp->assertStatus(200);
@ -149,7 +148,7 @@ class PagesApiTest extends TestCase
public function test_read_endpoint_provides_rendered_html() public function test_read_endpoint_provides_rendered_html()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$page = Page::visible()->first(); $page = $this->entities->page();
$page->html = "<p>testing</p><script>alert('danger')</script><h1>Hello</h1>"; $page->html = "<p>testing</p><script>alert('danger')</script><h1>Hello</h1>";
$page->save(); $page->save();
@ -163,7 +162,7 @@ class PagesApiTest extends TestCase
public function test_update_endpoint() public function test_update_endpoint()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$page = Page::visible()->first(); $page = $this->entities->page();
$details = [ $details = [
'name' => 'My updated API page', 'name' => 'My updated API page',
'html' => '<p>A page created via the API</p>', 'html' => '<p>A page created via the API</p>',
@ -189,7 +188,7 @@ class PagesApiTest extends TestCase
public function test_providing_new_chapter_id_on_update_will_move_page() public function test_providing_new_chapter_id_on_update_will_move_page()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$page = Page::visible()->first(); $page = $this->entities->page();
$chapter = Chapter::visible()->where('book_id', '!=', $page->book_id)->first(); $chapter = Chapter::visible()->where('book_id', '!=', $page->book_id)->first();
$details = [ $details = [
'name' => 'My updated API page', 'name' => 'My updated API page',
@ -208,7 +207,7 @@ class PagesApiTest extends TestCase
public function test_providing_move_via_update_requires_page_create_permission_on_new_parent() public function test_providing_move_via_update_requires_page_create_permission_on_new_parent()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$page = Page::visible()->first(); $page = $this->entities->page();
$chapter = Chapter::visible()->where('book_id', '!=', $page->book_id)->first(); $chapter = Chapter::visible()->where('book_id', '!=', $page->book_id)->first();
$this->entities->setPermissions($chapter, ['view'], [$this->getEditor()->roles()->first()]); $this->entities->setPermissions($chapter, ['view'], [$this->getEditor()->roles()->first()]);
$details = [ $details = [
@ -224,7 +223,7 @@ class PagesApiTest extends TestCase
public function test_update_endpoint_does_not_wipe_content_if_no_html_or_md_provided() public function test_update_endpoint_does_not_wipe_content_if_no_html_or_md_provided()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$page = Page::visible()->first(); $page = $this->entities->page();
$originalContent = $page->html; $originalContent = $page->html;
$details = [ $details = [
'name' => 'My updated API page', 'name' => 'My updated API page',
@ -245,7 +244,7 @@ class PagesApiTest extends TestCase
public function test_update_increments_updated_date_if_only_tags_are_sent() public function test_update_increments_updated_date_if_only_tags_are_sent()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$page = Page::visible()->first(); $page = $this->entities->page();
DB::table('pages')->where('id', '=', $page->id)->update(['updated_at' => Carbon::now()->subWeek()]); DB::table('pages')->where('id', '=', $page->id)->update(['updated_at' => Carbon::now()->subWeek()]);
$details = [ $details = [
@ -262,7 +261,7 @@ class PagesApiTest extends TestCase
public function test_delete_endpoint() public function test_delete_endpoint()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$page = Page::visible()->first(); $page = $this->entities->page();
$resp = $this->deleteJson($this->baseEndpoint . "/{$page->id}"); $resp = $this->deleteJson($this->baseEndpoint . "/{$page->id}");
$resp->assertStatus(204); $resp->assertStatus(204);
@ -272,7 +271,7 @@ class PagesApiTest extends TestCase
public function test_export_html_endpoint() public function test_export_html_endpoint()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$page = Page::visible()->first(); $page = $this->entities->page();
$resp = $this->get($this->baseEndpoint . "/{$page->id}/export/html"); $resp = $this->get($this->baseEndpoint . "/{$page->id}/export/html");
$resp->assertStatus(200); $resp->assertStatus(200);
@ -283,7 +282,7 @@ class PagesApiTest extends TestCase
public function test_export_plain_text_endpoint() public function test_export_plain_text_endpoint()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$page = Page::visible()->first(); $page = $this->entities->page();
$resp = $this->get($this->baseEndpoint . "/{$page->id}/export/plaintext"); $resp = $this->get($this->baseEndpoint . "/{$page->id}/export/plaintext");
$resp->assertStatus(200); $resp->assertStatus(200);
@ -294,7 +293,7 @@ class PagesApiTest extends TestCase
public function test_export_pdf_endpoint() public function test_export_pdf_endpoint()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$page = Page::visible()->first(); $page = $this->entities->page();
$resp = $this->get($this->baseEndpoint . "/{$page->id}/export/pdf"); $resp = $this->get($this->baseEndpoint . "/{$page->id}/export/pdf");
$resp->assertStatus(200); $resp->assertStatus(200);
@ -304,7 +303,7 @@ class PagesApiTest extends TestCase
public function test_export_markdown_endpoint() public function test_export_markdown_endpoint()
{ {
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$page = Page::visible()->first(); $page = $this->entities->page();
$resp = $this->get($this->baseEndpoint . "/{$page->id}/export/markdown"); $resp = $this->get($this->baseEndpoint . "/{$page->id}/export/markdown");
$resp->assertStatus(200); $resp->assertStatus(200);
@ -318,7 +317,7 @@ class PagesApiTest extends TestCase
$this->actingAsApiEditor(); $this->actingAsApiEditor();
$this->removePermissionFromUser($this->getEditor(), 'content-export'); $this->removePermissionFromUser($this->getEditor(), 'content-export');
$page = Page::visible()->first(); $page = $this->entities->page();
foreach ($types as $type) { foreach ($types as $type) {
$resp = $this->get($this->baseEndpoint . "/{$page->id}/export/{$type}"); $resp = $this->get($this->baseEndpoint . "/{$page->id}/export/{$type}");
$this->assertPermissionError($resp); $this->assertPermissionError($resp);

View File

@ -4,7 +4,6 @@ namespace Tests\Api;
use BookStack\Entities\Models\Book; use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Deletion; use BookStack\Entities\Models\Deletion;
use BookStack\Entities\Models\Page;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Tests\TestCase; use Tests\TestCase;
@ -111,7 +110,7 @@ class RecycleBinApiTest extends TestCase
public function test_index_endpoint_returns_parent() public function test_index_endpoint_returns_parent()
{ {
$admin = $this->getAdmin(); $admin = $this->getAdmin();
$page = Page::query()->whereHas('chapter')->with('chapter')->first(); $page = $this->entities->pageWithinChapter();
$this->actingAs($admin)->delete($page->getUrl()); $this->actingAs($admin)->delete($page->getUrl());
$deletion = Deletion::query()->orderBy('id')->first(); $deletion = Deletion::query()->orderBy('id')->first();

View File

@ -3,7 +3,6 @@
namespace Tests\Auth; namespace Tests\Auth;
use BookStack\Auth\Access\Mfa\MfaSession; use BookStack\Auth\Access\Mfa\MfaSession;
use BookStack\Entities\Models\Page;
use Illuminate\Testing\TestResponse; use Illuminate\Testing\TestResponse;
use Tests\TestCase; use Tests\TestCase;

View File

@ -3,7 +3,6 @@
namespace Tests\Commands; namespace Tests\Commands;
use BookStack\Actions\ActivityType; use BookStack\Actions\ActivityType;
use BookStack\Entities\Models\Page;
use BookStack\Facades\Activity; use BookStack\Facades\Activity;
use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;

View File

@ -16,7 +16,7 @@ class CopyShelfPermissionsCommandTest extends TestCase
public function test_copy_shelf_permissions_command_using_slug() public function test_copy_shelf_permissions_command_using_slug()
{ {
$shelf = Bookshelf::first(); $shelf = $this->entities->shelf();
$child = $shelf->books()->first(); $child = $shelf->books()->first();
$editorRole = $this->getEditor()->roles()->first(); $editorRole = $this->getEditor()->roles()->first();
$this->assertFalse(boolval($child->restricted), 'Child book should not be restricted by default'); $this->assertFalse(boolval($child->restricted), 'Child book should not be restricted by default');

View File

@ -2,7 +2,6 @@
namespace Tests\Commands; namespace Tests\Commands;
use BookStack\Entities\Models\Page;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Tests\TestCase; use Tests\TestCase;

View File

@ -2,7 +2,6 @@
namespace Tests\Commands; namespace Tests\Commands;
use BookStack\Entities\Models\Page;
use Symfony\Component\Console\Exception\RuntimeException; use Symfony\Component\Console\Exception\RuntimeException;
use Tests\TestCase; use Tests\TestCase;

View File

@ -39,7 +39,7 @@ class BookShelfTest extends TestCase
{ {
$user = User::factory()->create(); $user = User::factory()->create();
$this->giveUserPermissions($user, ['image-create-all']); $this->giveUserPermissions($user, ['image-create-all']);
$shelf = Bookshelf::first(); $shelf = $this->entities->shelf();
$userRole = $user->roles()->first(); $userRole = $user->roles()->first();
$resp = $this->actingAs($user)->get('/'); $resp = $this->actingAs($user)->get('/');
@ -130,7 +130,7 @@ class BookShelfTest extends TestCase
public function test_shelf_view() public function test_shelf_view()
{ {
$shelf = Bookshelf::first(); $shelf = $this->entities->shelf();
$resp = $this->asEditor()->get($shelf->getUrl()); $resp = $this->asEditor()->get($shelf->getUrl());
$resp->assertStatus(200); $resp->assertStatus(200);
$resp->assertSeeText($shelf->name); $resp->assertSeeText($shelf->name);
@ -143,7 +143,7 @@ class BookShelfTest extends TestCase
public function test_shelf_view_shows_action_buttons() public function test_shelf_view_shows_action_buttons()
{ {
$shelf = Bookshelf::first(); $shelf = $this->entities->shelf();
$resp = $this->asAdmin()->get($shelf->getUrl()); $resp = $this->asAdmin()->get($shelf->getUrl());
$resp->assertSee($shelf->getUrl('/create-book')); $resp->assertSee($shelf->getUrl('/create-book'));
$resp->assertSee($shelf->getUrl('/edit')); $resp->assertSee($shelf->getUrl('/edit'));
@ -201,7 +201,7 @@ class BookShelfTest extends TestCase
public function test_shelf_edit() public function test_shelf_edit()
{ {
$shelf = Bookshelf::first(); $shelf = $this->entities->shelf();
$resp = $this->asEditor()->get($shelf->getUrl('/edit')); $resp = $this->asEditor()->get($shelf->getUrl('/edit'));
$resp->assertSeeText('Edit Shelf'); $resp->assertSeeText('Edit Shelf');
@ -239,7 +239,7 @@ class BookShelfTest extends TestCase
public function test_shelf_create_new_book() public function test_shelf_create_new_book()
{ {
$shelf = Bookshelf::first(); $shelf = $this->entities->shelf();
$resp = $this->asEditor()->get($shelf->getUrl('/create-book')); $resp = $this->asEditor()->get($shelf->getUrl('/create-book'));
$resp->assertSee('Create New Book'); $resp->assertSee('Create New Book');
@ -288,7 +288,7 @@ class BookShelfTest extends TestCase
public function test_shelf_copy_permissions() public function test_shelf_copy_permissions()
{ {
$shelf = Bookshelf::first(); $shelf = $this->entities->shelf();
$resp = $this->asAdmin()->get($shelf->getUrl('/permissions')); $resp = $this->asAdmin()->get($shelf->getUrl('/permissions'));
$resp->assertSeeText('Copy Permissions'); $resp->assertSeeText('Copy Permissions');
$resp->assertSee("action=\"{$shelf->getUrl('/copy-permissions')}\"", false); $resp->assertSee("action=\"{$shelf->getUrl('/copy-permissions')}\"", false);
@ -311,14 +311,14 @@ class BookShelfTest extends TestCase
public function test_permission_page_has_a_warning_about_no_cascading() public function test_permission_page_has_a_warning_about_no_cascading()
{ {
$shelf = Bookshelf::first(); $shelf = $this->entities->shelf();
$resp = $this->asAdmin()->get($shelf->getUrl('/permissions')); $resp = $this->asAdmin()->get($shelf->getUrl('/permissions'));
$resp->assertSeeText('Permissions on shelves do not automatically cascade to contained books.'); $resp->assertSeeText('Permissions on shelves do not automatically cascade to contained books.');
} }
public function test_bookshelves_show_in_breadcrumbs_if_in_context() public function test_bookshelves_show_in_breadcrumbs_if_in_context()
{ {
$shelf = Bookshelf::first(); $shelf = $this->entities->shelf();
$shelfBook = $shelf->books()->first(); $shelfBook = $shelf->books()->first();
$shelfPage = $shelfBook->pages()->first(); $shelfPage = $shelfBook->pages()->first();
$this->asAdmin(); $this->asAdmin();

View File

@ -96,8 +96,7 @@ class ChapterTest extends TestCase
public function test_copy_does_not_copy_non_visible_pages() public function test_copy_does_not_copy_non_visible_pages()
{ {
/** @var Chapter $chapter */ $chapter = $this->entities->chapterHasPages();
$chapter = Chapter::query()->whereHas('pages')->first();
// Hide pages to all non-admin roles // Hide pages to all non-admin roles
/** @var Page $page */ /** @var Page $page */
@ -118,8 +117,7 @@ class ChapterTest extends TestCase
public function test_copy_does_not_copy_pages_if_user_cant_page_create() public function test_copy_does_not_copy_pages_if_user_cant_page_create()
{ {
/** @var Chapter $chapter */ $chapter = $this->entities->chapterHasPages();
$chapter = Chapter::query()->whereHas('pages')->first();
$viewer = $this->getViewer(); $viewer = $this->getViewer();
$this->giveUserPermissions($viewer, ['chapter-create-all']); $this->giveUserPermissions($viewer, ['chapter-create-all']);

View File

@ -2,34 +2,27 @@
namespace Tests\Entity; namespace Tests\Entity;
use BookStack\Entities\Models\Page;
use Tests\TestCase; use Tests\TestCase;
class CommentSettingTest extends TestCase class CommentSettingTest extends TestCase
{ {
protected $page;
protected function setUp(): void
{
parent::setUp();
$this->page = Page::query()->first();
}
public function test_comment_disable() public function test_comment_disable()
{ {
$page = $this->entities->page();
$this->setSettings(['app-disable-comments' => 'true']); $this->setSettings(['app-disable-comments' => 'true']);
$this->asAdmin(); $this->asAdmin();
$resp = $this->asAdmin()->get($this->page->getUrl()); $resp = $this->asAdmin()->get($page->getUrl());
$this->withHtml($resp)->assertElementNotExists('.comments-list'); $this->withHtml($resp)->assertElementNotExists('.comments-list');
} }
public function test_comment_enable() public function test_comment_enable()
{ {
$page = $this->entities->page();
$this->setSettings(['app-disable-comments' => 'false']); $this->setSettings(['app-disable-comments' => 'false']);
$this->asAdmin(); $this->asAdmin();
$resp = $this->asAdmin()->get($this->page->getUrl()); $resp = $this->asAdmin()->get($page->getUrl());
$this->withHtml($resp)->assertElementExists('.comments-list'); $this->withHtml($resp)->assertElementExists('.comments-list');
} }
} }

View File

@ -11,7 +11,7 @@ class CommentTest extends TestCase
public function test_add_comment() public function test_add_comment()
{ {
$this->asAdmin(); $this->asAdmin();
$page = Page::first(); $page = $this->entities->page();
$comment = Comment::factory()->make(['parent_id' => 2]); $comment = Comment::factory()->make(['parent_id' => 2]);
$resp = $this->postJson("/comment/$page->id", $comment->getAttributes()); $resp = $this->postJson("/comment/$page->id", $comment->getAttributes());
@ -34,7 +34,7 @@ class CommentTest extends TestCase
public function test_comment_edit() public function test_comment_edit()
{ {
$this->asAdmin(); $this->asAdmin();
$page = Page::first(); $page = $this->entities->page();
$comment = Comment::factory()->make(); $comment = Comment::factory()->make();
$this->postJson("/comment/$page->id", $comment->getAttributes()); $this->postJson("/comment/$page->id", $comment->getAttributes());
@ -58,7 +58,7 @@ class CommentTest extends TestCase
public function test_comment_delete() public function test_comment_delete()
{ {
$this->asAdmin(); $this->asAdmin();
$page = Page::first(); $page = $this->entities->page();
$comment = Comment::factory()->make(); $comment = Comment::factory()->make();
$this->postJson("/comment/$page->id", $comment->getAttributes()); $this->postJson("/comment/$page->id", $comment->getAttributes());
@ -75,7 +75,7 @@ class CommentTest extends TestCase
public function test_comments_converts_markdown_input_to_html() public function test_comments_converts_markdown_input_to_html()
{ {
$page = Page::first(); $page = $this->entities->page();
$this->asAdmin()->postJson("/comment/$page->id", [ $this->asAdmin()->postJson("/comment/$page->id", [
'text' => '# My Title', 'text' => '# My Title',
]); ]);
@ -94,7 +94,7 @@ class CommentTest extends TestCase
public function test_html_cannot_be_injected_via_comment_content() public function test_html_cannot_be_injected_via_comment_content()
{ {
$this->asAdmin(); $this->asAdmin();
$page = Page::first(); $page = $this->entities->page();
$script = '<script>const a = "script";</script>\n\n# sometextinthecomment'; $script = '<script>const a = "script";</script>\n\n# sometextinthecomment';
$this->postJson("/comment/$page->id", [ $this->postJson("/comment/$page->id", [

View File

@ -24,8 +24,7 @@ class ConvertTest extends TestCase
public function test_convert_chapter_to_book() public function test_convert_chapter_to_book()
{ {
/** @var Chapter $chapter */ $chapter = $this->entities->chapterHasPages();
$chapter = Chapter::query()->whereHas('pages')->first();
$chapter->tags()->save(new Tag(['name' => 'Category', 'value' => 'Penguins'])); $chapter->tags()->save(new Tag(['name' => 'Category', 'value' => 'Penguins']));
/** @var Page $childPage */ /** @var Page $childPage */
$childPage = $chapter->pages()->first(); $childPage = $chapter->pages()->first();

View File

@ -4,7 +4,6 @@ namespace Tests\Entity;
use BookStack\Auth\UserRepo; use BookStack\Auth\UserRepo;
use BookStack\Entities\Models\Entity; use BookStack\Entities\Models\Entity;
use BookStack\Entities\Repos\PageRepo;
use Tests\TestCase; use Tests\TestCase;
class EntityAccessTest extends TestCase class EntityAccessTest extends TestCase
@ -16,7 +15,7 @@ class EntityAccessTest extends TestCase
$updater = $this->getViewer(); $updater = $this->getViewer();
$entities = $this->entities->createChainBelongingToUser($creator, $updater); $entities = $this->entities->createChainBelongingToUser($creator, $updater);
app()->make(UserRepo::class)->destroy($creator); app()->make(UserRepo::class)->destroy($creator);
app()->make(PageRepo::class)->update($entities['page'], ['html' => '<p>hello!</p>>']); $this->entities->updatePage($entities['page'], ['html' => '<p>hello!</p>>']);
$this->checkEntitiesViewable($entities); $this->checkEntitiesViewable($entities);
} }
@ -28,7 +27,7 @@ class EntityAccessTest extends TestCase
$updater = $this->getEditor(); $updater = $this->getEditor();
$entities = $this->entities->createChainBelongingToUser($creator, $updater); $entities = $this->entities->createChainBelongingToUser($creator, $updater);
app()->make(UserRepo::class)->destroy($updater); app()->make(UserRepo::class)->destroy($updater);
app()->make(PageRepo::class)->update($entities['page'], ['html' => '<p>Hello there!</p>']); $this->entities->updatePage($entities['page'], ['html' => '<p>Hello there!</p>']);
$this->checkEntitiesViewable($entities); $this->checkEntitiesViewable($entities);
} }

View File

@ -5,15 +5,13 @@ namespace Tests\Entity;
use BookStack\Actions\Tag; use BookStack\Actions\Tag;
use BookStack\Entities\Models\Book; use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Bookshelf; use BookStack\Entities\Models\Bookshelf;
use BookStack\Entities\Models\Chapter;
use BookStack\Entities\Models\Page;
use Tests\TestCase; use Tests\TestCase;
class EntitySearchTest extends TestCase class EntitySearchTest extends TestCase
{ {
public function test_page_search() public function test_page_search()
{ {
$book = Book::all()->first(); $book = $this->entities->book();
$page = $book->pages->first(); $page = $book->pages->first();
$search = $this->asEditor()->get('/search?term=' . urlencode($page->name)); $search = $this->asEditor()->get('/search?term=' . urlencode($page->name));
@ -71,7 +69,7 @@ class EntitySearchTest extends TestCase
public function test_chapter_search() public function test_chapter_search()
{ {
$chapter = Chapter::has('pages')->first(); $chapter = $this->entities->chapterHasPages();
$page = $chapter->pages[0]; $page = $chapter->pages[0];
$pageTestResp = $this->asEditor()->get('/search/chapter/' . $chapter->id . '?term=' . urlencode($page->name)); $pageTestResp = $this->asEditor()->get('/search/chapter/' . $chapter->id . '?term=' . urlencode($page->name));
@ -91,10 +89,10 @@ class EntitySearchTest extends TestCase
]), ]),
]; ];
$pageA = Page::first(); $pageA = $this->entities->page();
$pageA->tags()->saveMany($newTags); $pageA->tags()->saveMany($newTags);
$pageB = Page::all()->last(); $pageB = $this->entities->page();
$pageB->tags()->create(['name' => 'animal', 'value' => 'dog']); $pageB->tags()->create(['name' => 'animal', 'value' => 'dog']);
$this->asEditor(); $this->asEditor();
@ -197,7 +195,7 @@ class EntitySearchTest extends TestCase
public function test_ajax_entity_search() public function test_ajax_entity_search()
{ {
$page = $this->entities->newPage(['name' => 'my ajax search test', 'html' => 'ajax test']); $page = $this->entities->newPage(['name' => 'my ajax search test', 'html' => 'ajax test']);
$notVisitedPage = Page::first(); $notVisitedPage = $this->entities->page();
// Visit the page to make popular // Visit the page to make popular
$this->asEditor()->get($page->getUrl()); $this->asEditor()->get($page->getUrl());
@ -215,7 +213,7 @@ class EntitySearchTest extends TestCase
public function test_ajax_entity_search_shows_breadcrumbs() public function test_ajax_entity_search_shows_breadcrumbs()
{ {
$chapter = Chapter::first(); $chapter = $this->entities->chapter();
$page = $chapter->pages->first(); $page = $chapter->pages->first();
$this->asEditor(); $this->asEditor();
@ -246,7 +244,7 @@ class EntitySearchTest extends TestCase
public function test_sibling_search_for_pages() public function test_sibling_search_for_pages()
{ {
$chapter = Chapter::query()->with('pages')->first(); $chapter = $this->entities->chapterHasPages();
$this->assertGreaterThan(2, count($chapter->pages), 'Ensure we\'re testing with at least 1 sibling'); $this->assertGreaterThan(2, count($chapter->pages), 'Ensure we\'re testing with at least 1 sibling');
$page = $chapter->pages->first(); $page = $chapter->pages->first();
@ -261,7 +259,7 @@ class EntitySearchTest extends TestCase
public function test_sibling_search_for_pages_without_chapter() public function test_sibling_search_for_pages_without_chapter()
{ {
$page = Page::query()->where('chapter_id', '=', 0)->firstOrFail(); $page = $this->entities->pageNotWithinChapter();
$bookChildren = $page->book->getDirectChildren(); $bookChildren = $page->book->getDirectChildren();
$this->assertGreaterThan(2, count($bookChildren), 'Ensure we\'re testing with at least 1 sibling'); $this->assertGreaterThan(2, count($bookChildren), 'Ensure we\'re testing with at least 1 sibling');
@ -276,7 +274,7 @@ class EntitySearchTest extends TestCase
public function test_sibling_search_for_chapters() public function test_sibling_search_for_chapters()
{ {
$chapter = Chapter::query()->firstOrFail(); $chapter = $this->entities->chapter();
$bookChildren = $chapter->book->getDirectChildren(); $bookChildren = $chapter->book->getDirectChildren();
$this->assertGreaterThan(2, count($bookChildren), 'Ensure we\'re testing with at least 1 sibling'); $this->assertGreaterThan(2, count($bookChildren), 'Ensure we\'re testing with at least 1 sibling');

View File

@ -311,7 +311,7 @@ class ExportTest extends TestCase
public function test_page_pdf_export_opens_details_blocks() public function test_page_pdf_export_opens_details_blocks()
{ {
$page = Page::query()->first()->forceFill([ $page = $this->entities->page()->forceFill([
'html' => '<details><summary>Hello</summary><p>Content!</p></details>', 'html' => '<details><summary>Hello</summary><p>Content!</p></details>',
]); ]);
$page->save(); $page->save();
@ -339,7 +339,7 @@ class ExportTest extends TestCase
public function test_page_markdown_export_uses_existing_markdown_if_apparent() public function test_page_markdown_export_uses_existing_markdown_if_apparent()
{ {
$page = Page::query()->first()->forceFill([ $page = $this->entities->page()->forceFill([
'markdown' => '# A header', 'markdown' => '# A header',
'html' => '<h1>Dogcat</h1>', 'html' => '<h1>Dogcat</h1>',
]); ]);
@ -352,7 +352,7 @@ class ExportTest extends TestCase
public function test_page_markdown_export_converts_html_where_no_markdown() public function test_page_markdown_export_converts_html_where_no_markdown()
{ {
$page = Page::query()->first()->forceFill([ $page = $this->entities->page()->forceFill([
'markdown' => '', 'markdown' => '',
'html' => '<h1>Dogcat</h1><p>Some <strong>bold</strong> text</p>', 'html' => '<h1>Dogcat</h1><p>Some <strong>bold</strong> text</p>',
]); ]);
@ -446,9 +446,9 @@ class ExportTest extends TestCase
public function test_html_exports_contain_csp_meta_tag() public function test_html_exports_contain_csp_meta_tag()
{ {
$entities = [ $entities = [
Page::query()->first(), $this->entities->page(),
Book::query()->first(), $this->entities->book(),
Chapter::query()->first(), $this->entities->chapter(),
]; ];
foreach ($entities as $entity) { foreach ($entities as $entity) {

View File

@ -16,7 +16,7 @@ class PageContentTest extends TestCase
public function test_page_includes() public function test_page_includes()
{ {
$page = $this->entities->page(); $page = $this->entities->page();
$secondPage = Page::query()->where('id', '!=', $page->id)->first(); $secondPage = $this->entities->page();
$secondPage->html = "<p id='section1'>Hello, This is a test</p><p id='section2'>This is a second block of content</p>"; $secondPage->html = "<p id='section1'>Hello, This is a test</p><p id='section2'>This is a second block of content</p>";
$secondPage->save(); $secondPage->save();
@ -45,7 +45,7 @@ class PageContentTest extends TestCase
public function test_saving_page_with_includes() public function test_saving_page_with_includes()
{ {
$page = $this->entities->page(); $page = $this->entities->page();
$secondPage = Page::query()->where('id', '!=', $page->id)->first(); $secondPage = $this->entities->page();
$this->asEditor(); $this->asEditor();
$includeTag = '{{@' . $secondPage->id . '}}'; $includeTag = '{{@' . $secondPage->id . '}}';

View File

@ -2,7 +2,6 @@
namespace Tests\Entity; namespace Tests\Entity;
use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Page; use BookStack\Entities\Models\Page;
use BookStack\Entities\Models\PageRevision; use BookStack\Entities\Models\PageRevision;
use BookStack\Entities\Repos\PageRepo; use BookStack\Entities\Repos\PageRepo;
@ -10,20 +9,13 @@ use Tests\TestCase;
class PageDraftTest extends TestCase class PageDraftTest extends TestCase
{ {
/** protected Page $page;
* @var Page protected PageRepo $pageRepo;
*/
protected $page;
/**
* @var PageRepo
*/
protected $pageRepo;
protected function setUp(): void protected function setUp(): void
{ {
parent::setUp(); parent::setUp();
$this->page = Page::query()->first(); $this->page = $this->entities->page();
$this->pageRepo = app()->make(PageRepo::class); $this->pageRepo = app()->make(PageRepo::class);
} }

View File

@ -2,20 +2,18 @@
namespace Tests\Entity; namespace Tests\Entity;
use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Chapter; use BookStack\Entities\Models\Chapter;
use BookStack\Entities\Models\Page; use BookStack\Entities\Models\Page;
use Tests\TestCase; use Tests\TestCase;
class PageEditorTest extends TestCase class PageEditorTest extends TestCase
{ {
/** @var Page */ protected Page $page;
protected $page;
protected function setUp(): void protected function setUp(): void
{ {
parent::setUp(); parent::setUp();
$this->page = Page::query()->first(); $this->page = $this->entities->page();
} }
public function test_default_editor_is_wysiwyg_for_new_pages() public function test_default_editor_is_wysiwyg_for_new_pages()
@ -80,8 +78,7 @@ class PageEditorTest extends TestCase
public function test_back_link_in_editor_has_correct_url() public function test_back_link_in_editor_has_correct_url()
{ {
/** @var Book $book */ $book = $this->entities->bookHasChaptersAndPages();
$book = Book::query()->whereHas('pages')->whereHas('chapters')->firstOrFail();
$this->asEditor()->get($book->getUrl('/create-page')); $this->asEditor()->get($book->getUrl('/create-page'));
/** @var Chapter $chapter */ /** @var Chapter $chapter */
$chapter = $book->chapters()->firstOrFail(); $chapter = $book->chapters()->firstOrFail();

View File

@ -21,7 +21,7 @@ class PageRevisionTest extends TestCase
public function test_page_revision_views_viewable() public function test_page_revision_views_viewable()
{ {
$this->asEditor(); $this->asEditor();
$page = Page::first(); $page = $this->entities->page();
$this->createRevisions($page, 1, ['name' => 'updated page', 'html' => '<p>new content</p>']); $this->createRevisions($page, 1, ['name' => 'updated page', 'html' => '<p>new content</p>']);
$pageRevision = $page->revisions->last(); $pageRevision = $page->revisions->last();
@ -37,7 +37,7 @@ class PageRevisionTest extends TestCase
public function test_page_revision_preview_shows_content_of_revision() public function test_page_revision_preview_shows_content_of_revision()
{ {
$this->asEditor(); $this->asEditor();
$page = Page::first(); $page = $this->entities->page();
$this->createRevisions($page, 1, ['name' => 'updated page', 'html' => '<p>new revision content</p>']); $this->createRevisions($page, 1, ['name' => 'updated page', 'html' => '<p>new revision content</p>']);
$pageRevision = $page->revisions->last(); $pageRevision = $page->revisions->last();
$this->createRevisions($page, 1, ['name' => 'updated page', 'html' => '<p>Updated content</p>']); $this->createRevisions($page, 1, ['name' => 'updated page', 'html' => '<p>Updated content</p>']);
@ -50,7 +50,7 @@ class PageRevisionTest extends TestCase
public function test_page_revision_restore_updates_content() public function test_page_revision_restore_updates_content()
{ {
$this->asEditor(); $this->asEditor();
$page = Page::first(); $page = $this->entities->page();
$this->createRevisions($page, 1, ['name' => 'updated page abc123', 'html' => '<p>new contente def456</p>']); $this->createRevisions($page, 1, ['name' => 'updated page abc123', 'html' => '<p>new contente def456</p>']);
$this->createRevisions($page, 1, ['name' => 'updated page again', 'html' => '<p>new content</p>']); $this->createRevisions($page, 1, ['name' => 'updated page again', 'html' => '<p>new content</p>']);
$page = Page::find($page->id); $page = Page::find($page->id);
@ -74,7 +74,7 @@ class PageRevisionTest extends TestCase
public function test_page_revision_restore_with_markdown_retains_markdown_content() public function test_page_revision_restore_with_markdown_retains_markdown_content()
{ {
$this->asEditor(); $this->asEditor();
$page = Page::first(); $page = $this->entities->page();
$this->createRevisions($page, 1, ['name' => 'updated page abc123', 'markdown' => '## New Content def456']); $this->createRevisions($page, 1, ['name' => 'updated page abc123', 'markdown' => '## New Content def456']);
$this->createRevisions($page, 1, ['name' => 'updated page again', 'markdown' => '## New Content Updated']); $this->createRevisions($page, 1, ['name' => 'updated page again', 'markdown' => '## New Content Updated']);
$page = Page::find($page->id); $page = Page::find($page->id);
@ -102,7 +102,7 @@ class PageRevisionTest extends TestCase
public function test_page_revision_restore_sets_new_revision_with_summary() public function test_page_revision_restore_sets_new_revision_with_summary()
{ {
$this->asEditor(); $this->asEditor();
$page = Page::first(); $page = $this->entities->page();
$this->createRevisions($page, 1, ['name' => 'updated page abc123', 'html' => '<p>new contente def456</p>', 'summary' => 'My first update']); $this->createRevisions($page, 1, ['name' => 'updated page abc123', 'html' => '<p>new contente def456</p>', 'summary' => 'My first update']);
$this->createRevisions($page, 1, ['html' => '<p>new content</p>']); $this->createRevisions($page, 1, ['html' => '<p>new content</p>']);
$page->refresh(); $page->refresh();
@ -124,7 +124,7 @@ class PageRevisionTest extends TestCase
public function test_page_revision_count_increments_on_update() public function test_page_revision_count_increments_on_update()
{ {
$page = Page::first(); $page = $this->entities->page();
$startCount = $page->revision_count; $startCount = $page->revision_count;
$this->createRevisions($page, 1); $this->createRevisions($page, 1);
@ -133,7 +133,7 @@ class PageRevisionTest extends TestCase
public function test_revision_count_shown_in_page_meta() public function test_revision_count_shown_in_page_meta()
{ {
$page = Page::first(); $page = $this->entities->page();
$this->createRevisions($page, 2); $this->createRevisions($page, 2);
$pageView = $this->get($page->getUrl()); $pageView = $this->get($page->getUrl());
@ -172,7 +172,7 @@ class PageRevisionTest extends TestCase
public function test_revision_limit_enforced() public function test_revision_limit_enforced()
{ {
config()->set('app.revision_limit', 2); config()->set('app.revision_limit', 2);
$page = Page::first(); $page = $this->entities->page();
$this->createRevisions($page, 12); $this->createRevisions($page, 12);
$revisionCount = $page->revisions()->count(); $revisionCount = $page->revisions()->count();
@ -182,7 +182,7 @@ class PageRevisionTest extends TestCase
public function test_false_revision_limit_allows_many_revisions() public function test_false_revision_limit_allows_many_revisions()
{ {
config()->set('app.revision_limit', false); config()->set('app.revision_limit', false);
$page = Page::first(); $page = $this->entities->page();
$this->createRevisions($page, 12); $this->createRevisions($page, 12);
$revisionCount = $page->revisions()->count(); $revisionCount = $page->revisions()->count();
@ -191,8 +191,7 @@ class PageRevisionTest extends TestCase
public function test_revision_list_shows_editor_type() public function test_revision_list_shows_editor_type()
{ {
/** @var Page $page */ $page = $this->entities->page();
$page = Page::first();
$this->createRevisions($page, 1, ['html' => 'new page html']); $this->createRevisions($page, 1, ['html' => 'new page html']);
$resp = $this->asAdmin()->get($page->refresh()->getUrl('/revisions')); $resp = $this->asAdmin()->get($page->refresh()->getUrl('/revisions'));

View File

@ -9,7 +9,7 @@ class PageTemplateTest extends TestCase
{ {
public function test_active_templates_visible_on_page_view() public function test_active_templates_visible_on_page_view()
{ {
$page = Page::first(); $page = $this->entities->page();
$this->asEditor(); $this->asEditor();
$templateView = $this->get($page->getUrl()); $templateView = $this->get($page->getUrl());
@ -24,7 +24,7 @@ class PageTemplateTest extends TestCase
public function test_manage_templates_permission_required_to_change_page_template_status() public function test_manage_templates_permission_required_to_change_page_template_status()
{ {
$page = Page::first(); $page = $this->entities->page();
$editor = $this->getEditor(); $editor = $this->getEditor();
$this->actingAs($editor); $this->actingAs($editor);
@ -52,7 +52,7 @@ class PageTemplateTest extends TestCase
public function test_templates_content_should_be_fetchable_only_if_page_marked_as_template() public function test_templates_content_should_be_fetchable_only_if_page_marked_as_template()
{ {
$content = '<div>my_custom_template_content</div>'; $content = '<div>my_custom_template_content</div>';
$page = Page::first(); $page = $this->entities->page();
$editor = $this->getEditor(); $editor = $this->getEditor();
$this->actingAs($editor); $this->actingAs($editor);

View File

@ -3,7 +3,6 @@
namespace Tests\Entity; namespace Tests\Entity;
use BookStack\Entities\Models\Book; use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Chapter;
use BookStack\Entities\Models\Page; use BookStack\Entities\Models\Page;
use Carbon\Carbon; use Carbon\Carbon;
use Tests\TestCase; use Tests\TestCase;
@ -128,7 +127,7 @@ class PageTest extends TestCase
public function test_page_copy() public function test_page_copy()
{ {
$page = Page::first(); $page = $this->entities->page();
$page->html = '<p>This is some test content</p>'; $page->html = '<p>This is some test content</p>';
$page->save(); $page->save();
@ -151,7 +150,7 @@ class PageTest extends TestCase
public function test_page_copy_with_markdown_has_both_html_and_markdown() public function test_page_copy_with_markdown_has_both_html_and_markdown()
{ {
$page = Page::first(); $page = $this->entities->page();
$page->html = '<h1>This is some test content</h1>'; $page->html = '<h1>This is some test content</h1>';
$page->markdown = '# This is some test content'; $page->markdown = '# This is some test content';
$page->save(); $page->save();
@ -169,7 +168,7 @@ class PageTest extends TestCase
public function test_page_copy_with_no_destination() public function test_page_copy_with_no_destination()
{ {
$page = Page::first(); $page = $this->entities->page();
$currentBook = $page->book; $currentBook = $page->book;
$resp = $this->asEditor()->get($page->getUrl('/copy')); $resp = $this->asEditor()->get($page->getUrl('/copy'));
@ -188,7 +187,7 @@ class PageTest extends TestCase
public function test_page_can_be_copied_without_edit_permission() public function test_page_can_be_copied_without_edit_permission()
{ {
$page = Page::first(); $page = $this->entities->page();
$currentBook = $page->book; $currentBook = $page->book;
$newBook = Book::where('id', '!=', $currentBook->id)->first(); $newBook = Book::where('id', '!=', $currentBook->id)->first();
$viewer = $this->getViewer(); $viewer = $this->getViewer();
@ -274,8 +273,7 @@ class PageTest extends TestCase
public function test_recently_updated_pages_view_shows_parent_chain() public function test_recently_updated_pages_view_shows_parent_chain()
{ {
$user = $this->getEditor(); $user = $this->getEditor();
/** @var Page $page */ $page = $this->entities->pageWithinChapter();
$page = Page::query()->whereNotNull('chapter_id')->first();
$this->actingAs($user)->put($page->getUrl(), [ $this->actingAs($user)->put($page->getUrl(), [
'name' => 'Updated title', 'name' => 'Updated title',
@ -290,8 +288,7 @@ class PageTest extends TestCase
public function test_recently_updated_pages_view_does_not_show_parent_if_not_visible() public function test_recently_updated_pages_view_does_not_show_parent_if_not_visible()
{ {
$user = $this->getEditor(); $user = $this->getEditor();
/** @var Page $page */ $page = $this->entities->pageWithinChapter();
$page = Page::query()->whereNotNull('chapter_id')->first();
$this->actingAs($user)->put($page->getUrl(), [ $this->actingAs($user)->put($page->getUrl(), [
'name' => 'Updated title', 'name' => 'Updated title',

View File

@ -10,24 +10,17 @@ use Tests\TestCase;
class SortTest extends TestCase class SortTest extends TestCase
{ {
protected $book;
protected function setUp(): void
{
parent::setUp();
$this->book = Book::first();
}
public function test_drafts_do_not_show_up() public function test_drafts_do_not_show_up()
{ {
$this->asAdmin(); $this->asAdmin();
$pageRepo = app(PageRepo::class); $pageRepo = app(PageRepo::class);
$draft = $pageRepo->getNewDraftPage($this->book); $book = $this->entities->book();
$draft = $pageRepo->getNewDraftPage($book);
$resp = $this->get($this->book->getUrl()); $resp = $this->get($book->getUrl());
$resp->assertSee($draft->name); $resp->assertSee($draft->name);
$resp = $this->get($this->book->getUrl() . '/sort'); $resp = $this->get($book->getUrl() . '/sort');
$resp->assertDontSee($draft->name); $resp->assertDontSee($draft->name);
} }
@ -43,7 +36,7 @@ class SortTest extends TestCase
$movePageResp = $this->put($page->getUrl('/move'), [ $movePageResp = $this->put($page->getUrl('/move'), [
'entity_selection' => 'book:' . $newBook->id, 'entity_selection' => 'book:' . $newBook->id,
]); ]);
$page = Page::query()->find($page->id); $page->refresh();
$movePageResp->assertRedirect($page->getUrl()); $movePageResp->assertRedirect($page->getUrl());
$this->assertTrue($page->book->id == $newBook->id, 'Page book is now the new book'); $this->assertTrue($page->book->id == $newBook->id, 'Page book is now the new book');
@ -63,7 +56,7 @@ class SortTest extends TestCase
$movePageResp = $this->actingAs($this->getEditor())->put($page->getUrl('/move'), [ $movePageResp = $this->actingAs($this->getEditor())->put($page->getUrl('/move'), [
'entity_selection' => 'chapter:' . $newChapter->id, 'entity_selection' => 'chapter:' . $newChapter->id,
]); ]);
$page = Page::query()->find($page->id); $page->refresh();
$movePageResp->assertRedirect($page->getUrl()); $movePageResp->assertRedirect($page->getUrl());
$this->assertTrue($page->book->id == $newBook->id, 'Page parent is now the new chapter'); $this->assertTrue($page->book->id == $newBook->id, 'Page parent is now the new chapter');
@ -110,7 +103,7 @@ class SortTest extends TestCase
'entity_selection' => 'book:' . $newBook->id, 'entity_selection' => 'book:' . $newBook->id,
]); ]);
$page = Page::query()->find($page->id); $page->refresh();
$movePageResp->assertRedirect($page->getUrl()); $movePageResp->assertRedirect($page->getUrl());
$this->assertTrue($page->book->id == $newBook->id, 'Page book is now the new book'); $this->assertTrue($page->book->id == $newBook->id, 'Page book is now the new book');
@ -138,7 +131,7 @@ class SortTest extends TestCase
'entity_selection' => 'book:' . $newBook->id, 'entity_selection' => 'book:' . $newBook->id,
]); ]);
$page = Page::query()->find($page->id); $page->refresh();
$movePageResp->assertRedirect($page->getUrl()); $movePageResp->assertRedirect($page->getUrl());
$this->assertTrue($page->book->id == $newBook->id, 'Page book is now the new book'); $this->assertTrue($page->book->id == $newBook->id, 'Page book is now the new book');
} }
@ -243,8 +236,7 @@ class SortTest extends TestCase
public function test_book_sort_page_shows() public function test_book_sort_page_shows()
{ {
/** @var Book $bookToSort */ $bookToSort = $this->entities->book();
$bookToSort = Book::query()->first();
$resp = $this->asAdmin()->get($bookToSort->getUrl()); $resp = $this->asAdmin()->get($bookToSort->getUrl());
$this->withHtml($resp)->assertElementExists('a[href="' . $bookToSort->getUrl('/sort') . '"]'); $this->withHtml($resp)->assertElementExists('a[href="' . $bookToSort->getUrl('/sort') . '"]');
@ -256,7 +248,7 @@ class SortTest extends TestCase
public function test_book_sort() public function test_book_sort()
{ {
$oldBook = Book::query()->first(); $oldBook = $this->entities->book();
$chapterToMove = $this->entities->newChapter(['name' => 'chapter to move'], $oldBook); $chapterToMove = $this->entities->newChapter(['name' => 'chapter to move'], $oldBook);
$newBook = $this->entities->newBook(['name' => 'New sort book']); $newBook = $this->entities->newBook(['name' => 'New sort book']);
$pagesToMove = Page::query()->take(5)->get(); $pagesToMove = Page::query()->take(5)->get();
@ -299,8 +291,7 @@ class SortTest extends TestCase
public function test_book_sort_makes_no_changes_if_new_chapter_does_not_align_with_new_book() public function test_book_sort_makes_no_changes_if_new_chapter_does_not_align_with_new_book()
{ {
/** @var Page $page */ $page = $this->entities->pageWithinChapter();
$page = Page::query()->where('chapter_id', '!=', 0)->first();
$otherChapter = Chapter::query()->where('book_id', '!=', $page->book_id)->first(); $otherChapter = Chapter::query()->where('book_id', '!=', $page->book_id)->first();
$sortData = [ $sortData = [
@ -319,8 +310,7 @@ class SortTest extends TestCase
public function test_book_sort_makes_no_changes_if_no_view_permissions_on_new_chapter() public function test_book_sort_makes_no_changes_if_no_view_permissions_on_new_chapter()
{ {
/** @var Page $page */ $page = $this->entities->pageWithinChapter();
$page = Page::query()->where('chapter_id', '!=', 0)->first();
/** @var Chapter $otherChapter */ /** @var Chapter $otherChapter */
$otherChapter = Chapter::query()->where('book_id', '!=', $page->book_id)->first(); $otherChapter = Chapter::query()->where('book_id', '!=', $page->book_id)->first();
$this->entities->setPermissions($otherChapter); $this->entities->setPermissions($otherChapter);
@ -341,8 +331,7 @@ class SortTest extends TestCase
public function test_book_sort_makes_no_changes_if_no_view_permissions_on_new_book() public function test_book_sort_makes_no_changes_if_no_view_permissions_on_new_book()
{ {
/** @var Page $page */ $page = $this->entities->pageWithinChapter();
$page = Page::query()->where('chapter_id', '!=', 0)->first();
/** @var Chapter $otherChapter */ /** @var Chapter $otherChapter */
$otherChapter = Chapter::query()->where('book_id', '!=', $page->book_id)->first(); $otherChapter = Chapter::query()->where('book_id', '!=', $page->book_id)->first();
$editor = $this->getEditor(); $editor = $this->getEditor();
@ -364,8 +353,7 @@ class SortTest extends TestCase
public function test_book_sort_makes_no_changes_if_no_update_or_create_permissions_on_new_chapter() public function test_book_sort_makes_no_changes_if_no_update_or_create_permissions_on_new_chapter()
{ {
/** @var Page $page */ $page = $this->entities->pageWithinChapter();
$page = Page::query()->where('chapter_id', '!=', 0)->first();
/** @var Chapter $otherChapter */ /** @var Chapter $otherChapter */
$otherChapter = Chapter::query()->where('book_id', '!=', $page->book_id)->first(); $otherChapter = Chapter::query()->where('book_id', '!=', $page->book_id)->first();
$editor = $this->getEditor(); $editor = $this->getEditor();
@ -387,8 +375,7 @@ class SortTest extends TestCase
public function test_book_sort_makes_no_changes_if_no_update_permissions_on_moved_item() public function test_book_sort_makes_no_changes_if_no_update_permissions_on_moved_item()
{ {
/** @var Page $page */ $page = $this->entities->pageWithinChapter();
$page = Page::query()->where('chapter_id', '!=', 0)->first();
/** @var Chapter $otherChapter */ /** @var Chapter $otherChapter */
$otherChapter = Chapter::query()->where('book_id', '!=', $page->book_id)->first(); $otherChapter = Chapter::query()->where('book_id', '!=', $page->book_id)->first();
$editor = $this->getEditor(); $editor = $this->getEditor();
@ -410,8 +397,7 @@ class SortTest extends TestCase
public function test_book_sort_makes_no_changes_if_no_delete_permissions_on_moved_item() public function test_book_sort_makes_no_changes_if_no_delete_permissions_on_moved_item()
{ {
/** @var Page $page */ $page = $this->entities->pageWithinChapter();
$page = Page::query()->where('chapter_id', '!=', 0)->first();
/** @var Chapter $otherChapter */ /** @var Chapter $otherChapter */
$otherChapter = Chapter::query()->where('book_id', '!=', $page->book_id)->first(); $otherChapter = Chapter::query()->where('book_id', '!=', $page->book_id)->first();
$editor = $this->getEditor(); $editor = $this->getEditor();
@ -433,8 +419,7 @@ class SortTest extends TestCase
public function test_book_sort_item_returns_book_content() public function test_book_sort_item_returns_book_content()
{ {
$books = Book::all(); $bookToSort = $this->entities->book();
$bookToSort = $books[0];
$firstPage = $bookToSort->pages[0]; $firstPage = $bookToSort->pages[0];
$firstChapter = $bookToSort->chapters[0]; $firstChapter = $bookToSort->chapters[0];
@ -448,8 +433,7 @@ class SortTest extends TestCase
public function test_pages_in_book_show_sorted_by_priority() public function test_pages_in_book_show_sorted_by_priority()
{ {
/** @var Book $book */ $book = $this->entities->bookHasChaptersAndPages();
$book = Book::query()->whereHas('pages')->first();
$book->chapters()->forceDelete(); $book->chapters()->forceDelete();
/** @var Page[] $pages */ /** @var Page[] $pages */
$pages = $book->pages()->where('chapter_id', '=', 0)->take(2)->get(); $pages = $book->pages()->where('chapter_id', '=', 0)->take(2)->get();

View File

@ -3,7 +3,6 @@
namespace Tests\Entity; namespace Tests\Entity;
use BookStack\Actions\Tag; use BookStack\Actions\Tag;
use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Entity; use BookStack\Entities\Models\Entity;
use BookStack\Entities\Models\Page; use BookStack\Entities\Models\Page;
use Tests\TestCase; use Tests\TestCase;

View File

@ -2,7 +2,6 @@
namespace Tests; namespace Tests;
use BookStack\Entities\Models\Book;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
class ErrorTest extends TestCase class ErrorTest extends TestCase

View File

@ -4,10 +4,6 @@ namespace Tests;
use BookStack\Actions\Favourite; use BookStack\Actions\Favourite;
use BookStack\Auth\User; use BookStack\Auth\User;
use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Bookshelf;
use BookStack\Entities\Models\Chapter;
use BookStack\Entities\Models\Page;
class FavouriteTest extends TestCase class FavouriteTest extends TestCase
{ {
@ -83,16 +79,11 @@ class FavouriteTest extends TestCase
]); ]);
} }
public function test_book_chapter_shelf_pages_contain_favourite_button() public function test_each_entity_type_shows_favourite_button()
{ {
$entities = [
Bookshelf::query()->first(),
Book::query()->first(),
Chapter::query()->first(),
];
$this->actingAs($this->getEditor()); $this->actingAs($this->getEditor());
foreach ($entities as $entity) { foreach ($this->entities->all() as $entity) {
$resp = $this->get($entity->getUrl()); $resp = $this->get($entity->getUrl());
$this->withHtml($resp)->assertElementExists('form[method="POST"][action$="/favourites/add"]'); $this->withHtml($resp)->assertElementExists('form[method="POST"][action$="/favourites/add"]');
} }

View File

@ -13,7 +13,13 @@ use BookStack\Entities\Repos\BookRepo;
use BookStack\Entities\Repos\BookshelfRepo; use BookStack\Entities\Repos\BookshelfRepo;
use BookStack\Entities\Repos\ChapterRepo; use BookStack\Entities\Repos\ChapterRepo;
use BookStack\Entities\Repos\PageRepo; use BookStack\Entities\Repos\PageRepo;
use Illuminate\Database\Eloquent\Builder;
/**
* Class to provider and action entity models for common test case
* operations. Tracks handled models and only returns fresh models.
* Does not dedupe against nested/child/parent models.
*/
class EntityProvider class EntityProvider
{ {
/** /**
@ -29,43 +35,68 @@ class EntityProvider
/** /**
* Get an un-fetched page from the system. * Get an un-fetched page from the system.
*/ */
public function page(): Page public function page(callable $queryFilter = null): Page
{ {
/** @var Page $page */ /** @var Page $page */
$page = Page::query()->whereNotIn('id', $this->fetchCache['page'])->first(); $page = Page::query()->when($queryFilter, $queryFilter)->whereNotIn('id', $this->fetchCache['page'])->first();
$this->addToCache($page); $this->addToCache($page);
return $page; return $page;
} }
public function pageWithinChapter(): Page
{
return $this->page(fn(Builder $query) => $query->whereHas('chapter')->with('chapter'));
}
public function pageNotWithinChapter(): Page
{
return $this->page(fn(Builder $query) => $query->where('chapter_id', '=', 0));
}
/** /**
* Get an un-fetched chapter from the system. * Get an un-fetched chapter from the system.
*/ */
public function chapter(): Chapter public function chapter(callable $queryFilter = null): Chapter
{ {
/** @var Chapter $chapter */ /** @var Chapter $chapter */
$chapter = Chapter::query()->whereNotIn('id', $this->fetchCache['chapter'])->first(); $chapter = Chapter::query()->when($queryFilter, $queryFilter)->whereNotIn('id', $this->fetchCache['chapter'])->first();
$this->addToCache($chapter); $this->addToCache($chapter);
return $chapter; return $chapter;
} }
public function chapterHasPages(): Chapter
{
return $this->chapter(fn(Builder $query) => $query->whereHas('pages'));
}
/** /**
* Get an un-fetched book from the system. * Get an un-fetched book from the system.
*/ */
public function book(): Book public function book(callable $queryFilter = null): Book
{ {
/** @var Book $book */ /** @var Book $book */
$book = Book::query()->whereNotIn('id', $this->fetchCache['book'])->first(); $book = Book::query()->when($queryFilter, $queryFilter)->whereNotIn('id', $this->fetchCache['book'])->first();
$this->addToCache($book); $this->addToCache($book);
return $book; return $book;
} }
/**
* Get a book that has chapters and pages assigned.
*/
public function bookHasChaptersAndPages(): Book
{
return $this->book(function (Builder $query) {
$query->has('chapters')->has('pages')->with(['chapters', 'pages']);
});
}
/** /**
* Get an un-fetched shelf from the system. * Get an un-fetched shelf from the system.
*/ */
public function shelf(): Bookshelf public function shelf(callable $queryFilter = null): Bookshelf
{ {
/** @var Bookshelf $shelf */ /** @var Bookshelf $shelf */
$shelf = Bookshelf::query()->whereNotIn('id', $this->fetchCache['bookshelf'])->first(); $shelf = Bookshelf::query()->when($queryFilter, $queryFilter)->whereNotIn('id', $this->fetchCache['bookshelf'])->first();
$this->addToCache($shelf); $this->addToCache($shelf);
return $shelf; return $shelf;
} }
@ -84,6 +115,12 @@ class EntityProvider
]; ];
} }
public function updatePage(Page $page, array $data): Page
{
$this->addToCache($page);
return app()->make(PageRepo::class)->update($page, $data);
}
/** /**
* Create a book to page chain of entities that belong to a specific user. * Create a book to page chain of entities that belong to a specific user.
* @return array{book: Book, chapter: Chapter, page: Page} * @return array{book: Book, chapter: Chapter, page: Page}

View File

@ -1,6 +1,6 @@
<?php <?php
namespace Tests; namespace Tests\Helpers;
use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\ParallelTesting; use Illuminate\Support\Facades\ParallelTesting;

View File

@ -4,8 +4,6 @@ namespace Tests;
use BookStack\Auth\Role; use BookStack\Auth\Role;
use BookStack\Auth\User; use BookStack\Auth\User;
use BookStack\Entities\Models\Bookshelf;
use BookStack\Entities\Models\Page;
class HomepageTest extends TestCase class HomepageTest extends TestCase
{ {
@ -99,8 +97,7 @@ class HomepageTest extends TestCase
public function test_custom_homepage_renders_includes() public function test_custom_homepage_renders_includes()
{ {
$this->asEditor(); $this->asEditor();
/** @var Page $included */ $included = $this->entities->page();
$included = Page::query()->first();
$content = str_repeat('This is the body content of my custom homepage.', 20); $content = str_repeat('This is the body content of my custom homepage.', 20);
$included->html = $content; $included->html = $content;
$included->save(); $included->save();
@ -138,7 +135,7 @@ class HomepageTest extends TestCase
{ {
$editor = $this->getEditor(); $editor = $this->getEditor();
setting()->putUser($editor, 'bookshelves_view_type', 'grid'); setting()->putUser($editor, 'bookshelves_view_type', 'grid');
$shelf = Bookshelf::query()->firstOrFail(); $shelf = $this->entities->shelf();
$this->setSettings(['app-homepage-type' => 'bookshelves']); $this->setSettings(['app-homepage-type' => 'bookshelves']);

View File

@ -2,10 +2,6 @@
namespace Tests; namespace Tests;
use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Bookshelf;
use BookStack\Entities\Models\Chapter;
use BookStack\Entities\Models\Page;
use BookStack\Entities\Repos\BaseRepo; use BookStack\Entities\Repos\BaseRepo;
use BookStack\Entities\Repos\BookRepo; use BookStack\Entities\Repos\BookRepo;
use Illuminate\Support\Str; use Illuminate\Support\Str;

View File

@ -3,10 +3,6 @@
namespace Tests\Permissions; namespace Tests\Permissions;
use BookStack\Auth\User; use BookStack\Auth\User;
use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Bookshelf;
use BookStack\Entities\Models\Chapter;
use BookStack\Entities\Models\Page;
use Tests\TestCase; use Tests\TestCase;
class EntityOwnerChangeTest extends TestCase class EntityOwnerChangeTest extends TestCase

View File

@ -13,15 +13,8 @@ use Tests\TestCase;
class EntityPermissionsTest extends TestCase class EntityPermissionsTest extends TestCase
{ {
/** protected User $user;
* @var User protected User $viewer;
*/
protected $user;
/**
* @var User
*/
protected $viewer;
protected function setUp(): void protected function setUp(): void
{ {

View File

@ -2,8 +2,6 @@
namespace Tests\Permissions; namespace Tests\Permissions;
use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Chapter;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Tests\TestCase; use Tests\TestCase;

View File

@ -17,7 +17,7 @@ use Tests\TestCase;
class RolesTest extends TestCase class RolesTest extends TestCase
{ {
protected $user; protected User $user;
protected function setUp(): void protected function setUp(): void
{ {

View File

@ -8,7 +8,6 @@ use BookStack\Auth\Role;
use BookStack\Auth\User; use BookStack\Auth\User;
use BookStack\Entities\Models\Book; use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Chapter; use BookStack\Entities\Models\Chapter;
use BookStack\Entities\Models\Page;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\View; use Illuminate\Support\Facades\View;

View File

@ -2,7 +2,6 @@
namespace Tests\References; namespace Tests\References;
use BookStack\Entities\Models\Page;
use BookStack\References\CrossLinkParser; use BookStack\References\CrossLinkParser;
use Tests\TestCase; use Tests\TestCase;
@ -11,7 +10,7 @@ class CrossLinkParserTest extends TestCase
public function test_instance_with_entity_resolvers_matches_entity_links() public function test_instance_with_entity_resolvers_matches_entity_links()
{ {
$entities = $this->entities->all(); $entities = $this->entities->all();
$otherPage = Page::query()->where('id', '!=', $entities['page']->id)->first(); $otherPage = $this->entities->page();
$html = ' $html = '
<a href="' . url('/link/' . $otherPage->id) . '#cat">Page Permalink</a> <a href="' . url('/link/' . $otherPage->id) . '#cat">Page Permalink</a>

View File

@ -2,9 +2,6 @@
namespace Tests\References; namespace Tests\References;
use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Chapter;
use BookStack\Entities\Models\Page;
use BookStack\Entities\Repos\PageRepo; use BookStack\Entities\Repos\PageRepo;
use BookStack\Entities\Tools\TrashCan; use BookStack\Entities\Tools\TrashCan;
use BookStack\Model; use BookStack\Model;
@ -15,10 +12,8 @@ class ReferencesTest extends TestCase
{ {
public function test_references_created_on_page_update() public function test_references_created_on_page_update()
{ {
/** @var Page $pageA */ $pageA = $this->entities->page();
/** @var Page $pageB */ $pageB = $this->entities->page();
$pageA = Page::query()->first();
$pageB = Page::query()->where('id', '!=', $pageA->id)->first();
$this->assertDatabaseMissing('references', ['from_id' => $pageA->id, 'from_type' => $pageA->getMorphClass()]); $this->assertDatabaseMissing('references', ['from_id' => $pageA->id, 'from_type' => $pageA->getMorphClass()]);
@ -37,10 +32,8 @@ class ReferencesTest extends TestCase
public function test_references_deleted_on_entity_delete() public function test_references_deleted_on_entity_delete()
{ {
/** @var Page $pageA */ $pageA = $this->entities->page();
/** @var Page $pageB */ $pageB = $this->entities->page();
$pageA = Page::query()->first();
$pageB = Page::query()->where('id', '!=', $pageA->id)->first();
$this->createReference($pageA, $pageB); $this->createReference($pageA, $pageB);
$this->createReference($pageB, $pageA); $this->createReference($pageB, $pageA);
@ -58,8 +51,7 @@ class ReferencesTest extends TestCase
public function test_references_to_count_visible_on_entity_show_view() public function test_references_to_count_visible_on_entity_show_view()
{ {
$entities = $this->entities->all(); $entities = $this->entities->all();
/** @var Page $otherPage */ $otherPage = $this->entities->page();
$otherPage = Page::query()->where('id', '!=', $entities['page']->id)->first();
$this->asEditor(); $this->asEditor();
foreach ($entities as $entity) { foreach ($entities as $entity) {
@ -95,10 +87,8 @@ class ReferencesTest extends TestCase
public function test_reference_not_visible_if_view_permission_does_not_permit() public function test_reference_not_visible_if_view_permission_does_not_permit()
{ {
/** @var Page $page */
/** @var Page $pageB */
$page = $this->entities->page(); $page = $this->entities->page();
$pageB = Page::query()->where('id', '!=', $page->id)->first(); $pageB = $this->entities->page();
$this->createReference($pageB, $page); $this->createReference($pageB, $page);
$this->entities->setPermissions($pageB); $this->entities->setPermissions($pageB);
@ -118,11 +108,8 @@ class ReferencesTest extends TestCase
public function test_pages_leading_to_entity_updated_on_url_change() public function test_pages_leading_to_entity_updated_on_url_change()
{ {
/** @var Page $pageA */ $pageA = $this->entities->page();
/** @var Page $pageB */ $pageB = $this->entities->page();
/** @var Book $book */
$pageA = Page::query()->first();
$pageB = Page::query()->where('id', '!=', $pageA->id)->first();
$book = $this->entities->book(); $book = $this->entities->book();
foreach ([$pageA, $pageB] as $page) { foreach ([$pageA, $pageB] as $page) {
@ -147,11 +134,8 @@ class ReferencesTest extends TestCase
public function test_pages_linking_to_other_page_updated_on_parent_book_url_change() public function test_pages_linking_to_other_page_updated_on_parent_book_url_change()
{ {
/** @var Page $bookPage */ $bookPage = $this->entities->page();
/** @var Page $otherPage */ $otherPage = $this->entities->page();
/** @var Book $book */
$bookPage = Page::query()->first();
$otherPage = Page::query()->where('id', '!=', $bookPage->id)->first();
$book = $bookPage->book; $book = $bookPage->book;
$otherPage->html = '<a href="' . $bookPage->getUrl() . '">Link</a>'; $otherPage->html = '<a href="' . $bookPage->getUrl() . '">Link</a>';
@ -172,11 +156,8 @@ class ReferencesTest extends TestCase
public function test_pages_linking_to_chapter_updated_on_parent_book_url_change() public function test_pages_linking_to_chapter_updated_on_parent_book_url_change()
{ {
/** @var Chapter $bookChapter */ $bookChapter = $this->entities->chapter();
/** @var Page $otherPage */ $otherPage = $this->entities->page();
/** @var Book $book */
$bookChapter = Chapter::query()->first();
$otherPage = Page::query()->first();
$book = $bookChapter->book; $book = $bookChapter->book;
$otherPage->html = '<a href="' . $bookChapter->getUrl() . '">Link</a>'; $otherPage->html = '<a href="' . $bookChapter->getUrl() . '">Link</a>';
@ -197,8 +178,6 @@ class ReferencesTest extends TestCase
public function test_markdown_links_leading_to_entity_updated_on_url_change() public function test_markdown_links_leading_to_entity_updated_on_url_change()
{ {
/** @var Page $page */
/** @var Book $book */
$page = $this->entities->page(); $page = $this->entities->page();
$book = $this->entities->book(); $book = $this->entities->book();

View File

@ -3,10 +3,7 @@
namespace Tests\Settings; namespace Tests\Settings;
use BookStack\Entities\Models\Book; use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Bookshelf;
use BookStack\Entities\Models\Chapter;
use BookStack\Entities\Models\Deletion; use BookStack\Entities\Models\Deletion;
use BookStack\Entities\Models\Entity;
use BookStack\Entities\Models\Page; use BookStack\Entities\Models\Page;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
@ -97,7 +94,7 @@ class RecycleBinTest extends TestCase
public function test_entity_restore() public function test_entity_restore()
{ {
$book = Book::query()->whereHas('pages')->whereHas('chapters')->with(['pages', 'chapters'])->firstOrFail(); $book = $this->entities->bookHasChaptersAndPages();
$this->asEditor()->delete($book->getUrl()); $this->asEditor()->delete($book->getUrl());
$deletion = Deletion::query()->firstOrFail(); $deletion = Deletion::query()->firstOrFail();
@ -118,7 +115,7 @@ class RecycleBinTest extends TestCase
public function test_permanent_delete() public function test_permanent_delete()
{ {
$book = Book::query()->whereHas('pages')->whereHas('chapters')->with(['pages', 'chapters'])->firstOrFail(); $book = $this->entities->bookHasChaptersAndPages();
$this->asEditor()->delete($book->getUrl()); $this->asEditor()->delete($book->getUrl());
$deletion = Deletion::query()->firstOrFail(); $deletion = Deletion::query()->firstOrFail();
@ -137,9 +134,7 @@ class RecycleBinTest extends TestCase
public function test_permanent_delete_for_each_type() public function test_permanent_delete_for_each_type()
{ {
/** @var Entity $entity */ foreach ($this->entities->all() as $type => $entity) {
foreach ([new Bookshelf(), new Book(), new Chapter(), new Page()] as $entity) {
$entity = $entity->newQuery()->first();
$this->asEditor()->delete($entity->getUrl()); $this->asEditor()->delete($entity->getUrl());
$deletion = Deletion::query()->orderBy('id', 'desc')->firstOrFail(); $deletion = Deletion::query()->orderBy('id', 'desc')->firstOrFail();
@ -152,7 +147,7 @@ class RecycleBinTest extends TestCase
public function test_permanent_entity_delete_updates_existing_activity_with_entity_name() public function test_permanent_entity_delete_updates_existing_activity_with_entity_name()
{ {
$page = Page::query()->firstOrFail(); $page = $this->entities->page();
$this->asEditor()->delete($page->getUrl()); $this->asEditor()->delete($page->getUrl());
$deletion = $page->deletions()->firstOrFail(); $deletion = $page->deletions()->firstOrFail();
@ -181,8 +176,8 @@ class RecycleBinTest extends TestCase
public function test_auto_clear_functionality_works() public function test_auto_clear_functionality_works()
{ {
config()->set('app.recycle_bin_lifetime', 5); config()->set('app.recycle_bin_lifetime', 5);
$page = Page::query()->firstOrFail(); $page = $this->entities->page();
$otherPage = Page::query()->where('id', '!=', $page->id)->firstOrFail(); $otherPage = $this->entities->page();
$this->asEditor()->delete($page->getUrl()); $this->asEditor()->delete($page->getUrl());
$this->assertDatabaseHas('pages', ['id' => $page->id]); $this->assertDatabaseHas('pages', ['id' => $page->id]);
@ -198,8 +193,8 @@ class RecycleBinTest extends TestCase
public function test_auto_clear_functionality_with_negative_time_keeps_forever() public function test_auto_clear_functionality_with_negative_time_keeps_forever()
{ {
config()->set('app.recycle_bin_lifetime', -1); config()->set('app.recycle_bin_lifetime', -1);
$page = Page::query()->firstOrFail(); $page = $this->entities->page();
$otherPage = Page::query()->where('id', '!=', $page->id)->firstOrFail(); $otherPage = $this->entities->page();
$this->asEditor()->delete($page->getUrl()); $this->asEditor()->delete($page->getUrl());
$this->assertEquals(1, Deletion::query()->count()); $this->assertEquals(1, Deletion::query()->count());
@ -214,7 +209,7 @@ class RecycleBinTest extends TestCase
public function test_auto_clear_functionality_with_zero_time_deletes_instantly() public function test_auto_clear_functionality_with_zero_time_deletes_instantly()
{ {
config()->set('app.recycle_bin_lifetime', 0); config()->set('app.recycle_bin_lifetime', 0);
$page = Page::query()->firstOrFail(); $page = $this->entities->page();
$this->asEditor()->delete($page->getUrl()); $this->asEditor()->delete($page->getUrl());
$this->assertDatabaseMissing('pages', ['id' => $page->id]); $this->assertDatabaseMissing('pages', ['id' => $page->id]);
@ -253,8 +248,7 @@ class RecycleBinTest extends TestCase
public function test_restore_page_shows_link_to_parent_restore_if_parent_also_deleted() public function test_restore_page_shows_link_to_parent_restore_if_parent_also_deleted()
{ {
/** @var Book $book */ $book = $this->entities->bookHasChaptersAndPages();
$book = Book::query()->whereHas('pages')->whereHas('chapters')->with(['pages', 'chapters'])->firstOrFail();
$chapter = $book->chapters->first(); $chapter = $book->chapters->first();
/** @var Page $page */ /** @var Page $page */
$page = $chapter->pages->first(); $page = $chapter->pages->first();

View File

@ -27,6 +27,7 @@ use Monolog\Logger;
use Psr\Http\Client\ClientInterface; use Psr\Http\Client\ClientInterface;
use Ssddanbrown\AssertHtml\TestsHtml; use Ssddanbrown\AssertHtml\TestsHtml;
use Tests\Helpers\EntityProvider; use Tests\Helpers\EntityProvider;
use Tests\Helpers\TestServiceProvider;
abstract class TestCase extends BaseTestCase abstract class TestCase extends BaseTestCase
{ {

View File

@ -4,9 +4,6 @@ namespace Tests;
use BookStack\Http\Request; use BookStack\Http\Request;
use function request;
use function url;
class UrlTest extends TestCase class UrlTest extends TestCase
{ {
public function test_url_helper_takes_custom_url_into_account() public function test_url_helper_takes_custom_url_into_account()

View File

@ -6,7 +6,6 @@ use BookStack\Actions\ActivityType;
use BookStack\Auth\Access\UserInviteService; use BookStack\Auth\Access\UserInviteService;
use BookStack\Auth\Role; use BookStack\Auth\Role;
use BookStack\Auth\User; use BookStack\Auth\User;
use BookStack\Entities\Models\Page;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Mockery\MockInterface; use Mockery\MockInterface;

View File

@ -2,8 +2,6 @@
namespace Tests\User; namespace Tests\User;
use BookStack\Entities\Models\Bookshelf;
use BookStack\Entities\Models\Page;
use Tests\TestCase; use Tests\TestCase;
class UserPreferencesTest extends TestCase class UserPreferencesTest extends TestCase