+
+ public function test_all_endpoint_includes_book_and_chapter_titles_when_requested()
+ {
+ $this->actingAsApiEditor();
+
+ $book = $this->entities->book();
+ $chapter = $this->entities->chapter();
+ $page = $this->entities->newPage();
+
+ $book->name = 'My Test Book';
+ $book->save();
+
+ $chapter->name = 'My Test Chapter';
+ $chapter->book_id = $book->id;
+ $chapter->save();
+
+ $page->name = 'My Test Page With UniqueSearchTerm';
+ $page->book_id = $book->id;
+ $page->chapter_id = $chapter->id;
+ $page->save();
+
+ $page->indexForSearch();
+
+ // Test without include parameter
+ $resp = $this->getJson($this->baseEndpoint . '?query=UniqueSearchTerm');
+ $resp->assertOk();
+ $resp->assertDontSee('book_title');
+ $resp->assertDontSee('chapter_title');
+
+ // Test with include parameter
+ $resp = $this->getJson($this->baseEndpoint . '?query=UniqueSearchTerm&include=titles');
+ $resp->assertOk();
+ $resp->assertJsonFragment([
+ 'name' => 'My Test Page With UniqueSearchTerm',
+ 'book_title' => 'My Test Book',
+ 'chapter_title' => 'My Test Chapter',
+ 'type' => 'page'
+ ]);
+ }
+
+ public function test_all_endpoint_validates_include_parameter()
+ {
+ $this->actingAsApiEditor();
+
+ // Test invalid include value
+ $resp = $this->getJson($this->baseEndpoint . '?query=test&include=invalid');
+ $resp->assertOk();
+ $resp->assertDontSee('book_title');
+
+ // Test SQL injection attempt
+ $resp = $this->getJson($this->baseEndpoint . '?query=test&include=titles;DROP TABLE users');
+ $resp->assertStatus(422);
+
+ // Test multiple includes
+ $resp = $this->getJson($this->baseEndpoint . '?query=test&include=titles,tags');
+ $resp->assertOk();
+ }
+
+ public function test_all_endpoint_includes_tags_when_requested()
+ {
+ $this->actingAsApiEditor();
+
+ // Create a page and give it a unique name for search
+ $page = $this->entities->page();
+ $page->name = 'Page With UniqueSearchTerm';
+ $page->save();
+
+ // Save tags to the page using the existing saveTagsToEntity method
+ $tags = [
+ ['name' => 'SampleTag', 'value' => 'SampleValue']
+ ];
+ app(\BookStack\Activity\TagRepo::class)->saveTagsToEntity($page, $tags);
+
+ // Ensure the page is indexed for search
+ $page->indexForSearch();
+
+ // Test without the "tags" include
+ $resp = $this->getJson($this->baseEndpoint . '?query=UniqueSearchTerm');
+ $resp->assertOk();
+ $resp->assertDontSee('tags');
+
+ // Test with the "tags" include
+ $resp = $this->getJson($this->baseEndpoint . '?query=UniqueSearchTerm&include=tags');
+ $resp->assertOk();
+
+ // Assert that tags are included in the response
+ $resp->assertJsonFragment([
+ 'name' => 'SampleTag',
+ 'value' => 'SampleValue',
+ ]);
+
+ // Optionally: check the structure to match the tag order as well
+ $resp->assertJsonStructure([
+ 'data' => [
+ '*' => [
+ 'tags' => [
+ '*' => [
+ 'name',
+ 'value',
+ 'order',
+ ],
+ ],
+ ],
+ ],
+ ]);
+ }
+
+