mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-08-09 10:22:51 +03:00
Sorting: Renamed sort set to sort rule
Renamed based on feedback from Tim and Script on Discord. Also fixed flaky test
This commit is contained in:
@@ -3,14 +3,14 @@
|
||||
namespace Commands;
|
||||
|
||||
use BookStack\Entities\Models\Book;
|
||||
use BookStack\Sorting\SortSet;
|
||||
use BookStack\Sorting\SortRule;
|
||||
use Tests\TestCase;
|
||||
|
||||
class AssignSortSetCommandTest extends TestCase
|
||||
{
|
||||
public function test_no_given_sort_set_lists_options()
|
||||
{
|
||||
$sortSets = SortSet::factory()->createMany(10);
|
||||
$sortSets = SortRule::factory()->createMany(10);
|
||||
|
||||
$commandRun = $this->artisan('bookstack:assign-sort-set')
|
||||
->expectsOutputToContain('Sort set ID required!')
|
||||
@@ -37,7 +37,7 @@ class AssignSortSetCommandTest extends TestCase
|
||||
|
||||
public function test_confirmation_required()
|
||||
{
|
||||
$sortSet = SortSet::factory()->create();
|
||||
$sortSet = SortRule::factory()->create();
|
||||
|
||||
$this->artisan("bookstack:assign-sort-set {$sortSet->id} --all-books")
|
||||
->expectsConfirmation('Are you sure you want to continue?', 'no')
|
||||
@@ -49,7 +49,7 @@ class AssignSortSetCommandTest extends TestCase
|
||||
|
||||
public function test_assign_to_all_books()
|
||||
{
|
||||
$sortSet = SortSet::factory()->create();
|
||||
$sortSet = SortRule::factory()->create();
|
||||
$booksWithoutSort = Book::query()->whereNull('sort_set_id')->count();
|
||||
$this->assertGreaterThan(0, $booksWithoutSort);
|
||||
|
||||
@@ -67,9 +67,9 @@ class AssignSortSetCommandTest extends TestCase
|
||||
{
|
||||
$totalBooks = Book::query()->count();
|
||||
$book = $this->entities->book();
|
||||
$sortSetA = SortSet::factory()->create();
|
||||
$sortSetB = SortSet::factory()->create();
|
||||
$book->sort_set_id = $sortSetA->id;
|
||||
$sortSetA = SortRule::factory()->create();
|
||||
$sortSetB = SortRule::factory()->create();
|
||||
$book->sort_rule_id = $sortSetA->id;
|
||||
$book->save();
|
||||
|
||||
$booksWithoutSort = Book::query()->whereNull('sort_set_id')->count();
|
||||
@@ -88,9 +88,9 @@ class AssignSortSetCommandTest extends TestCase
|
||||
public function test_assign_to_all_books_with_sort()
|
||||
{
|
||||
$book = $this->entities->book();
|
||||
$sortSetA = SortSet::factory()->create();
|
||||
$sortSetB = SortSet::factory()->create();
|
||||
$book->sort_set_id = $sortSetA->id;
|
||||
$sortSetA = SortRule::factory()->create();
|
||||
$sortSetB = SortRule::factory()->create();
|
||||
$book->sort_rule_id = $sortSetA->id;
|
||||
$book->save();
|
||||
|
||||
$this->artisan("bookstack:assign-sort-set {$sortSetB->id} --books-with-sort={$sortSetA->id}")
|
||||
@@ -99,7 +99,7 @@ class AssignSortSetCommandTest extends TestCase
|
||||
->assertExitCode(0);
|
||||
|
||||
$book->refresh();
|
||||
$this->assertEquals($sortSetB->id, $book->sort_set_id);
|
||||
$this->assertEquals($sortSetB->id, $book->sort_rule_id);
|
||||
$this->assertEquals(1, $sortSetB->books()->count());
|
||||
}
|
||||
|
||||
|
@@ -300,7 +300,7 @@ class PageTest extends TestCase
|
||||
]);
|
||||
|
||||
$resp = $this->asAdmin()->get('/pages/recently-updated');
|
||||
$this->withHtml($resp)->assertElementContains('.entity-list .page:nth-child(1)', 'Updated 0 seconds ago by ' . $user->name);
|
||||
$this->withHtml($resp)->assertElementContains('.entity-list .page:nth-child(1) small', 'by ' . $user->name);
|
||||
}
|
||||
|
||||
public function test_recently_updated_pages_view_shows_parent_chain()
|
||||
|
@@ -5,7 +5,7 @@ namespace Sorting;
|
||||
use BookStack\Entities\Models\Chapter;
|
||||
use BookStack\Entities\Models\Page;
|
||||
use BookStack\Entities\Repos\PageRepo;
|
||||
use BookStack\Sorting\SortSet;
|
||||
use BookStack\Sorting\SortRule;
|
||||
use Tests\TestCase;
|
||||
|
||||
class BookSortTest extends TestCase
|
||||
@@ -223,13 +223,13 @@ class BookSortTest extends TestCase
|
||||
|
||||
public function test_book_sort_item_shows_auto_sort_status()
|
||||
{
|
||||
$sort = SortSet::factory()->create(['name' => 'My sort']);
|
||||
$sort = SortRule::factory()->create(['name' => 'My sort']);
|
||||
$book = $this->entities->book();
|
||||
|
||||
$resp = $this->asAdmin()->get($book->getUrl('/sort-item'));
|
||||
$this->withHtml($resp)->assertElementNotExists("span[title='Auto Sort Active: My sort']");
|
||||
|
||||
$book->sort_set_id = $sort->id;
|
||||
$book->sort_rule_id = $sort->id;
|
||||
$book->save();
|
||||
|
||||
$resp = $this->asAdmin()->get($book->getUrl('/sort-item'));
|
||||
@@ -238,7 +238,7 @@ class BookSortTest extends TestCase
|
||||
|
||||
public function test_auto_sort_options_shown_on_sort_page()
|
||||
{
|
||||
$sort = SortSet::factory()->create();
|
||||
$sort = SortRule::factory()->create();
|
||||
$book = $this->entities->book();
|
||||
$resp = $this->asAdmin()->get($book->getUrl('/sort'));
|
||||
|
||||
@@ -247,7 +247,7 @@ class BookSortTest extends TestCase
|
||||
|
||||
public function test_auto_sort_option_submit_saves_to_book()
|
||||
{
|
||||
$sort = SortSet::factory()->create();
|
||||
$sort = SortRule::factory()->create();
|
||||
$book = $this->entities->book();
|
||||
$bookPage = $book->pages()->first();
|
||||
$bookPage->priority = 10000;
|
||||
@@ -261,7 +261,7 @@ class BookSortTest extends TestCase
|
||||
$book->refresh();
|
||||
$bookPage->refresh();
|
||||
|
||||
$this->assertEquals($sort->id, $book->sort_set_id);
|
||||
$this->assertEquals($sort->id, $book->sort_rule_id);
|
||||
$this->assertNotEquals(10000, $bookPage->priority);
|
||||
|
||||
$resp = $this->get($book->getUrl('/sort'));
|
||||
|
@@ -4,26 +4,26 @@ namespace Sorting;
|
||||
|
||||
use BookStack\Activity\ActivityType;
|
||||
use BookStack\Entities\Models\Book;
|
||||
use BookStack\Sorting\SortSet;
|
||||
use BookStack\Sorting\SortRule;
|
||||
use Tests\Api\TestsApi;
|
||||
use Tests\TestCase;
|
||||
|
||||
class SortSetTest extends TestCase
|
||||
class SortRuleTest extends TestCase
|
||||
{
|
||||
use TestsApi;
|
||||
|
||||
public function test_manage_settings_permission_required()
|
||||
{
|
||||
$set = SortSet::factory()->create();
|
||||
$rule = SortRule::factory()->create();
|
||||
$user = $this->users->viewer();
|
||||
$this->actingAs($user);
|
||||
|
||||
$actions = [
|
||||
['GET', '/settings/sorting'],
|
||||
['POST', '/settings/sorting/sets'],
|
||||
['GET', "/settings/sorting/sets/{$set->id}"],
|
||||
['PUT', "/settings/sorting/sets/{$set->id}"],
|
||||
['DELETE', "/settings/sorting/sets/{$set->id}"],
|
||||
['POST', '/settings/sorting/rules'],
|
||||
['GET', "/settings/sorting/rules/{$rule->id}"],
|
||||
['PUT', "/settings/sorting/rules/{$rule->id}"],
|
||||
['DELETE', "/settings/sorting/rules/{$rule->id}"],
|
||||
];
|
||||
|
||||
foreach ($actions as [$method, $path]) {
|
||||
@@ -42,63 +42,63 @@ class SortSetTest extends TestCase
|
||||
public function test_create_flow()
|
||||
{
|
||||
$resp = $this->asAdmin()->get('/settings/sorting');
|
||||
$this->withHtml($resp)->assertLinkExists(url('/settings/sorting/sets/new'));
|
||||
$this->withHtml($resp)->assertLinkExists(url('/settings/sorting/rules/new'));
|
||||
|
||||
$resp = $this->get('/settings/sorting/sets/new');
|
||||
$this->withHtml($resp)->assertElementExists('form[action$="/settings/sorting/sets"] input[name="name"]');
|
||||
$resp = $this->get('/settings/sorting/rules/new');
|
||||
$this->withHtml($resp)->assertElementExists('form[action$="/settings/sorting/rules"] input[name="name"]');
|
||||
$resp->assertSeeText('Name - Alphabetical (Asc)');
|
||||
|
||||
$details = ['name' => 'My new sort', 'sequence' => 'name_asc'];
|
||||
$resp = $this->post('/settings/sorting/sets', $details);
|
||||
$resp = $this->post('/settings/sorting/rules', $details);
|
||||
$resp->assertRedirect('/settings/sorting');
|
||||
|
||||
$this->assertActivityExists(ActivityType::SORT_SET_CREATE);
|
||||
$this->assertDatabaseHas('sort_sets', $details);
|
||||
$this->assertActivityExists(ActivityType::SORT_RULE_CREATE);
|
||||
$this->assertDatabaseHas('sort_rules', $details);
|
||||
}
|
||||
|
||||
public function test_listing_in_settings()
|
||||
{
|
||||
$set = SortSet::factory()->create(['name' => 'My super sort set', 'sequence' => 'name_asc']);
|
||||
$rule = SortRule::factory()->create(['name' => 'My super sort rule', 'sequence' => 'name_asc']);
|
||||
$books = Book::query()->limit(5)->get();
|
||||
foreach ($books as $book) {
|
||||
$book->sort_set_id = $set->id;
|
||||
$book->sort_rule_id = $rule->id;
|
||||
$book->save();
|
||||
}
|
||||
|
||||
$resp = $this->asAdmin()->get('/settings/sorting');
|
||||
$resp->assertSeeText('My super sort set');
|
||||
$resp->assertSeeText('My super sort rule');
|
||||
$resp->assertSeeText('Name - Alphabetical (Asc)');
|
||||
$this->withHtml($resp)->assertElementContains('.item-list-row [title="Assigned to 5 Books"]', '5');
|
||||
}
|
||||
|
||||
public function test_update_flow()
|
||||
{
|
||||
$set = SortSet::factory()->create(['name' => 'My sort set to update', 'sequence' => 'name_asc']);
|
||||
$rule = SortRule::factory()->create(['name' => 'My sort rule to update', 'sequence' => 'name_asc']);
|
||||
|
||||
$resp = $this->asAdmin()->get("/settings/sorting/sets/{$set->id}");
|
||||
$resp = $this->asAdmin()->get("/settings/sorting/rules/{$rule->id}");
|
||||
$respHtml = $this->withHtml($resp);
|
||||
$respHtml->assertElementContains('.configured-option-list', 'Name - Alphabetical (Asc)');
|
||||
$respHtml->assertElementNotContains('.available-option-list', 'Name - Alphabetical (Asc)');
|
||||
|
||||
$updateData = ['name' => 'My updated sort', 'sequence' => 'name_desc,chapters_last'];
|
||||
$resp = $this->put("/settings/sorting/sets/{$set->id}", $updateData);
|
||||
$resp = $this->put("/settings/sorting/rules/{$rule->id}", $updateData);
|
||||
|
||||
$resp->assertRedirect('/settings/sorting');
|
||||
$this->assertActivityExists(ActivityType::SORT_SET_UPDATE);
|
||||
$this->assertDatabaseHas('sort_sets', $updateData);
|
||||
$this->assertActivityExists(ActivityType::SORT_RULE_UPDATE);
|
||||
$this->assertDatabaseHas('sort_rules', $updateData);
|
||||
}
|
||||
|
||||
public function test_update_triggers_resort_on_assigned_books()
|
||||
{
|
||||
$book = $this->entities->bookHasChaptersAndPages();
|
||||
$chapter = $book->chapters()->first();
|
||||
$set = SortSet::factory()->create(['name' => 'My sort set to update', 'sequence' => 'name_asc']);
|
||||
$book->sort_set_id = $set->id;
|
||||
$rule = SortRule::factory()->create(['name' => 'My sort rule to update', 'sequence' => 'name_asc']);
|
||||
$book->sort_rule_id = $rule->id;
|
||||
$book->save();
|
||||
$chapter->priority = 10000;
|
||||
$chapter->save();
|
||||
|
||||
$resp = $this->asAdmin()->put("/settings/sorting/sets/{$set->id}", ['name' => $set->name, 'sequence' => 'chapters_last']);
|
||||
$resp = $this->asAdmin()->put("/settings/sorting/rules/{$rule->id}", ['name' => $rule->name, 'sequence' => 'chapters_last']);
|
||||
$resp->assertRedirect('/settings/sorting');
|
||||
|
||||
$chapter->refresh();
|
||||
@@ -107,48 +107,48 @@ class SortSetTest extends TestCase
|
||||
|
||||
public function test_delete_flow()
|
||||
{
|
||||
$set = SortSet::factory()->create();
|
||||
$rule = SortRule::factory()->create();
|
||||
|
||||
$resp = $this->asAdmin()->get("/settings/sorting/sets/{$set->id}");
|
||||
$resp->assertSeeText('Delete Sort Set');
|
||||
$resp = $this->asAdmin()->get("/settings/sorting/rules/{$rule->id}");
|
||||
$resp->assertSeeText('Delete Sort Rule');
|
||||
|
||||
$resp = $this->delete("settings/sorting/sets/{$set->id}");
|
||||
$resp = $this->delete("settings/sorting/rules/{$rule->id}");
|
||||
$resp->assertRedirect('/settings/sorting');
|
||||
|
||||
$this->assertActivityExists(ActivityType::SORT_SET_DELETE);
|
||||
$this->assertDatabaseMissing('sort_sets', ['id' => $set->id]);
|
||||
$this->assertActivityExists(ActivityType::SORT_RULE_DELETE);
|
||||
$this->assertDatabaseMissing('sort_rules', ['id' => $rule->id]);
|
||||
}
|
||||
|
||||
public function test_delete_requires_confirmation_if_books_assigned()
|
||||
{
|
||||
$set = SortSet::factory()->create();
|
||||
$rule = SortRule::factory()->create();
|
||||
$books = Book::query()->limit(5)->get();
|
||||
foreach ($books as $book) {
|
||||
$book->sort_set_id = $set->id;
|
||||
$book->sort_rule_id = $rule->id;
|
||||
$book->save();
|
||||
}
|
||||
|
||||
$resp = $this->asAdmin()->get("/settings/sorting/sets/{$set->id}");
|
||||
$resp->assertSeeText('Delete Sort Set');
|
||||
$resp = $this->asAdmin()->get("/settings/sorting/rules/{$rule->id}");
|
||||
$resp->assertSeeText('Delete Sort Rule');
|
||||
|
||||
$resp = $this->delete("settings/sorting/sets/{$set->id}");
|
||||
$resp->assertRedirect("/settings/sorting/sets/{$set->id}#delete");
|
||||
$resp = $this->delete("settings/sorting/rules/{$rule->id}");
|
||||
$resp->assertRedirect("/settings/sorting/rules/{$rule->id}#delete");
|
||||
$resp = $this->followRedirects($resp);
|
||||
|
||||
$resp->assertSeeText('This sort set is currently used on 5 book(s). Are you sure you want to delete this?');
|
||||
$this->assertDatabaseHas('sort_sets', ['id' => $set->id]);
|
||||
$resp->assertSeeText('This sort rule is currently used on 5 book(s). Are you sure you want to delete this?');
|
||||
$this->assertDatabaseHas('sort_rules', ['id' => $rule->id]);
|
||||
|
||||
$resp = $this->delete("settings/sorting/sets/{$set->id}", ['confirm' => 'true']);
|
||||
$resp = $this->delete("settings/sorting/rules/{$rule->id}", ['confirm' => 'true']);
|
||||
$resp->assertRedirect('/settings/sorting');
|
||||
$this->assertDatabaseMissing('sort_sets', ['id' => $set->id]);
|
||||
$this->assertDatabaseMissing('books', ['sort_set_id' => $set->id]);
|
||||
$this->assertDatabaseMissing('sort_rules', ['id' => $rule->id]);
|
||||
$this->assertDatabaseMissing('books', ['sort_rule_id' => $rule->id]);
|
||||
}
|
||||
|
||||
public function test_page_create_triggers_book_sort()
|
||||
{
|
||||
$book = $this->entities->bookHasChaptersAndPages();
|
||||
$set = SortSet::factory()->create(['sequence' => 'name_asc,chapters_first']);
|
||||
$book->sort_set_id = $set->id;
|
||||
$rule = SortRule::factory()->create(['sequence' => 'name_asc,chapters_first']);
|
||||
$book->sort_rule_id = $rule->id;
|
||||
$book->save();
|
||||
|
||||
$resp = $this->actingAsApiEditor()->post("/api/pages", [
|
||||
@@ -168,8 +168,8 @@ class SortSetTest extends TestCase
|
||||
public function test_name_numeric_ordering()
|
||||
{
|
||||
$book = Book::factory()->create();
|
||||
$set = SortSet::factory()->create(['sequence' => 'name_numeric_asc']);
|
||||
$book->sort_set_id = $set->id;
|
||||
$rule = SortRule::factory()->create(['sequence' => 'name_numeric_asc']);
|
||||
$book->sort_rule_id = $rule->id;
|
||||
$book->save();
|
||||
$this->permissions->regenerateForEntity($book);
|
||||
|
Reference in New Issue
Block a user