diff --git a/lib/classes/JsonApi/Routes/Courseware/BookmarkedStructuralElementsIndex.php b/lib/classes/JsonApi/Routes/Courseware/BookmarkedStructuralElementsIndex.php index c715d395d36d714d38e1e17e59cd22feaca3b9b2..a9b3c094d3e9a220f3bd81981c17da5cfc049075 100755 --- a/lib/classes/JsonApi/Routes/Courseware/BookmarkedStructuralElementsIndex.php +++ b/lib/classes/JsonApi/Routes/Courseware/BookmarkedStructuralElementsIndex.php @@ -17,6 +17,7 @@ class BookmarkedStructuralElementsIndex extends JsonApiController protected $allowedIncludePaths = [ 'ancestors', + 'children', 'containers', 'containers.blocks', 'containers.blocks.edit-blocker', diff --git a/lib/classes/JsonApi/Routes/Courseware/StructuralElementsIndex.php b/lib/classes/JsonApi/Routes/Courseware/StructuralElementsIndex.php index 73795fe96a0d39c6ad8c0acc62d784c5057528ed..ace8b18f17c96196c872d3d087b2a6e0d00881ee 100755 --- a/lib/classes/JsonApi/Routes/Courseware/StructuralElementsIndex.php +++ b/lib/classes/JsonApi/Routes/Courseware/StructuralElementsIndex.php @@ -17,6 +17,7 @@ class StructuralElementsIndex extends JsonApiController protected $allowedIncludePaths = [ 'ancestors', + 'children', 'containers', 'containers.blocks', 'containers.blocks.edit-blocker', diff --git a/lib/classes/JsonApi/Routes/Courseware/StructuralElementsShow.php b/lib/classes/JsonApi/Routes/Courseware/StructuralElementsShow.php index 9589dd386185ae1dc634e7c52b0626e411291940..1c527e45712eaffd93ab39963b4b3250e441fc2d 100755 --- a/lib/classes/JsonApi/Routes/Courseware/StructuralElementsShow.php +++ b/lib/classes/JsonApi/Routes/Courseware/StructuralElementsShow.php @@ -17,6 +17,7 @@ class StructuralElementsShow extends JsonApiController { protected $allowedIncludePaths = [ 'ancestors', + 'children', 'containers', 'containers.blocks', 'containers.blocks.edit-blocker', diff --git a/lib/classes/JsonApi/Schemas/Courseware/StructuralElement.php b/lib/classes/JsonApi/Schemas/Courseware/StructuralElement.php index af09f009439b43f47b6a369e6294ba84d9c2d477..15c5ee2427dcdd027b2cd7c4c5511263b2e6737f 100755 --- a/lib/classes/JsonApi/Schemas/Courseware/StructuralElement.php +++ b/lib/classes/JsonApi/Schemas/Courseware/StructuralElement.php @@ -158,8 +158,7 @@ class StructuralElement extends SchemaProvider if ($includeData) { $user = $this->currentUser; - $relation[self::RELATIONSHIP_DATA] = array_filter( - $resource->children, + $relation[self::RELATIONSHIP_DATA] = $resource->children->filter( function ($child) use ($user) { return $child->canRead($user); } diff --git a/tests/jsonapi/StructuralElementsShowTest.php b/tests/jsonapi/StructuralElementsShowTest.php new file mode 100644 index 0000000000000000000000000000000000000000..231a4495f4c47896bb6e663e37ad76b2443733a0 --- /dev/null +++ b/tests/jsonapi/StructuralElementsShowTest.php @@ -0,0 +1,105 @@ +<?php + +use Courseware\Instance; +use Courseware\StructuralElement; +use JsonApi\Routes\Courseware\StructuralElementsShow; +use JsonApi\Schemas\Courseware\StructuralElement as Schema; +use WoohooLabs\Yang\JsonApi\Response\JsonApiResponse; + +class StructuralElementsShowTest extends \Codeception\Test\Unit +{ + /** + * @var \JsonapiTester + */ + protected $tester; + + protected function _before() + { + \DBManager::getInstance()->setConnection('studip', $this->getModule('\\Helper\\StudipDb')->dbh); + } + + protected function _after() + { + } + + // tests + public function testShouldShowStructuralElement() + { + $credentials = $this->tester->getCredentialsForTestAutor(); + $structuralElement = $this->createCourseware($credentials, 5); + + $response = $this->fetchStructuralElement($credentials, $structuralElement); + $this->assertTrue($response->isSuccessfulDocument([200])); + + $document = $response->document(); + $this->assertSame($structuralElement->id, $document->primaryResource()->id()); + $this->assertFalse($document->hasAnyIncludedResources()); + } + + public function testShouldIncludeChildren() + { + $credentials = $this->tester->getCredentialsForTestAutor(); + $structuralElement = $this->createCourseware($credentials, 5); + + $response = $this->fetchStructuralElement($credentials, $structuralElement, ['include' => 'children']); + $this->assertTrue($response->isSuccessfulDocument([200])); + + $document = $response->document(); + $this->assertSame($structuralElement->id, $document->primaryResource()->id()); + $this->assertTrue($document->hasAnyIncludedResources()); + + $includedResources = $document->includedResources(); + $childIDs = $structuralElement->children->pluck('id'); + $this->assertCount(count($childIDs), $includedResources); + foreach ($includedResources as $included) { + $this->assertContains($included->id(), $childIDs); + } + } + + // **** helper functions **** + private function createCourseware(iterable $credentials, int $numberOfChildren): StructuralElement + { + $instance = StructuralElement::createEmptyCourseware($credentials['id'], 'user'); + $root = $instance->getRoot(); + + for ($i = 0; $i < $numberOfChildren; $i++) { + $child = StructuralElement::build([ + 'range_id' => $root['range_id'], + 'range_type' => $root['range_type'], + 'owner_id' => $root['owner_id'], + 'editor_id' => $root['editor_id'], + 'title' => _('neue Seite'), + ]); + + $root->children[] = $child; + } + + $root->store(); + + return $root; + } + + private function fetchStructuralElement( + iterable $credentials, + StructuralElement $resource, + iterable $options = [] + ): JsonApiResponse { + $app = $this->tester->createApp( + $credentials, + 'get', + '/courseware-structural-elements/{id}', + StructuralElementsShow::class + ); + + $requestBuilder = $this->tester + ->createRequestBuilder($credentials) + ->setUri('/courseware-structural-elements/' . $resource->id) + ->fetch(); + + if (array_key_exists('include', $options)) { + $requestBuilder->setJsonApiIncludes($options['include']); + } + + return $this->tester->sendMockRequest($app, $requestBuilder->getRequest()); + } +}