]> BookStack Code Mirror - bookstack/commitdiff
Added test & update to prevent page creation w/ empty slug
authorDan Brown <redacted>
Thu, 1 Sep 2022 11:53:34 +0000 (12:53 +0100)
committerDan Brown <redacted>
Thu, 1 Sep 2022 11:53:34 +0000 (12:53 +0100)
Caused by changes to page repo in reference work,
This adds back in the slug generate although at a more central place.
Adds a test case to cover the problematic scenario.

app/Entities/Repos/BaseRepo.php
tests/Entity/PageDraftTest.php

index cfde7fe1c578eb6876b1e77237c86e74bb584493..747d1b17644cbf0846f8176b622c62338bd79fc5 100644 (file)
@@ -56,7 +56,7 @@ class BaseRepo
         $entity->fill($input);
         $entity->updated_by = user()->id;
 
-        if ($entity->isDirty('name')) {
+        if ($entity->isDirty('name') || empty($entity->slug)) {
             $entity->refreshSlug();
         }
 
index 0b44e5f0b8eaa7d252619c5c886f241c9d02903a..6fd9a7f7017ebd13a13a68413ecb8e3563cf8bc1 100644 (file)
@@ -204,4 +204,32 @@ class PageDraftTest extends TestCase
         $draft->refresh();
         $this->assertStringContainsString('href="https://example.com"', $draft->html);
     }
+
+    public function test_slug_generated_on_draft_publish_to_page_when_no_name_change()
+    {
+        /** @var Book $book */
+        $book = Book::query()->first();
+        $this->asEditor()->get($book->getUrl('/create-page'));
+        /** @var Page $draft */
+        $draft = Page::query()->where('draft', '=', true)->where('book_id', '=', $book->id)->firstOrFail();
+
+        $this->put('/ajax/page/' . $draft->id . '/save-draft', [
+            'name'     => 'My page',
+            'markdown' => "Update test",
+        ])->assertOk();
+
+        $draft->refresh();
+        $this->assertEmpty($draft->slug);
+
+        $this->post($draft->getUrl(), [
+            'name'     => 'My page',
+            'markdown' => "# My markdown page"
+        ]);
+
+        $this->assertDatabaseHas('pages', [
+            'id'    => $draft->id,
+            'draft' => false,
+            'slug'  => 'my-page',
+        ]);
+    }
 }