From dbc6e37545052d43f4de5977ea49aa8e13a85a81 Mon Sep 17 00:00:00 2001 From: Bertrand Dunogier Date: Sun, 24 Jul 2016 20:21:52 +0200 Subject: [PATCH 01/14] EZP-26033: REST embedding specification --- .../proposed/rest_resource_embedding.md | 185 ++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 doc/specifications/proposed/rest_resource_embedding.md diff --git a/doc/specifications/proposed/rest_resource_embedding.md b/doc/specifications/proposed/rest_resource_embedding.md new file mode 100644 index 00000000000..677c732ebc7 --- /dev/null +++ b/doc/specifications/proposed/rest_resource_embedding.md @@ -0,0 +1,185 @@ +# REST resource embedding + +Rest embedding allows an API consumer to request references from the +response to be embedded, in order to avoid extra REST calls. + +## Example + +A location response contains a reference to the content item's main location: + +``` +curl -X GET http://localhost:8000/api/ezp/v2/content/objects/1 +``` + +```xml + + + + eZ Platform + + +
+ + + + 2015-11-30T13:10:46+00:00 + 2015-11-30T13:10:46+00:00 + eng-GB + 9 + true + + +``` + +By adding an `X-eZ-Embed-Value` header to the request, we can get the +main location object embedded into the response: + +``` +curl -X GET http://localhost:8000/api/ezp/v2/content/objects/1 -H 'x-ez-embed-value: Content.MainLocation' +``` + +```xml + + + + eZ Platform + + +
+ + 2 + 0 + false + false + + /1/2/ + 1 + 8 + f3e90596361e31d496d4026eb624c983 + + + PRIORITY + ASC + + + + + + 2015-11-30T13:10:46+00:00 + 2015-11-30T13:10:46+00:00 + eng-GB + 9 + true + + +``` + +### The `X-eZ-Embed-Value` request header + +Which resources must be embedded is specified using this request header. +It accepts several resources separated by commas: + +`X-eZ-Embed-Value: Content.MainLocation,Content.Owner.Groups` + +A resource is referenced by its "path" from the root of the response. +Resources from an embedded resource can also be embedded: + +- `Content.MainLocation` +- `Content.ContentType` +- `Content.Owner.Groups` + +### Permissions +If the user doesn't have the required permissions to load an embedded +object, the response will be untouched, and no error will be thrown. + +### HTTP Caching +Responses will vary based on the embedded responses. + +Thanks to HTTP cache multi-tagging, customized responses will expire as +expected: each embedded object will tag the response with the HTTP cache +tags it requires. + +### Implementation + +#### Resource links generation in value object visitors +Value object visitors don't use the router directly anymore to generate +links to resources. Instead, they build and visit a `ResourceRouteReference` +object with the name of the route and the route's parameters: + +```php +class LocationValueObjectVisitor extends ValueObjectVisitor +{ + public function visit($generator, $visitor, $location) + { + // ... + + $generator->startObjectElement$generator->startObjectElement('Content'); + $visitor->visitValueObject( + new ResourceRouteReference( + 'ezpublish_rest_loadContent', + ['contentId' => $location->contentInfo->contentId] + ); + $generator->endObjectElement('Content'); + } +} +``` + +#### The `ResourceRouteReference` value object visitor +This object's visitor extends the `RestResourceLink` visitor. + +It uses the router to generate a link based on the `RestResourceLink` +properties, and invokes the parent's `visit()` method. + +#### The `RestResourceLink` value object visitor +It first generate an `href` attribute, respecting the REST output that +existed before this feature. + +It then uses a `PathExpansionChecker` to test if the current generator path, +returned by the `Generator::getStackPath()` method, is requested for expansion. +A `RequestHeaderPathExpansionChecker` uses the request to test if expansion +is needed. + +If it is, a `ValueReferenceLoader` loads the referenced +value object. The returned value object it is visited and added to generated +output, inside the current object element. + +#### The `ExpansionGenerator` +The `RestResourceLink` visitor passes an `ExpansionGenerator` when visiting +the loaded value object. + +This OutputGenerator decorates the actual (XML or JSON) generator. It will +skip the first objectElement and its attributes generated for the embedded +object, in order to avoid duplicate nodes. In the example above, the `LocationList` +object is skipped: + +``` + + + + + + + + + + +``` + +### Loading of references +References are loaded by the `ControllerUriValueLoader`. Given a REST +resource URI (`/api/ezp/v2/content/objects/1`), it will determine and call +the REST controller action for that URI. + +This implementation ensures that any REST resource that has a controller +can be embedded without requiring any extra development. + +Resources that have multiple representations, such as Content/ContentInfo, +will use the optional media-type from the RestResourceReference to embed +the expected representation. + +### HTTP caching +- Requires HTTP cache multi-tagging +- Response must vary on `x-ez-embed-value` +- Response must be tagged with all of the included items + Since the controllers are used to expand objects, the required cache + headers should be included automatically (to check) From 9a219f548af29d724f85b6f45079bf94395d09b9 Mon Sep 17 00:00:00 2001 From: Bertrand Dunogier Date: Thu, 1 Sep 2016 23:30:35 +0200 Subject: [PATCH 02/14] EZP-26033: Added getStackPath() method to the Output Generator --- .../Core/REST/Common/Output/Generator.php | 27 ++++++++++++ .../Common/Tests/Output/GeneratorTest.php | 44 +++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/eZ/Publish/Core/REST/Common/Output/Generator.php b/eZ/Publish/Core/REST/Common/Output/Generator.php index 81a59c15485..cceabffa48e 100644 --- a/eZ/Publish/Core/REST/Common/Output/Generator.php +++ b/eZ/Publish/Core/REST/Common/Output/Generator.php @@ -396,4 +396,31 @@ protected function checkEnd($type, $data) * @return mixed */ abstract public function serializeBool($boolValue); + + /** + * Returns a string representation of the current stack of the document. + * + * Example: "Location.ContentInfo'. + * Elements of type 'attribute', 'document' and 'list' are ignored. + * + * @return string + */ + public function getStackPath() + { + $relevantNodes = array_filter( + $this->stack, + function ($value) { + return !in_array($value[0], ['attribute', 'document', 'list']); + } + ); + + $names = array_map( + function ($value) { + return $value[1]; + }, + $relevantNodes + ); + + return implode('.', $names); + } } diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/GeneratorTest.php b/eZ/Publish/Core/REST/Common/Tests/Output/GeneratorTest.php index 72311663f91..dce1017886c 100644 --- a/eZ/Publish/Core/REST/Common/Tests/Output/GeneratorTest.php +++ b/eZ/Publish/Core/REST/Common/Tests/Output/GeneratorTest.php @@ -201,4 +201,48 @@ public function testNonEmptyDocument() $this->assertFalse($generator->isEmpty()); } + + public function testGetDocumentStackPath() + { + $generator = $this->getGenerator(); + + $generator->startDocument('test'); + + self::assertEquals('', $generator->getStackPath()); + } + + public function testGetRootStackPath() + { + $generator = $this->getGenerator(); + + $generator->startDocument('test'); + $generator->startObjectElement('element'); + + self::assertEquals('element', $generator->getStackPath()); + } + + public function testGetElementStackPath() + { + $generator = $this->getGenerator(); + + $generator->startDocument('test'); + $generator->startObjectElement('element'); + $generator->startObjectElement('subElement'); + + self::assertEquals('element.subElement', $generator->getStackPath()); + } + + public function testGetListChildrenStackPath() + { + $generator = $this->getGenerator(); + + $generator->startDocument('test'); + $generator->startObjectElement('listOfElements'); + $generator->startList('listOfElements'); + $generator->startObjectElement('child'); + $generator->startAttribute('href', 'http://google.com'); + $generator->endAttribute('href'); + + self::assertEquals('listOfElements.child', $generator->getStackPath()); + } } From 4b1511588fcb250e14172a02e82c62e701d8c05d Mon Sep 17 00:00:00 2001 From: Bertrand Dunogier Date: Thu, 1 Sep 2016 23:32:19 +0200 Subject: [PATCH 03/14] EZP-26033: Added ControllerUriValueLoader Based on a value object's REST URI, loads a value object using the controller action for this URI. --- .../Resources/config/services.yml | 6 ++ .../ControllerUriValueLoaderTest.php | 100 ++++++++++++++++++ .../ValueLoaders/ControllerUriValueLoader.php | 56 ++++++++++ .../Server/ValueLoaders/UriValueLoader.php | 19 ++++ 4 files changed, 181 insertions(+) create mode 100644 eZ/Publish/Core/REST/Server/Tests/ValueLoaders/ControllerUriValueLoaderTest.php create mode 100644 eZ/Publish/Core/REST/Server/ValueLoaders/ControllerUriValueLoader.php create mode 100644 eZ/Publish/Core/REST/Server/ValueLoaders/UriValueLoader.php diff --git a/eZ/Bundle/EzPublishRestBundle/Resources/config/services.yml b/eZ/Bundle/EzPublishRestBundle/Resources/config/services.yml index 53ace6f9069..872d72337d8 100644 --- a/eZ/Bundle/EzPublishRestBundle/Resources/config/services.yml +++ b/eZ/Bundle/EzPublishRestBundle/Resources/config/services.yml @@ -403,3 +403,9 @@ services: parent: hautelook.router.template calls: - [ setOption, [ strict_requirements, ~ ] ] + + ezpublish_rest.controller_uri_value_loader: + class: eZ\Publish\Core\REST\Server\ValueLoaders\ControllerUriValueLoader + arguments: + - '@router' + - '@controller_resolver' diff --git a/eZ/Publish/Core/REST/Server/Tests/ValueLoaders/ControllerUriValueLoaderTest.php b/eZ/Publish/Core/REST/Server/Tests/ValueLoaders/ControllerUriValueLoaderTest.php new file mode 100644 index 00000000000..53223272114 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/ValueLoaders/ControllerUriValueLoaderTest.php @@ -0,0 +1,100 @@ +loader = new ControllerUriValueLoader( + $this->routerMock = $this->getMock('Symfony\Component\Routing\RouterInterface'), + $this->controllerResolverMock = $this->getMock('Symfony\Component\HttpKernel\Controller\ControllerResolverInterface') + ); + } + + /** + * Covers the normal behaviour of the load method. + */ + public function testLoad() + { + $controllerArray = ['_controller' => 'some:controller', 'id' => 1]; + + $valueObject = new \stdClass(); + + $this->routerMock + ->expects($this->once()) + ->method('match') + ->with('/api/ezp/v2/resource/1') + ->will($this->returnValue($controllerArray)); + + $this->controllerResolverMock + ->expects($this->once()) + ->method('getController') + ->will($this->returnValue( + function () use ($valueObject) { return $valueObject; } + )); + + $this->controllerResolverMock + ->expects($this->once()) + ->method('getArguments') + ->will($this->returnValue(['id' => 1])); + + self::assertSame( + $valueObject, + $this->loader->load('/api/ezp/v2/resource/1') + ); + } + + /** + * @expectedException \UnexpectedValueException + * @expectedExceptionMessage Expected the controller to return a Value object, got a Response instead + */ + public function testLoadReturnsResponse() + { + $controllerArray = ['_controller' => 'some:controller', 'id' => 1]; + + $valueObject = new Response(); + + $this->routerMock + ->expects($this->once()) + ->method('match') + ->with('/api/ezp/v2/resource/1') + ->will($this->returnValue($controllerArray)); + + $this->controllerResolverMock + ->expects($this->once()) + ->method('getController') + ->will($this->returnValue( + function () use ($valueObject) { return $valueObject; } + )); + + $this->controllerResolverMock + ->expects($this->once()) + ->method('getArguments') + ->will($this->returnValue(['id' => 1])); + + $this->loader->load('/api/ezp/v2/resource/1'); + } +} diff --git a/eZ/Publish/Core/REST/Server/ValueLoaders/ControllerUriValueLoader.php b/eZ/Publish/Core/REST/Server/ValueLoaders/ControllerUriValueLoader.php new file mode 100644 index 00000000000..dee728d9fe0 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/ValueLoaders/ControllerUriValueLoader.php @@ -0,0 +1,56 @@ +router = $router; + $this->controllerResolver = $controllerResolver; + } + + public function load($restResourceLink) + { + $request = Request::create($restResourceLink); + $request->attributes->add($this->router->match($restResourceLink)); + + $controller = $this->controllerResolver->getController($request); + $arguments = $this->controllerResolver->getArguments($request, $controller); + + $value = call_user_func_array($controller, $arguments); + + if ($value instanceof Response) { + throw new UnexpectedValueException('Expected the controller to return a Value object, got a Response instead'); + } + + return $value; + } +} diff --git a/eZ/Publish/Core/REST/Server/ValueLoaders/UriValueLoader.php b/eZ/Publish/Core/REST/Server/ValueLoaders/UriValueLoader.php new file mode 100644 index 00000000000..ea08bb9990a --- /dev/null +++ b/eZ/Publish/Core/REST/Server/ValueLoaders/UriValueLoader.php @@ -0,0 +1,19 @@ + Date: Thu, 1 Sep 2016 23:33:48 +0200 Subject: [PATCH 04/14] EZP-26033: Added REST RestResourceHref VO with Visitor Used by ValueObjectVisitors to generate a link to a ValueObject. The visitor may expand the link to a full featured object. --- .../Resources/config/services.yml | 1 + .../config/value_object_visitors.yml | 20 +++++++ .../ValueObjectVisitor/ResourceLink.php | 52 +++++++++++++++++++ .../ResourceRouteReference.php | 32 ++++++++++++ .../Core/REST/Server/Values/ResourceLink.php | 29 +++++++++++ .../Server/Values/ResourceRouteReference.php | 33 ++++++++++++ 6 files changed, 167 insertions(+) create mode 100644 eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php create mode 100644 eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceRouteReference.php create mode 100644 eZ/Publish/Core/REST/Server/Values/ResourceLink.php create mode 100644 eZ/Publish/Core/REST/Server/Values/ResourceRouteReference.php diff --git a/eZ/Bundle/EzPublishRestBundle/Resources/config/services.yml b/eZ/Bundle/EzPublishRestBundle/Resources/config/services.yml index 872d72337d8..abed3fd9d96 100644 --- a/eZ/Bundle/EzPublishRestBundle/Resources/config/services.yml +++ b/eZ/Bundle/EzPublishRestBundle/Resources/config/services.yml @@ -335,6 +335,7 @@ services: arguments: - "@ezpublish_rest.output.generator.json" - "@ezpublish_rest.output.value_object_visitor.dispatcher" + - "@router" tags: - { name: ezpublish_rest.output.visitor, regexps: ezpublish_rest.output.visitor.json.regexps } diff --git a/eZ/Bundle/EzPublishRestBundle/Resources/config/value_object_visitors.yml b/eZ/Bundle/EzPublishRestBundle/Resources/config/value_object_visitors.yml index 44862ff0ed5..c192577408d 100644 --- a/eZ/Bundle/EzPublishRestBundle/Resources/config/value_object_visitors.yml +++ b/eZ/Bundle/EzPublishRestBundle/Resources/config/value_object_visitors.yml @@ -859,3 +859,23 @@ services: class: "%ezpublish_rest.output.value_object_visitor.ViewInput.class%" tags: - { name: ezpublish_rest.output.value_object_visitor, type: eZ\Publish\Core\REST\Client\Values\ViewInput } + + ezpublish_rest.output.value_object_visitor.internal.resource_link: + parent: ezpublish_rest.output.value_object_visitor.base + class: 'eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\ResourceLink' + tags: + - { name: ezpublish_rest.output.value_object_visitor, type: 'eZ\Publish\Core\REST\Server\Values\ResourceLink' } + arguments: + - '@ezpublish_rest.controller_uri_value_loader' + calls: + - [setRequestStack, ['@request_stack']] + + ezpublish_rest.output.value_object_visitor.internal.resource_route_reference: + parent: ezpublish_rest.output.value_object_visitor.base + class: 'eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\ResourceRouteReference' + tags: + - { name: ezpublish_rest.output.value_object_visitor, type: 'eZ\Publish\Core\REST\Server\Values\ResourceRouteReference' } + arguments: + - '@ezpublish_rest.controller_uri_value_loader' + calls: + - [setRequestStack, ['@request_stack']] diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php new file mode 100644 index 00000000000..47be988671a --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php @@ -0,0 +1,52 @@ +valueLoader = $valueLoader; + } + + /** + * @param Visitor $visitor + * @param Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\ResourceLink $data + */ + public function visit(Visitor $visitor, Generator $generator, $data) + { + $request = $this->getRequestStack()->getMasterRequest(); + $expandedPathList = []; + if ($request->headers->has('x-ez-embed-value')) { + $expandedPathList = explode(',', $request->headers->get('x-ez-embed-value')); + } + + $generator->startAttribute('href', $data->link); + $generator->endAttribute('href'); + + if (in_array($generator->getStackPath(), $expandedPathList)) { + try { + $visitor->visitValueObject($this->valueLoader->load($data->link)); + } catch (ApiUnauthorizedException $e) { + } + } + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceRouteReference.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceRouteReference.php new file mode 100644 index 00000000000..ccf34670775 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceRouteReference.php @@ -0,0 +1,32 @@ +router->generate( + $data->route, + $data->loadParameters + ) + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/ResourceLink.php b/eZ/Publish/Core/REST/Server/Values/ResourceLink.php new file mode 100644 index 00000000000..718f5848bd2 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/ResourceLink.php @@ -0,0 +1,29 @@ +link = $link; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/ResourceRouteReference.php b/eZ/Publish/Core/REST/Server/Values/ResourceRouteReference.php new file mode 100644 index 00000000000..b8e95531946 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/ResourceRouteReference.php @@ -0,0 +1,33 @@ +route = $route; + $this->loadParameters = $loadParameters; + } +} From 902a4433913479245f417279fbd63bb562f0ccde Mon Sep 17 00:00:00 2001 From: Bertrand Dunogier Date: Thu, 1 Sep 2016 23:35:59 +0200 Subject: [PATCH 05/14] EZP-26033: use RestResourceReference in visitors --- .../ContentObjectStates.php | 11 +- .../Output/ValueObjectVisitorBaseTest.php | 20 ++ .../ValueObjectVisitor/ContentTypeGroup.php | 35 ++- .../ContentTypeGroupRefList.php | 12 +- .../Output/ValueObjectVisitor/Location.php | 58 ++--- .../ValueObjectVisitor/LocationList.php | 9 +- .../ValueObjectVisitor/ObjectStateGroup.php | 12 +- .../Output/ValueObjectVisitor/RestContent.php | 99 ++++---- .../ValueObjectVisitor/RestContentType.php | 33 ++- .../ValueObjectVisitor/RestExecutedView.php | 10 +- .../ValueObjectVisitor/RestLocation.php | 66 +++--- .../ValueObjectVisitor/RestObjectState.php | 10 +- .../ValueObjectVisitor/RestRelation.php | 21 +- .../ValueObjectVisitor/RestTrashItem.php | 28 +-- .../Output/ValueObjectVisitor/RestUser.php | 84 ++++--- .../ValueObjectVisitor/RestUserGroup.php | 110 ++++----- .../RestUserGroupRoleAssignment.php | 10 +- .../RestUserRoleAssignment.php | 7 +- .../Server/Output/ValueObjectVisitor/Role.php | 7 +- .../Output/ValueObjectVisitor/URLAlias.php | 7 +- .../ValueObjectVisitor/UserGroupRefList.php | 21 +- .../Output/ValueObjectVisitor/UserRefList.php | 8 +- .../Output/ValueObjectVisitor/UserSession.php | 7 +- .../Output/ValueObjectVisitor/VersionInfo.php | 14 +- .../PathExpansion/ExpansionGeneratorTest.php | 213 ++++++++++++++++++ .../ContentTypeGroupRefListTest.php | 46 +--- .../ContentTypeGroupTest.php | 96 +------- .../ObjectStateGroupTest.php | 9 +- .../ValueObjectVisitor/RestContentTest.php | 184 ++------------- .../RestContentTypeTest.php | 83 +------ .../RestExecutedViewTest.php | 10 +- .../RestLocationRootNodeTest.php | 34 +-- .../ValueObjectVisitor/RestLocationTest.php | 52 +---- .../RestObjectStateTest.php | 11 +- .../ValueObjectVisitor/RestRelationTest.php | 18 +- .../ValueObjectVisitor/RestTrashItemTest.php | 33 +-- .../RestUserGroupRoleAssignmentTest.php | 10 +- .../ValueObjectVisitor/RestUserGroupTest.php | 184 ++------------- .../RestUserRoleAssignmentTest.php | 11 +- .../ValueObjectVisitor/RestUserTest.php | 142 ++---------- .../Output/ValueObjectVisitor/RoleTest.php | 7 +- .../UserGroupRefListTest.php | 80 +------ .../ValueObjectVisitor/UserRefListTest.php | 19 +- .../UserSessionCreatedTest.php | 8 +- .../ValueObjectVisitor/UserSessionTest.php | 9 +- .../ValueObjectVisitor/VersionInfoTest.php | 17 +- 46 files changed, 689 insertions(+), 1286 deletions(-) create mode 100644 eZ/Publish/Core/REST/Server/Tests/Output/PathExpansion/ExpansionGeneratorTest.php diff --git a/eZ/Publish/Core/REST/Common/Output/ValueObjectVisitor/ContentObjectStates.php b/eZ/Publish/Core/REST/Common/Output/ValueObjectVisitor/ContentObjectStates.php index 2ec49459160..11956d4e0f9 100644 --- a/eZ/Publish/Core/REST/Common/Output/ValueObjectVisitor/ContentObjectStates.php +++ b/eZ/Publish/Core/REST/Common/Output/ValueObjectVisitor/ContentObjectStates.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; /** * ContentObjectStates value object visitor. @@ -36,17 +37,15 @@ public function visit(Visitor $visitor, Generator $generator, $data) foreach ($data->states as $state) { $generator->startObjectElement('ObjectState'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_loadObjectState', - array( + [ 'objectStateGroupId' => $state->groupId, 'objectStateId' => $state->objectState->id, - ) + ] ) ); - $generator->endAttribute('href'); $generator->endObjectElement('ObjectState'); } diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/ValueObjectVisitorBaseTest.php b/eZ/Publish/Core/REST/Common/Tests/Output/ValueObjectVisitorBaseTest.php index 914045fb065..118b7ddd83a 100644 --- a/eZ/Publish/Core/REST/Common/Tests/Output/ValueObjectVisitorBaseTest.php +++ b/eZ/Publish/Core/REST/Common/Tests/Output/ValueObjectVisitorBaseTest.php @@ -194,6 +194,26 @@ protected function addRouteExpectation($routeName, $arguments, $returnValue) ->will($this->returnValue($returnValue)); } + /** + * Adds the expectated value object visit calls sequence. + * + * @param array $valueObjects Array of visited value object, or of phpunit matcher ($this->instanceOf(), etc...) . + */ + protected function setVisitValueObjectExpectations(array $valueObjects) + { + $consecutiveCalls = []; + foreach ($valueObjects as $valueObject) { + $consecutiveCalls = [ + $valueObject, + $this->getGenerator(), + $this->getVisitorMock(), + ]; + } + + $mocker = $this->getVisitorMock()->expects($this->any())->method('visitValueObject'); + call_user_func_array([$mocker, 'withConsecutive'], $consecutiveCalls); + } + /** * @return \Symfony\Component\Routing\RouterInterface|\PHPUnit_Framework_MockObject_MockObject */ diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeGroup.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeGroup.php index d80d6b3cf27..86038c12ff5 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeGroup.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeGroup.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; /** * ContentTypeGroup value object visitor. @@ -34,10 +35,7 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->startAttribute( 'href', - $this->router->generate( - 'ezpublish_rest_loadContentTypeGroup', - array('contentTypeGroupId' => $data->id) - ) + $this->router->generate('ezpublish_rest_loadContentTypeGroup', ['contentTypeGroupId' => $data->id]) ); $generator->endAttribute('href'); @@ -54,30 +52,31 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->endValueElement('modified'); $generator->startObjectElement('Creator', 'User'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadUser', array('userId' => $data->creatorId)) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadUser', ['userId' => $data->creatorId]), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('Creator'); $generator->startObjectElement('Modifier', 'User'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadUser', array('userId' => $data->modifierId)) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadUser', ['userId' => $data->modifierId]), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('Modifier'); $generator->startObjectElement('ContentTypes', 'ContentTypeInfoList'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_listContentTypesForGroup', - array('contentTypeGroupId' => $data->id) - ) + ['contentTypeGroupId' => $data->id], + 'ContentTypeInfoList' + ), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('ContentTypes'); $generator->endObjectElement('ContentTypeGroup'); diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeGroupRefList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeGroupRefList.php index 4539033a1d1..275f473de17 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeGroupRefList.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeGroupRefList.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; /** * ContentTypeGroupRefList value object visitor. @@ -48,16 +49,9 @@ public function visit(Visitor $visitor, Generator $generator, $data) foreach ($data->contentTypeGroups as $contentTypeGroup) { $generator->startObjectElement('ContentTypeGroupRef', 'ContentTypeGroup'); - $generator->startAttribute( - 'href', - $this->router->generate( - 'ezpublish_rest_loadContentTypeGroup', - array( - 'contentTypeGroupId' => $contentTypeGroup->id, - ) - ) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadContentTypeGroup', ['contentTypeGroupId' => $contentTypeGroup->id]) ); - $generator->endAttribute('href'); // Unlinking last group is not allowed if ($groupCount > 1) { diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Location.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Location.php index f9674b7d749..0e8321a71a1 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Location.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Location.php @@ -14,7 +14,7 @@ use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; -use eZ\Publish\Core\REST\Server\Values\RestContent as RestContentValue; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; /** * Location value object visitor. @@ -73,16 +73,12 @@ public function visit(Visitor $visitor, Generator $generator, $location) $generator->startObjectElement('ParentLocation', 'Location'); if (trim($location->pathString, '/') !== '1') { - $generator->startAttribute( - 'href', - $this->router->generate( - 'ezpublish_rest_loadLocation', - array( - 'locationPath' => implode('/', array_slice($location->path, 0, count($location->path) - 1)), - ) - ) + new ResourceRouteReference( + 'ezpublish_rest_loadLocation', + [ + 'locationPath' => implode('/', array_slice($location->path, 0, count($location->path) - 1)), + ] ); - $generator->endAttribute('href'); } $generator->endObjectElement('ParentLocation'); @@ -99,24 +95,17 @@ public function visit(Visitor $visitor, Generator $generator, $location) $generator->endValueElement('remoteId'); $generator->startObjectElement('Children', 'LocationList'); - $generator->startAttribute( - 'href', - $this->router->generate( - 'ezpublish_rest_loadLocationChildren', - array( - 'locationPath' => trim($location->pathString, '/'), - ) - ) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadLocationChildren', ['locationPath' => trim($location->pathString, '/')]), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('Children'); $generator->startObjectElement('Content'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadContent', array('contentId' => $location->contentId)) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadContent', ['contentId' => $location->contentId]) ); - $generator->endAttribute('href'); $generator->endObjectElement('Content'); $generator->startValueElement('sortField', $this->serializeSortField($location->sortField)); @@ -126,26 +115,19 @@ public function visit(Visitor $visitor, Generator $generator, $location) $generator->endValueElement('sortOrder'); $generator->startObjectElement('UrlAliases', 'UrlAliasRefList'); - $generator->startAttribute( - 'href', - $this->router->generate( - 'ezpublish_rest_listLocationURLAliases', - array('locationPath' => trim($location->pathString, '/')) - ) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_listLocationURLAliases', ['locationPath' => trim($location->pathString, '/')]) ); - $generator->endAttribute('href'); $generator->endObjectElement('UrlAliases'); $generator->startObjectElement('ContentInfo', 'ContentInfo'); - $generator->startAttribute( - 'href', - $this->router->generate( - 'ezpublish_rest_loadContent', - array('contentId' => $location->contentId) - ) + + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadContent', ['contentId' => $location->contentId]), + $generator, + $visitor ); - $generator->endAttribute('href'); - $visitor->visitValueObject(new RestContentValue($location->contentInfo)); + $generator->endObjectElement('ContentInfo'); $generator->endObjectElement('Location'); diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/LocationList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/LocationList.php index ced1d48a318..ac4264eadd4 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/LocationList.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/LocationList.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; /** * LocationList value object visitor. @@ -38,14 +39,12 @@ public function visit(Visitor $visitor, Generator $generator, $data) foreach ($data->locations as $restLocation) { $generator->startObjectElement('Location'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_loadLocation', - array('locationPath' => trim($restLocation->location->pathString, '/')) + ['locationPath' => trim($restLocation->location->pathString, '/')] ) ); - $generator->endAttribute('href'); $generator->endObjectElement('Location'); } diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ObjectStateGroup.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ObjectStateGroup.php index da27c957162..cfde2b1dbd3 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ObjectStateGroup.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ObjectStateGroup.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; /** * ObjectStateGroup value object visitor. @@ -51,11 +52,14 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->endValueElement('languageCodes'); $generator->startObjectElement('ObjectStates', 'ObjectStateList'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadObjectStates', array('objectStateGroupId' => $data->id)) + $visitor->visitValueObject( + new ResourceRouteReference( + 'ezpublish_rest_loadObjectStates', + ['objectStateGroupId' => $data->id] + ), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('ObjectStates'); $this->visitNamesList($generator, $data->getNames()); diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestContent.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestContent.php index 9c225412345..bf8d8ae3dac 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestContent.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestContent.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; use eZ\Publish\Core\REST\Server\Values\Version as VersionValue; /** @@ -45,7 +46,7 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->startAttribute( 'href', $data->path === null ? - $this->router->generate('ezpublish_rest_loadContent', array('contentId' => $contentInfo->id)) : + $this->router->generate('ezpublish_rest_loadContent', ['contentId' => $contentInfo->id]) : $data->path ); $generator->endAttribute('href'); @@ -56,89 +57,99 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->endAttribute('id'); $generator->startObjectElement('ContentType'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_loadContentType', - array('contentTypeId' => $contentInfo->contentTypeId) - ) + ['contentTypeId' => $contentInfo->contentTypeId] + ), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('ContentType'); $generator->startValueElement('Name', $contentInfo->name); $generator->endValueElement('Name'); $generator->startObjectElement('Versions', 'VersionList'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadContentVersions', array('contentId' => $contentInfo->id)) + $visitor->visitValueObject( + new ResourceRouteReference( + 'ezpublish_rest_loadContentVersions', + ['contentId' => $contentInfo->id] + ) ); - $generator->endAttribute('href'); $generator->endObjectElement('Versions'); $generator->startObjectElement('CurrentVersion', 'Version'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_redirectCurrentVersion', - array('contentId' => $contentInfo->id) - ) + ['contentId' => $contentInfo->id] + ), + $generator, + $visitor ); - $generator->endAttribute('href'); // Embed current version, if available if ($currentVersion !== null) { + // @todo EZP-26033: this should use rest resource embedding $visitor->visitValueObject( new VersionValue( $currentVersion, $contentType, $restContent->relations - ) + ), + $generator, + $visitor ); } $generator->endObjectElement('CurrentVersion'); $generator->startObjectElement('Section'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadSection', array('sectionId' => $contentInfo->sectionId)) + $visitor->visitValueObject( + new ResourceRouteReference( + 'ezpublish_rest_loadSection', + ['sectionId' => $contentInfo->sectionId] + ), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('Section'); // Main location will not exist if we're visiting the content draft if ($data->mainLocation !== null) { $generator->startObjectElement('MainLocation', 'Location'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_loadLocation', - array('locationPath' => trim($mainLocation->pathString, '/')) - ) + ['locationPath' => trim($mainLocation->pathString, '/')] + ), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('MainLocation'); } $generator->startObjectElement('Locations', 'LocationList'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_loadLocationsForContent', - array('contentId' => $contentInfo->id) - ) + ['contentId' => $contentInfo->id] + ), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('Locations'); $generator->startObjectElement('Owner', 'User'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadUser', array('userId' => $contentInfo->ownerId)) + $visitor->visitValueObject( + new ResourceRouteReference( + 'ezpublish_rest_loadUser', + ['userId' => $contentInfo->ownerId] + ), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('Owner'); // Modification date will not exist if we're visiting the content draft @@ -180,14 +191,14 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->endValueElement('alwaysAvailable'); $generator->startObjectElement('ObjectStates', 'ContentObjectStates'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_getObjectStatesForContent', - array('contentId' => $contentInfo->id) - ) + ['contentId' => $contentInfo->id] + ), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('ObjectStates'); $generator->endObjectElement('Content'); diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestContentType.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestContentType.php index 5311047419e..b7a083a9410 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestContentType.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestContentType.php @@ -76,47 +76,40 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->endValueElement('modificationDate'); $generator->startObjectElement('Creator', 'User'); - $generator->startAttribute( - 'href', - $this->router->generate( + // @todo EZP-26033: this sould use rest resource embedding + $visitor->visitValueObject( + new Values\ResourceRouteReference( 'ezpublish_rest_loadUser', - array('userId' => $contentType->creatorId) + ['userId' => $contentType->creatorId] ) ); - $generator->endAttribute('href'); $generator->endObjectElement('Creator'); $generator->startObjectElement('Modifier', 'User'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new Values\ResourceRouteReference( 'ezpublish_rest_loadUser', - array('userId' => $contentType->modifierId) + ['userId' => $contentType->modifierId] ) ); - $generator->endAttribute('href'); $generator->endObjectElement('Modifier'); $generator->startObjectElement('Groups', 'ContentTypeGroupRefList'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new Values\ResourceRouteReference( 'ezpublish_rest_loadGroupsOfContentType', - array('contentTypeId' => $contentType->id) + ['contentTypeId' => $contentType->id] ) ); - $generator->endAttribute('href'); $generator->endObjectElement('Groups'); $generator->startObjectElement('Draft', 'ContentType'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new Values\ResourceRouteReference( 'ezpublish_rest_loadContentTypeDraft', - array('contentTypeId' => $contentType->id) + ['contentTypeId' => $contentType->id] ) ); - $generator->endAttribute('href'); $generator->endObjectElement('Draft'); $generator->startValueElement('remoteId', $contentType->remoteId); diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestExecutedView.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestExecutedView.php index 372321be86b..2719abe6cb2 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestExecutedView.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestExecutedView.php @@ -18,6 +18,7 @@ use eZ\Publish\API\Repository\ContentService; use eZ\Publish\API\Repository\ContentTypeService; use eZ\Publish\API\Repository\LocationService; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; use eZ\Publish\Core\REST\Server\Values\RestContent as RestContentValue; /** @@ -89,11 +90,12 @@ public function visit(Visitor $visitor, Generator $generator, $data) // BEGIN Result $generator->startObjectElement('Result', 'ViewResult'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_views_load_results', array('viewId' => $data->identifier)) + $visitor->visitValueObject( + new ResourceRouteReference( + 'ezpublish_rest_views_load_results', + ['viewId' => $data->identifier] + ) ); - $generator->endAttribute('href'); // BEGIN Result metadata $generator->startValueElement('count', $data->searchResults->totalCount); diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestLocation.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestLocation.php index 82f08974e18..a1d84ecea75 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestLocation.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestLocation.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; use eZ\Publish\Core\REST\Server\Values\RestContent as RestContentValue; /** @@ -40,7 +41,7 @@ public function visit(Visitor $visitor, Generator $generator, $data) 'href', $this->router->generate( 'ezpublish_rest_loadLocation', - array('locationPath' => trim($location->pathString, '/')) + ['locationPath' => trim($location->pathString, '/')] ) ); $generator->endAttribute('href'); @@ -65,16 +66,14 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->startObjectElement('ParentLocation', 'Location'); if (trim($location->pathString, '/') !== '1') { - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_loadLocation', - array( - 'locationPath' => implode('/', array_slice($location->path, 0, count($location->path) - 1)), - ) - ) + ['locationPath' => implode('/', array_slice($location->path, 0, count($location->path) - 1))] + ), + $generator, + $visitor ); - $generator->endAttribute('href'); } $generator->endObjectElement('ParentLocation'); @@ -91,24 +90,23 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->endValueElement('remoteId'); $generator->startObjectElement('Children', 'LocationList'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_loadLocationChildren', - array( - 'locationPath' => trim($location->pathString, '/'), - ) - ) + ['locationPath' => trim($location->pathString, '/')] + ), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('Children'); $generator->startObjectElement('Content'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadContent', array('contentId' => $contentInfo->id)) + $visitor->visitValueObject( + new ResourceRouteReference( + 'ezpublish_rest_loadContent', + ['contentId' => $contentInfo->id] + ) ); - $generator->endAttribute('href'); $generator->endObjectElement('Content'); $generator->startValueElement('sortField', $this->serializeSortField($location->sortField)); @@ -118,25 +116,27 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->endValueElement('sortOrder'); $generator->startObjectElement('UrlAliases', 'UrlAliasRefList'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_listLocationURLAliases', - array('locationPath' => trim($location->pathString, '/')) - ) + ['locationPath' => trim($location->pathString, '/')] + ), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('UrlAliases'); $generator->startObjectElement('ContentInfo', 'ContentInfo'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_loadContent', - array('contentId' => $contentInfo->id) - ) + ['contentId' => $contentInfo->id], + 'ContentInfo' + ), + $generator, + $visitor ); - $generator->endAttribute('href'); + $visitor->visitValueObject(new RestContentValue($contentInfo)); $generator->endObjectElement('ContentInfo'); diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestObjectState.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestObjectState.php index d94f6ea8090..de50bf2df2e 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestObjectState.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestObjectState.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; /** * RestObjectState value object visitor. @@ -52,11 +53,12 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->startObjectElement('ObjectStateGroup'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadObjectStateGroup', array('objectStateGroupId' => $data->groupId)) + $visitor->visitValueObject( + new ResourceRouteReference( + 'ezpublish_rest_loadObjectStateGroup', + ['objectStateGroupId' => $data->groupId] + ) ); - $generator->endAttribute('href'); $generator->endObjectElement('ObjectStateGroup'); diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestRelation.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestRelation.php index be2145121bf..55bfc0cfb19 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestRelation.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestRelation.php @@ -14,6 +14,7 @@ use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; use eZ\Publish\API\Repository\Values\Content\Relation as RelationValue; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; /** * RestRelation value object visitor. @@ -46,29 +47,21 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->endAttribute('href'); $generator->startObjectElement('SourceContent', 'ContentInfo'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_loadContent', - array( - 'contentId' => $data->contentId, - ) + ['contentId' => $data->contentId] ) ); - $generator->endAttribute('href'); $generator->endObjectElement('SourceContent'); $generator->startObjectElement('DestinationContent', 'ContentInfo'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_loadContent', - array( - 'contentId' => $data->relation->getDestinationContentInfo()->id, - ) + ['contentId' => $data->relation->getDestinationContentInfo()->id] ) ); - $generator->endAttribute('href'); $generator->endObjectElement('DestinationContent'); if ($data->relation->sourceFieldDefinitionIdentifier !== null) { diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestTrashItem.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestTrashItem.php index 53e80b56954..a9467efd341 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestTrashItem.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestTrashItem.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; use eZ\Publish\Core\REST\Server\Values\RestContent as RestContentValue; /** @@ -63,16 +64,12 @@ public function visit(Visitor $visitor, Generator $generator, $data) $pathStringParts = array_slice($pathStringParts, 0, count($pathStringParts) - 1); $generator->startObjectElement('ParentLocation', 'Location'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_loadLocation', - array( - 'locationPath' => implode('/', $pathStringParts), - ) + ['locationPath' => implode('/', $pathStringParts)] ) ); - $generator->endAttribute('href'); $generator->endObjectElement('ParentLocation'); $generator->startValueElement('pathString', $trashItem->pathString); @@ -88,11 +85,12 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->endValueElement('remoteId'); $generator->startObjectElement('Content'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadContent', array('contentId' => $contentInfo->id)) + $visitor->visitValueObject( + new ResourceRouteReference( + 'ezpublish_rest_loadContent', + ['contentId' => $contentInfo->id] + ) ); - $generator->endAttribute('href'); $generator->endObjectElement('Content'); $generator->startValueElement('sortField', $this->serializeSortField($trashItem->sortField)); @@ -102,14 +100,12 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->endValueElement('sortOrder'); $generator->startObjectElement('ContentInfo', 'ContentInfo'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_loadContent', - array('contentId' => $contentInfo->id) + ['contentId' => $contentInfo->id] ) ); - $generator->endAttribute('href'); $visitor->visitValueObject(new RestContentValue($contentInfo)); $generator->endObjectElement('ContentInfo'); diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUser.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUser.php index 8525bcbbde5..a62421a36ab 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUser.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUser.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; use eZ\Publish\Core\REST\Server\Values\Version as VersionValue; /** @@ -50,66 +51,69 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->startObjectElement('ContentType'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadContentType', array('contentTypeId' => $contentInfo->contentTypeId)) + $visitor->visitValueObject( + new ResourceRouteReference( + 'ezpublish_rest_loadContentType', + ['contentTypeId' => $contentInfo->contentTypeId] + ) ); - $generator->endAttribute('href'); - $generator->endObjectElement('ContentType'); $generator->startValueElement('name', $contentInfo->name); $generator->endValueElement('name'); $generator->startObjectElement('Versions', 'VersionList'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadContentVersions', array('contentId' => $contentInfo->id)) + $visitor->visitValueObject( + new ResourceRouteReference( + 'ezpublish_rest_loadContentVersions', + ['contentId' => $contentInfo->id] + ) ); - $generator->endAttribute('href'); $generator->endObjectElement('Versions'); $generator->startObjectElement('Section'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadSection', array('sectionId' => $contentInfo->sectionId)) + $visitor->visitValueObject( + new ResourceRouteReference( + 'ezpublish_rest_loadSection', + ['sectionId' => $contentInfo->sectionId] + ) ); - $generator->endAttribute('href'); $generator->endObjectElement('Section'); $generator->startObjectElement('MainLocation', 'Location'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_loadLocation', - array('locationPath' => trim($data->mainLocation->pathString, '/')) + ['locationPath' => trim($data->mainLocation->pathString, '/')] ) ); - $generator->endAttribute('href'); $generator->endObjectElement('MainLocation'); $generator->startObjectElement('Locations', 'LocationList'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadLocationsForContent', array('contentId' => $contentInfo->id)) + $visitor->visitValueObject( + new ResourceRouteReference( + 'ezpublish_rest_loadLocationsForContent', + ['contentId' => $contentInfo->id] + ) ); - $generator->endAttribute('href'); $generator->endObjectElement('Locations'); $generator->startObjectElement('Groups', 'UserGroupRefList'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadUserGroupsOfUser', array('userId' => $contentInfo->id)) + $visitor->visitValueObject( + new ResourceRouteReference( + 'ezpublish_rest_loadUserGroupsOfUser', + ['userId' => $contentInfo->id] + ) ); - $generator->endAttribute('href'); $generator->endObjectElement('Groups'); $generator->startObjectElement('Owner', 'User'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadUser', array('userId' => $contentInfo->ownerId)) + $visitor->visitValueObject( + new ResourceRouteReference( + 'ezpublish_rest_loadUser', + ['userId' => $contentInfo->ownerId] + ) ); - $generator->endAttribute('href'); $generator->endObjectElement('Owner'); $generator->startValueElement('publishDate', $contentInfo->publishedDate->format('c')); @@ -148,27 +152,15 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->endValueElement('enabled'); $generator->startObjectElement('UserGroups', 'UserGroupList'); - $generator->startAttribute( - 'href', - $this->router->generate( - 'ezpublish_rest_loadUserGroupsOfUser', - array('userId' => $contentInfo->id) - ) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadUserGroupsOfUser', ['userId' => $contentInfo->id]) ); - $generator->endAttribute('href'); $generator->endObjectElement('UserGroups'); $generator->startObjectElement('Roles', 'RoleAssignmentList'); - $generator->startAttribute( - 'href', - $this->router->generate( - 'ezpublish_rest_loadRoleAssignmentsForUser', - array( - 'userId' => $contentInfo->id, - ) - ) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadRoleAssignmentsForUser', ['userId' => $contentInfo->id]) ); - $generator->endAttribute('href'); $generator->endObjectElement('Roles'); $generator->endObjectElement('User'); diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserGroup.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserGroup.php index d8f297dfc3d..a4f92be3e1a 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserGroup.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserGroup.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; use eZ\Publish\Core\REST\Server\Values\Version as VersionValue; /** @@ -52,14 +53,14 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->startObjectElement('ContentType'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_loadContentType', - array('contentTypeId' => $contentInfo->contentTypeId) - ) + ['contentTypeId' => $contentInfo->contentTypeId] + ), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('ContentType'); @@ -67,46 +68,44 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->endValueElement('name'); $generator->startObjectElement('Versions', 'VersionList'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadContentVersions', array('contentId' => $contentInfo->id)) + + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadContentVersions', ['contentId' => $contentInfo->id]), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('Versions'); $generator->startObjectElement('Section'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadSection', array('sectionId' => $contentInfo->sectionId)) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadSection', array('sectionId' => $contentInfo->sectionId)), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('Section'); $generator->startObjectElement('MainLocation', 'Location'); - $generator->startAttribute( - 'href', - $this->router->generate( - 'ezpublish_rest_loadLocation', - array('locationPath' => $mainLocationPath) - ) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadLocation', ['locationPath' => $mainLocationPath]), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('MainLocation'); $generator->startObjectElement('Locations', 'LocationList'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadLocationsForContent', array('contentId' => $contentInfo->id)) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadLocationsForContent', ['contentId' => $contentInfo->id]), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('Locations'); $generator->startObjectElement('Owner', 'User'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadUser', array('userId' => $contentInfo->ownerId)) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadUser', ['userId' => $contentInfo->ownerId]), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('Owner'); $generator->startValueElement('publishDate', $contentInfo->publishedDate->format('c')); @@ -133,55 +132,38 @@ public function visit(Visitor $visitor, Generator $generator, $data) ); $generator->startObjectElement('ParentUserGroup', 'UserGroup'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_loadUserGroup', - array( - 'groupPath' => implode('/', array_slice($mainLocation->path, 0, count($mainLocation->path) - 1)), - ) - ) + ['groupPath' => implode('/', array_slice($mainLocation->path, 0, count($mainLocation->path) - 1))] + ), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('ParentUserGroup'); $generator->startObjectElement('Subgroups', 'UserGroupList'); - $generator->startAttribute( - 'href', - $this->router->generate( - 'ezpublish_rest_loadSubUserGroups', - array( - 'groupPath' => $mainLocationPath, - ) - ) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadSubUserGroups', ['groupPath' => $mainLocationPath]), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('Subgroups'); $generator->startObjectElement('Users', 'UserList'); - $generator->startAttribute( - 'href', - $this->router->generate( - 'ezpublish_rest_loadUsersFromGroup', - array( - 'groupPath' => $mainLocationPath, - ) - ) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadUsersFromGroup', ['groupPath' => $mainLocationPath]), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('Users'); $generator->startObjectElement('Roles', 'RoleAssignmentList'); - $generator->startAttribute( - 'href', - $this->router->generate( - 'ezpublish_rest_loadRoleAssignmentsForUserGroup', - array( - 'groupPath' => $mainLocationPath, - ) - ) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadRoleAssignmentsForUserGroup', ['groupPath' => $mainLocationPath]), + $generator, + $visitor ); - $generator->endAttribute('href'); $generator->endObjectElement('Roles'); $generator->endObjectElement('UserGroup'); diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserGroupRoleAssignment.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserGroupRoleAssignment.php index c8e7c92eeee..66d4375c6f6 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserGroupRoleAssignment.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserGroupRoleAssignment.php @@ -14,6 +14,7 @@ use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; use eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; /** * RestUserGroupRoleAssignment value object visitor. @@ -53,11 +54,12 @@ public function visit(Visitor $visitor, Generator $generator, $data) } $generator->startObjectElement('Role'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadRole', array('roleId' => $role->id)) + $visitor->visitValueObject( + new ResourceRouteReference( + 'ezpublish_rest_loadRole', + ['roleId' => $role->id] + ) ); - $generator->endAttribute('href'); $generator->endObjectElement('Role'); $generator->endObjectElement('RoleAssignment'); diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserRoleAssignment.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserRoleAssignment.php index a3a509b000e..34f00066555 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserRoleAssignment.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserRoleAssignment.php @@ -14,6 +14,7 @@ use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; use eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; /** * RestUserRoleAssignment value object visitor. @@ -53,11 +54,9 @@ public function visit(Visitor $visitor, Generator $generator, $data) } $generator->startObjectElement('Role'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadRole', array('roleId' => $role->id)) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadRole', ['roleId' => $role->id]) ); - $generator->endAttribute('href'); $generator->endObjectElement('Role'); $generator->endObjectElement('RoleAssignment'); diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Role.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Role.php index 24896dc84ae..ae1fd879c1b 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Role.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Role.php @@ -14,6 +14,7 @@ use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; /** * Role value object visitor. @@ -43,11 +44,9 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->endValueElement('identifier'); $generator->startObjectElement('Policies', 'PolicyList'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadPolicies', array('roleId' => $data->id)) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadPolicies', ['roleId' => $data->id]) ); - $generator->endAttribute('href'); $generator->endObjectElement('Policies'); $generator->endObjectElement('Role'); diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/URLAlias.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/URLAlias.php index 2453a7cc06d..6b83e232443 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/URLAlias.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/URLAlias.php @@ -14,6 +14,7 @@ use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; use eZ\Publish\API\Repository\Values; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; /** * URLAlias value object visitor. @@ -46,11 +47,9 @@ public function visit(Visitor $visitor, Generator $generator, $data) if ($data->type === Values\Content\URLAlias::LOCATION) { $generator->startObjectElement('location', 'Location'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadLocation', array('locationPath' => $data->destination)) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadLocation', ['locationPath' => $data->destination]) ); - $generator->endAttribute('href'); $generator->endObjectElement('location'); } else { $generator->startValueElement('resource', $data->destination); diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserGroupRefList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserGroupRefList.php index 0d745bf263d..3caa3595bcd 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserGroupRefList.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserGroupRefList.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; /** * UserGroupRefList value object visitor. @@ -42,31 +43,25 @@ public function visit(Visitor $visitor, Generator $generator, $data) foreach ($data->userGroups as $userGroup) { $generator->startObjectElement('UserGroup'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_loadUserGroup', - array( - 'groupPath' => trim($userGroup->mainLocation->pathString, '/'), - ) + ['groupPath' => trim($userGroup->mainLocation->pathString, '/')] ) ); - $generator->endAttribute('href'); if ($data->userId !== null && $groupCount > 1) { $generator->startHashElement('unassign'); - $generator->startAttribute( - 'href', - $this->router->generate( + $visitor->visitValueObject( + new ResourceRouteReference( 'ezpublish_rest_unassignUserFromUserGroup', - array( + [ 'userId' => $data->userId, 'groupPath' => $userGroup->mainLocation->path[count($userGroup->mainLocation->path) - 1], - ) + ] ) ); - $generator->endAttribute('href'); $generator->startAttribute('method', 'DELETE'); $generator->endAttribute('method'); diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserRefList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserRefList.php index 3b07724d2ff..a4c75bbd9a9 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserRefList.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserRefList.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; /** * UserRefList value object visitor. @@ -39,10 +40,9 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->startList('User'); foreach ($data->users as $user) { $generator->startObjectElement('User'); - - $generator->startAttribute('href', $this->router->generate('ezpublish_rest_loadUser', array('userId' => $user->contentInfo->id))); - $generator->endAttribute('href'); - + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadUser', ['userId' => $user->contentInfo->id]) + ); $generator->endObjectElement('User'); } $generator->endList('User'); diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserSession.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserSession.php index 2207cb6851b..15404dc6fa1 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserSession.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserSession.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; /** * UserSession value object visitor. @@ -53,11 +54,9 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->endValueElement('csrfToken'); $generator->startObjectElement('User', 'User'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadUser', array('userId' => $data->user->id)) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadUser', ['userId' => $data->user->id]) ); - $generator->endAttribute('href'); $generator->endObjectElement('User'); $generator->endObjectElement('Session'); diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/VersionInfo.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/VersionInfo.php index 05462f09184..62da07dc443 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/VersionInfo.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/VersionInfo.php @@ -14,6 +14,7 @@ use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\Visitor; use eZ\Publish\API\Repository\Values; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; /** * VersionInfo value object visitor. @@ -52,12 +53,9 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->endValueElement('modificationDate'); $generator->startObjectElement('Creator', 'User'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadUser', - array('userId' => $versionInfo->creatorId)) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadUser', ['userId' => $versionInfo->creatorId]) ); - $generator->endAttribute('href'); $generator->endObjectElement('Creator'); $generator->startValueElement( @@ -81,11 +79,9 @@ public function visit(Visitor $visitor, Generator $generator, $data) $this->visitNamesList($generator, $versionInfo->names); $generator->startObjectElement('Content', 'ContentInfo'); - $generator->startAttribute( - 'href', - $this->router->generate('ezpublish_rest_loadContent', array('contentId' => $versionInfo->getContentInfo()->id)) + $visitor->visitValueObject( + new ResourceRouteReference('ezpublish_rest_loadContent', ['contentId' => $versionInfo->getContentInfo()->id]) ); - $generator->endAttribute('href'); $generator->endObjectElement('Content'); $generator->endHashElement('VersionInfo'); diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/PathExpansion/ExpansionGeneratorTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/PathExpansion/ExpansionGeneratorTest.php new file mode 100644 index 00000000000..e00b399b955 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/PathExpansion/ExpansionGeneratorTest.php @@ -0,0 +1,213 @@ +buildGenerator()->startDocument('tenant'); + } + + /** + * @expectedException \eZ\Publish\Core\Base\Exceptions\BadStateException + */ + public function testEndDocument() + { + $this->buildGenerator()->endDocument('tenant'); + } + + public function testIsEmpty() + { + $this->getInnerGeneratorMock() + ->expects($this->once()) + ->method('isEmpty'); + + $this->buildGenerator()->isEmpty(); + } + + public function testStartEndObjectElement() + { + $this->getInnerGeneratorMock() + ->expects($this->once()) + ->method('startObjectElement') + ->with('pertwee', 'doctor'); + + $this->getInnerGeneratorMock() + ->expects($this->once()) + ->method('endObjectElement') + ->with('pertwee'); + + $generator = $this->buildGenerator(); + $generator->startObjectElement('jon', 'doctor'); + $generator->startObjectElement('pertwee', 'doctor'); + $generator->endObjectElement('pertwee'); + $generator->endObjectElement('jon'); + } + + public function testStartHashElement() + { + $this->getInnerGeneratorMock() + ->expects($this->once()) + ->method('startHashElement') + ->with('baker'); + + $this->buildGenerator()->startHashElement('baker'); + } + + public function testEndHashElement() + { + $this->getInnerGeneratorMock() + ->expects($this->once()) + ->method('endHashElement') + ->with('baker'); + + $this->buildGenerator()->endHashElement('baker'); + } + + public function testStartValueElement() + { + $this->getInnerGeneratorMock() + ->expects($this->once()) + ->method('startValueElement') + ->with('baker', 'paul'); + + $this->buildGenerator()->startValueElement('baker', 'paul'); + } + + public function testEndValueElement() + { + $this->getInnerGeneratorMock() + ->expects($this->once()) + ->method('endValueElement') + ->with('baker'); + + $this->buildGenerator()->endValueElement('baker'); + } + + public function testStartList() + { + $this->getInnerGeneratorMock() + ->expects($this->once()) + ->method('startList') + ->with('hartnell'); + + $this->buildGenerator()->startList('hartnell'); + } + + public function testEndList() + { + $this->getInnerGeneratorMock() + ->expects($this->once()) + ->method('endList') + ->with('hartnell'); + + $this->buildGenerator()->endList('hartnell'); + } + + public function testStartEndAttribute() + { + $this->getInnerGeneratorMock() + ->expects($this->once()) + ->method('startObjectElement') + ->with('eccleston', 'doctor'); + + $this->getInnerGeneratorMock() + ->expects($this->once()) + ->method('startAttribute') + ->with('jacket', 'leather'); + + $generator = $this->buildGenerator(); + + $generator->startObjectElement('smith'); + $generator->startObjectElement('eccleston', 'doctor'); + $generator->startAttribute('jacket', 'leather'); + } + + public function testStartEndAttributeAtRoot() + { + $this->getInnerGeneratorMock() + ->expects($this->never()) + ->method('startObjectElement'); + + $this->getInnerGeneratorMock() + ->expects($this->once()) + ->method('startAttribute'); + + $this->getInnerGeneratorMock() + ->expects($this->never()) + ->method('endAttribute'); + + $this->buildGenerator()->startObjectElement('eccleston'); + $this->buildGenerator()->startAttribute('href', 'htt://google.cm'); + $this->buildGenerator()->endAttribute('href'); + $this->buildGenerator()->startAttribute('jacket', 'leather'); + $this->buildGenerator()->endAttribute('jacket'); + } + + public function testGetMediaType() + { + $this->getInnerGeneratorMock() + ->expects($this->once()) + ->method('getMediaType') + ->with('foo') + ->willReturn('application/vnd.ez.api.foo'); + + self::assertEquals('application/vnd.ez.api.foo', $this->buildGenerator()->getMediaType('foo')); + } + + public function testGenerateFieldTypeHash() + { + $this->getInnerGeneratorMock() + ->expects($this->once()) + ->method('generateFieldTypeHash') + ->with('smith', []); + + $this->buildGenerator()->generateFieldTypeHash('smith', []); + } + + public function testSerializeBool() + { + $this->getInnerGeneratorMock() + ->expects($this->once()) + ->method('serializeBool') + ->with(true) + ->willReturn('true'); + + self::assertEquals('true', $this->buildGenerator()->serializeBool(true)); + } + + /** + * @return ExpansionGenerator + */ + protected function buildGenerator() + { + return new ExpansionGenerator($this->getInnerGeneratorMock()); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|\eZ\Publish\Core\REST\Common\Output\Generator + */ + protected function getInnerGeneratorMock() + { + if (!isset($this->innerGeneratorMock)) { + $this->innerGeneratorMock = $this->getMockBuilder('eZ\Publish\Core\REST\Common\Output\Generator')->getMock(); + } + + return $this->innerGeneratorMock; + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeGroupRefListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeGroupRefListTest.php index a335856ef7c..f272e4dab36 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeGroupRefListTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeGroupRefListTest.php @@ -15,6 +15,7 @@ use eZ\Publish\Core\Repository\Values\ContentType\ContentType; use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Server\Values\ContentTypeGroupRefList; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; class ContentTypeGroupRefListTest extends ValueObjectVisitorBaseTest { @@ -60,11 +61,11 @@ public function testVisit() ); // first iteration - $this->addRouteExpectation( - 'ezpublish_rest_loadContentTypeGroup', - array('contentTypeGroupId' => $contentTypeGroupRefList->contentTypeGroups[0]->id), - "/content/typegroups/{$contentTypeGroupRefList->contentTypeGroups[0]->id}" - ); + $this->setVisitValueObjectExpectations([ + new ResourceRouteReference('ezpublish_rest_loadContentTypeGroup', ['contentTypeGroupId' => $contentTypeGroupRefList->contentTypeGroups[0]->id]), + new ResourceRouteReference('ezpublish_rest_loadContentTypeGroup', ['contentTypeGroupId' => $contentTypeGroupRefList->contentTypeGroups[1]->id]), + ]); + $this->addRouteExpectation( 'ezpublish_rest_unlinkContentTypeFromGroup', array( @@ -75,11 +76,6 @@ public function testVisit() ); // second iteration - $this->addRouteExpectation( - 'ezpublish_rest_loadContentTypeGroup', - array('contentTypeGroupId' => $contentTypeGroupRefList->contentTypeGroups[1]->id), - "/content/typegroups/{$contentTypeGroupRefList->contentTypeGroups[1]->id}" - ); $this->addRouteExpectation( 'ezpublish_rest_unlinkContentTypeFromGroup', array( @@ -115,26 +111,6 @@ public function testContentTypeGroupRefListHrefCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/ContentTypeGroupRefList[@href="/content/types/42/groups"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisit - */ - public function testContentTypeGroupRefListMediaTypeCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/ContentTypeGroupRefList[@media-type="application/vnd.ez.api.ContentTypeGroupRefList+xml"]'); - } - - /** - * @param \DOMDocument $dom - * - * @depends testVisit - */ - public function testFirstContentTypeGroupRefHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/ContentTypeGroupRefList/ContentTypeGroupRef[1][@href="/content/typegroups/1"]'); - } - /** * @param \DOMDocument $dom * @@ -165,16 +141,6 @@ public function testFirstContentTypeGroupRefUnlinkMethodCorrect(\DOMDocument $do $this->assertXPath($dom, '/ContentTypeGroupRefList/ContentTypeGroupRef[1]/unlink[@method="DELETE"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisit - */ - public function testSecondContentTypeGroupRefHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/ContentTypeGroupRefList/ContentTypeGroupRef[2][@href="/content/typegroups/2"]'); - } - /** * @param \DOMDocument $dom * diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeGroupTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeGroupTest.php index bba07579262..820275387eb 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeGroupTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeGroupTest.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; use eZ\Publish\Core\Repository\Values\ContentType; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; class ContentTypeGroupTest extends ValueObjectVisitorBaseTest { @@ -50,31 +51,17 @@ public function testVisit() ) ); - $routerMock = $this->getRouterMock(); - $this->addRouteExpectation( 'ezpublish_rest_loadContentTypeGroup', - array('contentTypeGroupId' => $contentTypeGroup->id), + ['contentTypeGroupId' => $contentTypeGroup->id], "/content/typegroups/{$contentTypeGroup->id}" ); - $this->addRouteExpectation( - 'ezpublish_rest_loadUser', - array('userId' => $contentTypeGroup->creatorId), - "/user/users/{$contentTypeGroup->creatorId}" - ); - - $this->addRouteExpectation( - 'ezpublish_rest_loadUser', - array('userId' => $contentTypeGroup->modifierId), - "/user/users/{$contentTypeGroup->modifierId}" - ); - - $this->addRouteExpectation( - 'ezpublish_rest_listContentTypesForGroup', - array('contentTypeGroupId' => $contentTypeGroup->id), - "/content/typegroups/{$contentTypeGroup->id}/types" - ); + $this->setVisitValueObjectExpectations([ + new ResourceRouteReference('ezpublish_rest_loadUser', ['userId' => $contentTypeGroup->creatorId]), + new ResourceRouteReference('ezpublish_rest_loadUser', ['userId' => $contentTypeGroup->modifierId]), + new ResourceRouteReference('ezpublish_rest_listContentTypesForGroup', ['contentTypeGroupId' => $contentTypeGroup->id], 'ContentTypeInfoList'), + ]); $visitor->visit( $this->getVisitorMock(), @@ -233,29 +220,6 @@ public function testResultContainsCreatorElement($result) ); } - /** - * Test if result contains Creator element attributes. - * - * @param string $result - * - * @depends testVisit - */ - public function testResultContainsCreatorAttributes($result) - { - $this->assertXMLTag( - array( - 'tag' => 'Creator', - 'attributes' => array( - 'href' => '/user/users/14', - 'media-type' => 'application/vnd.ez.api.User+xml', - ), - ), - $result, - 'Invalid element attributes.', - false - ); - } - /** * Test if result contains Modifier element. * @@ -275,29 +239,6 @@ public function testResultContainsModifierElement($result) ); } - /** - * Test if result contains Modifier element attributes. - * - * @param string $result - * - * @depends testVisit - */ - public function testResultContainsModifierAttributes($result) - { - $this->assertXMLTag( - array( - 'tag' => 'Modifier', - 'attributes' => array( - 'href' => '/user/users/13', - 'media-type' => 'application/vnd.ez.api.User+xml', - ), - ), - $result, - 'Invalid element attributes.', - false - ); - } - /** * Test if result contains ContentTypes element. * @@ -317,29 +258,6 @@ public function testResultContainsContentTypesElement($result) ); } - /** - * Test if result contains ContentTypes element attributes. - * - * @param string $result - * - * @depends testVisit - */ - public function testResultContainsContentTypesAttributes($result) - { - $this->assertXMLTag( - array( - 'tag' => 'ContentTypes', - 'attributes' => array( - 'href' => '/content/typegroups/42/types', - 'media-type' => 'application/vnd.ez.api.ContentTypeInfoList+xml', - ), - ), - $result, - 'Invalid attributes.', - false - ); - } - /** * Get the ContentTypeGroup visitor. * diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ObjectStateGroupTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ObjectStateGroupTest.php index 7847b963c1c..3a60f2f48a5 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ObjectStateGroupTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ObjectStateGroupTest.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; use eZ\Publish\Core\Repository\Values\ObjectState; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; class ObjectStateGroupTest extends ValueObjectVisitorBaseTest { @@ -51,11 +52,9 @@ public function testVisit() "/content/objectstategroups/$objectStateGroup->id" ); - $this->addRouteExpectation( - 'ezpublish_rest_loadObjectStates', - array('objectStateGroupId' => $objectStateGroup->id), - "/content/objectstategroups/$objectStateGroup->id/objectstates" - ); + $this->setVisitValueObjectExpectations([ + new ResourceRouteReference('ezpublish_rest_loadObjectStates', ['objectStateGroupId' => $objectStateGroup->id]), + ]); $visitor->visit( $this->getVisitorMock(), diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestContentTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestContentTest.php index 72cb0d58440..94342ecbfef 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestContentTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestContentTest.php @@ -11,6 +11,7 @@ namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; use eZ\Publish\Core\REST\Server\Values\RestContent; use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; use eZ\Publish\Core\Repository\Values; @@ -30,54 +31,21 @@ public function testVisitWithoutEmbeddedVersion() $restContent = $this->getBasicRestContent(); - $this->getVisitorMock()->expects($this->never()) - ->method('visitValueObject'); - $this->addRouteExpectation( 'ezpublish_rest_loadContent', array('contentId' => $restContent->contentInfo->id), "/content/objects/{$restContent->contentInfo->id}" ); - $this->addRouteExpectation( - 'ezpublish_rest_loadContentType', - array('contentTypeId' => $restContent->contentInfo->contentTypeId), - "/content/types/{$restContent->contentInfo->contentTypeId}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadContentVersions', - array('contentId' => $restContent->contentInfo->id), - "/content/objects/{$restContent->contentInfo->id}/versions" - ); - $this->addRouteExpectation( - 'ezpublish_rest_redirectCurrentVersion', - array('contentId' => $restContent->contentInfo->id), - "/content/objects/{$restContent->contentInfo->id}/currentversion" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadSection', - array('sectionId' => $restContent->contentInfo->sectionId), - "/content/sections/{$restContent->contentInfo->sectionId}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadLocation', - array('locationPath' => $locationPath = trim($restContent->mainLocation->pathString, '/')), - "/content/locations/{$locationPath}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadLocationsForContent', - array('contentId' => $restContent->contentInfo->id), - "/content/objects/{$restContent->contentInfo->id}/locations" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadUser', - array('userId' => $restContent->contentInfo->ownerId), - "/user/users/{$restContent->contentInfo->ownerId}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_getObjectStatesForContent', - array('contentId' => $restContent->contentInfo->id), - "/content/objects/{$restContent->contentInfo->id}/objectstates" - ); + $this->setVisitValueObjectExpectations([ + new ResourceRouteReference('ezpublish_rest_loadContentType', ['contentTypeId' => $restContent->contentInfo->contentTypeId]), + new ResourceRouteReference('ezpublish_rest_loadContentVersions', ['contentId' => $restContent->contentInfo->id]), + new ResourceRouteReference('ezpublish_rest_redirectCurrentVersion', ['contentId' => $restContent->contentInfo->id]), + new ResourceRouteReference('ezpublish_rest_loadSection', ['sectionId' => $restContent->contentInfo->sectionId]), + new ResourceRouteReference('ezpublish_rest_loadLocation', ['locationPath' => $locationPath = trim($restContent->mainLocation->pathString, '/')]), + new ResourceRouteReference('ezpublish_rest_loadLocationsForContent', ['contentId' => $restContent->contentInfo->id]), + new ResourceRouteReference('ezpublish_rest_loadUser', ['userId' => $restContent->contentInfo->ownerId]), + new ResourceRouteReference('ezpublish_rest_getObjectStatesForContent', ['contentId' => $restContent->contentInfo->id]), + ]); $visitor->visit( $this->getVisitorMock(), @@ -164,16 +132,6 @@ public function testContentRemoteIdCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/Content[@remoteId="abc123"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testContentTypeHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/Content/ContentType[@href="/content/types/contentType23"]'); - } - /** * @param \DOMDocument $dom * @@ -194,16 +152,6 @@ public function testNameCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/Content/Name[text()="Sindelfingen"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testVersionsHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/Content/Versions[@href="/content/objects/content23/versions"]'); - } - /** * @param \DOMDocument $dom * @@ -214,16 +162,6 @@ public function testVersionsMediaTypeCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/Content/Versions[@media-type="application/vnd.ez.api.VersionList+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testCurrentVersionHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/Content/CurrentVersion[@href="/content/objects/content23/currentversion"]'); - } - /** * @param \DOMDocument $dom * @@ -234,16 +172,6 @@ public function testCurrentVersionMediaTypeCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/Content/CurrentVersion[@media-type="application/vnd.ez.api.Version+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testSectionHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/Content/Section[@href="/content/sections/section23"]'); - } - /** * @param \DOMDocument $dom * @@ -254,16 +182,6 @@ public function testSectionMediaTypeCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/Content/Section[@media-type="application/vnd.ez.api.Section+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testMainLocationHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/Content/MainLocation[@href="/content/locations/1/2/23"]'); - } - /** * @param \DOMDocument $dom * @@ -274,16 +192,6 @@ public function testMainLocationMediaTypeCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/Content/MainLocation[@media-type="application/vnd.ez.api.Location+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testLocationsHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/Content/Locations[@href="/content/objects/content23/locations"]'); - } - /** * @param \DOMDocument $dom * @@ -294,16 +202,6 @@ public function testLocationsMediaTypeCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/Content/Locations[@media-type="application/vnd.ez.api.LocationList+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testOwnerHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/Content/Owner[@href="/user/users/user23"]'); - } - /** * @param \DOMDocument $dom * @@ -376,51 +274,21 @@ public function testVisitWithEmbeddedVersion() 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType' ); - $this->getVisitorMock()->expects($this->once()) - ->method('visitValueObject') - ->with($this->isInstanceOf('eZ\\Publish\\Core\\REST\\Server\\Values\\Version')); - $this->addRouteExpectation( 'ezpublish_rest_loadContent', array('contentId' => $restContent->contentInfo->id), "/content/objects/{$restContent->contentInfo->id}" ); - $this->addRouteExpectation( - 'ezpublish_rest_loadContentType', - array('contentTypeId' => $restContent->contentInfo->contentTypeId), - "/content/types/{$restContent->contentInfo->contentTypeId}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadContentVersions', - array('contentId' => $restContent->contentInfo->id), - "/content/objects/{$restContent->contentInfo->id}/versions" - ); - $this->addRouteExpectation( - 'ezpublish_rest_redirectCurrentVersion', - array('contentId' => $restContent->contentInfo->id), - "/content/objects/{$restContent->contentInfo->id}/currentversion" - ); - - $this->addRouteExpectation( - 'ezpublish_rest_loadSection', - array('sectionId' => $restContent->contentInfo->sectionId), - "/content/sections/{$restContent->contentInfo->sectionId}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadLocation', - array('locationPath' => $locationPath = trim($restContent->mainLocation->pathString, '/')), - "/content/locations/{$locationPath}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadLocationsForContent', - array('contentId' => $restContent->contentInfo->id), - "/content/objects/{$restContent->contentInfo->id}/locations" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadUser', - array('userId' => $restContent->contentInfo->ownerId), - "/user/users/{$restContent->contentInfo->ownerId}" - ); + $this->setVisitValueObjectExpectations([ + new ResourceRouteReference('ezpublish_rest_loadContentType', ['contentTypeId' => $restContent->contentInfo->contentTypeId]), + new ResourceRouteReference('ezpublish_rest_loadContentVersions', ['contentId' => $restContent->contentInfo->id]), + new ResourceRouteReference('ezpublish_rest_redirectCurrentVersion', ['contentId' => $restContent->contentInfo->id]), + $this->isInstanceOf('eZ\Publish\Core\REST\Server\Values\Version'), + new ResourceRouteReference('ezpublish_rest_loadSection', ['sectionId' => $restContent->contentInfo->sectionId]), + new ResourceRouteReference('ezpublish_rest_loadLocation', ['locationPath' => $locationPath = trim($restContent->mainLocation->pathString, '/')]), + new ResourceRouteReference('ezpublish_rest_loadLocationsForContent', ['contentId' => $restContent->contentInfo->id]), + new ResourceRouteReference('ezpublish_rest_loadUser', ['userId' => $restContent->contentInfo->ownerId]), + ]); $visitor->visit( $this->getVisitorMock(), @@ -448,16 +316,6 @@ public function testContentMediaTypeWithVersionCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/Content[@media-type="application/vnd.ez.api.Content+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithEmbeddedVersion - */ - public function testEmbeddedCurrentVersionHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/Content/CurrentVersion[@href="/content/objects/content23/currentversion"]'); - } - /** * @param \DOMDocument $dom * diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestContentTypeTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestContentTypeTest.php index dfd81adb83b..c00ae877982 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestContentTypeTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestContentTypeTest.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; use eZ\Publish\Core\Repository\Values; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; use eZ\Publish\Core\REST\Server\Values\RestContentType; /** @@ -33,35 +34,19 @@ public function testVisitDefinedType() $restContentType = $this->getBasicContentType(); - $this->getVisitorMock()->expects($this->once()) - ->method('visitValueObject') - ->with($this->isInstanceOf('eZ\\Publish\\Core\\REST\\Server\\Values\\FieldDefinitionList')); - $this->addRouteExpectation( 'ezpublish_rest_loadContentType', array('contentTypeId' => $restContentType->contentType->id), "/content/types/{$restContentType->contentType->id}" ); - $this->addRouteExpectation( - 'ezpublish_rest_loadUser', - array('userId' => $restContentType->contentType->creatorId), - "/user/users/{$restContentType->contentType->creatorId}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadUser', - array('userId' => $restContentType->contentType->modifierId), - "/user/users/{$restContentType->contentType->modifierId}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadGroupsOfContentType', - array('contentTypeId' => $restContentType->contentType->id), - "/content/types/{$restContentType->contentType->id}/groups" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadContentTypeDraft', - array('contentTypeId' => $restContentType->contentType->id), - "/content/types/{$restContentType->contentType->id}/draft" - ); + + $this->setVisitValueObjectExpectations([ + $this->isInstanceOf('eZ\Publish\Core\REST\Server\Values\FieldDefinitionList'), + new ResourceRouteReference('ezpublish_rest_loadUser', ['userId' => $restContentType->contentType->creatorId]), + new ResourceRouteReference('ezpublish_rest_loadUser', ['userId' => $restContentType->contentType->modifierId]), + new ResourceRouteReference('ezpublish_rest_loadGroupsOfContentType', ['contentTypeId' => $restContentType->contentType->id]), + new ResourceRouteReference('ezpublish_rest_loadContentTypeDraft', ['contentTypeId' => $restContentType->contentType->id]), + ]); $visitor->visit( $this->getVisitorMock(), @@ -111,16 +96,6 @@ protected function getBasicContentType() ); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitDefinedType - */ - public function testContentTypeHref(\DOMDocument $dom) - { - $this->assertXPath($dom, '/ContentType[@href="/content/types/contentTypeId"]'); - } - /** * @param \DOMDocument $dom * @@ -221,16 +196,6 @@ public function testModificationDate(\DOMDocument $dom) $this->assertXPath($dom, '/ContentType/modificationDate[text()="2012-09-06T19:32:00+02:00"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitDefinedType - */ - public function testCreatorHref(\DOMDocument $dom) - { - $this->assertXPath($dom, '/ContentType/Creator[@href="/user/users/creatorId"]'); - } - /** * @param \DOMDocument $dom * @@ -241,16 +206,6 @@ public function testCreatorMediaType(\DOMDocument $dom) $this->assertXPath($dom, '/ContentType/Creator[@media-type="application/vnd.ez.api.User+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitDefinedType - */ - public function testModifierHref(\DOMDocument $dom) - { - $this->assertXPath($dom, '/ContentType/Modifier[@href="/user/users/modifierId"]'); - } - /** * @param \DOMDocument $dom * @@ -261,16 +216,6 @@ public function testModifierMediaType(\DOMDocument $dom) $this->assertXPath($dom, '/ContentType/Modifier[@media-type="application/vnd.ez.api.User+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitDefinedType - */ - public function testDraftHref(\DOMDocument $dom) - { - $this->assertXPath($dom, '/ContentType/Draft[@href="/content/types/contentTypeId/draft"]'); - } - /** * @param \DOMDocument $dom * @@ -281,16 +226,6 @@ public function testDraftType(\DOMDocument $dom) $this->assertXPath($dom, '/ContentType/Draft[@media-type="application/vnd.ez.api.ContentType+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitDefinedType - */ - public function testGroupsHref(\DOMDocument $dom) - { - $this->assertXPath($dom, '/ContentType/Groups[@href="/content/types/contentTypeId/groups"]'); - } - /** * @param \DOMDocument $dom * diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestExecutedViewTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestExecutedViewTest.php index 7a5a53ad9dc..11905b36710 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestExecutedViewTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestExecutedViewTest.php @@ -16,6 +16,7 @@ use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; use eZ\Publish\Core\Repository\Values\Content; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; use eZ\Publish\Core\REST\Server\Values\RestExecutedView; use eZ\Publish\Core\Repository\Values\Content as ApiValues; @@ -50,11 +51,9 @@ public function testVisit() array('viewId' => $view->identifier), "/content/views/{$view->identifier}" ); - $this->addRouteExpectation( - 'ezpublish_rest_views_load_results', - array('viewId' => $view->identifier), - "/content/views/{$view->identifier}/results" - ); + $this->setVisitValueObjectExpectations([ + new ResourceRouteReference('ezpublish_rest_views_load_results', ['viewId' => $view->identifier]), + ]); $visitor->visit( $this->getVisitorMock(), @@ -84,7 +83,6 @@ public function provideXpathAssertions() array('/View/Query[@media-type="application/vnd.ez.api.Query+xml"]'), array('/View/Result'), array('/View/Result[@media-type="application/vnd.ez.api.ViewResult+xml"]'), - array('/View/Result[@href="/content/views/test_view/results"]'), ); } diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestLocationRootNodeTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestLocationRootNodeTest.php index 95f0e171a38..3620af059c5 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestLocationRootNodeTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestLocationRootNodeTest.php @@ -11,6 +11,7 @@ namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; use eZ\Publish\Core\REST\Server\Values\RestLocation; use eZ\Publish\Core\Repository\Values\Content\Location; use eZ\Publish\API\Repository\Values\Content\ContentInfo; @@ -60,31 +61,14 @@ public function testVisit() array('locationPath' => '1'), '/content/locations/1' ); - $this->addRouteExpectation( - 'ezpublish_rest_loadLocationChildren', - array('locationPath' => '1'), - '/content/locations/1/children' - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadContent', - array('contentId' => $location->location->contentId), - "/content/objects/{$location->location->contentId}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_listLocationURLAliases', - array('locationPath' => '1'), - '/content/objects/1/urlaliases' - ); - - $this->addRouteExpectation( - 'ezpublish_rest_loadContent', - array('contentId' => $location->location->contentId), - "/content/objects/{$location->location->contentId}" - ); - $this->getVisitorMock()->expects($this->once()) - ->method('visitValueObject') - ->with($this->isInstanceOf('eZ\\Publish\\Core\\REST\\Server\\Values\\RestContent')); + $this->setVisitValueObjectExpectations([ + new ResourceRouteReference('ezpublish_rest_loadLocationChildren', array('locationPath' => '1')), + new ResourceRouteReference('ezpublish_rest_loadContent', array('contentId' => $location->location->contentId)), + new ResourceRouteReference('ezpublish_rest_listLocationURLAliases', array('locationPath' => '1')), + new ResourceRouteReference('ezpublish_rest_loadContent', array('contentId' => $location->location->contentId), 'ContentInfo'), + $this->isInstanceOf('eZ\Publish\Core\REST\Server\Values\RestContent'), + ]); $visitor->visit( $this->getVisitorMock(), @@ -195,7 +179,6 @@ public function testResultContainsChildrenAttributes($result) 'tag' => 'Children', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.LocationList+xml', - 'href' => '/content/locations/1/children', ), ), $result, @@ -238,7 +221,6 @@ public function testResultContainsUrlAliasesTagAttributes($result) 'tag' => 'UrlAliases', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.UrlAliasRefList+xml', - 'href' => '/content/objects/1/urlaliases', ), ), $result, diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestLocationTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestLocationTest.php index f5c6d8d3b1a..889dccbf660 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestLocationTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestLocationTest.php @@ -12,6 +12,7 @@ use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; use eZ\Publish\Core\REST\Server\Values\RestLocation; use eZ\Publish\Core\Repository\Values\Content\Location; use eZ\Publish\API\Repository\Values\Content\ContentInfo; @@ -56,42 +57,15 @@ public function testVisit() 0 ); - $this->addRouteExpectation( - 'ezpublish_rest_loadLocation', - array('locationPath' => '1/2/21/42'), - '/content/locations/1/2/21/42' - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadLocation', - array('locationPath' => '1/2/21'), - '/content/locations/1/2/21' - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadLocationChildren', - array('locationPath' => '1/2/21/42'), - '/content/locations/1/2/21/42/children' - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadContent', - array('contentId' => $location->location->contentId), - "/content/objects/{$location->location->contentId}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_listLocationURLAliases', - array('locationPath' => '1/2/21/42'), - '/content/objects/1/2/21/42/urlaliases' - ); - - // Expected twice, second one here for ContentInfo - $this->addRouteExpectation( - 'ezpublish_rest_loadContent', - array('contentId' => $location->location->contentId), - "/content/objects/{$location->location->contentId}" - ); - - $this->getVisitorMock()->expects($this->once()) - ->method('visitValueObject') - ->with($this->isInstanceOf('eZ\\Publish\\Core\\REST\\Server\\Values\\RestContent')); + $this->setVisitValueObjectExpectations([ + new ResourceRouteReference('ezpublish_rest_loadLocation', ['locationPath' => '1/2/21/42']), + new ResourceRouteReference('ezpublish_rest_loadLocation', ['locationPath' => '1/2/21']), + new ResourceRouteReference('ezpublish_rest_loadLocationChildren', ['locationPath' => '1/2/21/42']), + new ResourceRouteReference('ezpublish_rest_loadContent', ['contentId' => $location->location->contentId]), + new ResourceRouteReference('ezpublish_rest_listLocationURLAliases', ['locationPath' => '1/2/21/42']), + new ResourceRouteReference('ezpublish_rest_loadContent', ['contentId' => $location->location->contentId]), + $this->isInstanceOf('eZ\Publish\Core\REST\Server\Values\RestContent'), + ]); $visitor->visit( $this->getVisitorMock(), @@ -139,7 +113,6 @@ public function testResultContainsLocationAttributes($result) 'tag' => 'Location', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.Location+xml', - 'href' => '/content/locations/1/2/21/42', ), ), $result, @@ -181,7 +154,6 @@ public function testResultContainsContentInfoAttributes($result) 'tag' => 'ContentInfo', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.ContentInfo+xml', - 'href' => '/content/objects/42', ), ), $result, @@ -323,7 +295,6 @@ public function testResultContainsChildrenAttributes($result) 'tag' => 'Children', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.LocationList+xml', - 'href' => '/content/locations/1/2/21/42/children', ), ), $result, @@ -365,7 +336,6 @@ public function testResultContainsParentLocationAttributes($result) 'tag' => 'ParentLocation', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.Location+xml', - 'href' => '/content/locations/1/2/21', ), ), $result, @@ -407,7 +377,6 @@ public function testResultContainsContentAttributes($result) 'tag' => 'Content', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.Content+xml', - 'href' => '/content/objects/42', ), ), $result, @@ -549,7 +518,6 @@ public function testResultContainsUrlAliasesTagAttributes($result) 'tag' => 'UrlAliases', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.UrlAliasRefList+xml', - 'href' => '/content/objects/1/2/21/42/urlaliases', ), ), $result, diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestObjectStateTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestObjectStateTest.php index 7131d85bfce..2afedd6607e 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestObjectStateTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestObjectStateTest.php @@ -14,6 +14,7 @@ use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; use eZ\Publish\Core\Repository\Values\ObjectState\ObjectState; use eZ\Publish\Core\REST\Common\Values; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; class RestObjectStateTest extends ValueObjectVisitorBaseTest { @@ -55,11 +56,9 @@ public function testVisit() array('objectStateGroupId' => $objectState->groupId, 'objectStateId' => $objectState->objectState->id), "/content/objectstategroups/{$objectState->groupId}/objectstates/{$objectState->objectState->id}" ); - $this->addRouteExpectation( - 'ezpublish_rest_loadObjectStateGroup', - array('objectStateGroupId' => $objectState->groupId), - "/content/objectstategroups/{$objectState->groupId}" - ); + $this->setVisitValueObjectExpectations([ + new ResourceRouteReference('ezpublish_rest_loadObjectStateGroup', ['objectStateGroupId' => $objectState->groupId]), + ]); $visitor->visit( $this->getVisitorMock(), @@ -110,7 +109,6 @@ public function testResultContainsObjectStateAttributes($result) 'tag' => 'ObjectState', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.ObjectState+xml', - 'href' => '/content/objectstategroups/21/objectstates/42', ), ), $result, @@ -152,7 +150,6 @@ public function testResultContainsObjectStateGroupAttributes($result) 'tag' => 'ObjectStateGroup', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.ObjectStateGroup+xml', - 'href' => '/content/objectstategroups/21', ), ), $result, diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestRelationTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestRelationTest.php index f4f7b17e1af..a993f575c22 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestRelationTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestRelationTest.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; use eZ\Publish\Core\Repository\Values\Content; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; use eZ\Publish\Core\REST\Server\Values\RestRelation; use eZ\Publish\API\Repository\Values\Content\ContentInfo; @@ -61,16 +62,10 @@ public function testVisit() ), "/content/objects/{$relation->contentId}/versions/{$relation->versionNo}/relations/{$relation->relation->id}" ); - $this->addRouteExpectation( - 'ezpublish_rest_loadContent', - array('contentId' => $relation->contentId), - "/content/objects/{$relation->contentId}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadContent', - array('contentId' => $relation->relation->getDestinationContentInfo()->id), - "/content/objects/{$relation->relation->getDestinationContentInfo()->id}" - ); + $this->setVisitValueObjectExpectations([ + new ResourceRouteReference('ezpublish_rest_loadContent', ['contentId' => $relation->contentId]), + new ResourceRouteReference('ezpublish_rest_loadContent', ['contentId' => $relation->relation->getDestinationContentInfo()->id]), + ]); $visitor->visit( $this->getVisitorMock(), @@ -122,7 +117,6 @@ public function testResultContainsRelationAttributes($result) 'tag' => 'Relation', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.Relation+xml', - 'href' => '/content/objects/1/versions/1/relations/42', ), ), $result, @@ -143,7 +137,6 @@ public function testResultContainsSourceContentElement($result) 'tag' => 'SourceContent', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.ContentInfo+xml', - 'href' => '/content/objects/1', ), ), $result, @@ -164,7 +157,6 @@ public function testResultContainsDestinationContentElement($result) 'tag' => 'DestinationContent', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.ContentInfo+xml', - 'href' => '/content/objects/2', ), ), $result, diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestTrashItemTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestTrashItemTest.php index 5d5be003e35..654547765dc 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestTrashItemTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestTrashItemTest.php @@ -12,6 +12,7 @@ use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; use eZ\Publish\Core\REST\Server\Values\RestTrashItem; use eZ\Publish\Core\Repository\Values\Content\TrashItem; use eZ\Publish\API\Repository\Values\Content\ContentInfo; @@ -61,28 +62,12 @@ public function testVisit() array('trashItemId' => $trashItem->trashItem->id), "/content/trash/{$trashItem->trashItem->id}" ); - $this->addRouteExpectation( - 'ezpublish_rest_loadLocation', - array('locationPath' => '1/2/21'), - '/content/locations/1/2/21' - ); - - $this->addRouteExpectation( - 'ezpublish_rest_loadContent', - array('contentId' => $trashItem->trashItem->contentInfo->id), - "/content/objects/{$trashItem->trashItem->contentInfo->id}" - ); - - // Expected twice, second one here for ContentInfo - $this->addRouteExpectation( - 'ezpublish_rest_loadContent', - array('contentId' => $trashItem->trashItem->contentInfo->id), - "/content/objects/{$trashItem->trashItem->contentInfo->id}" - ); - - $this->getVisitorMock()->expects($this->once()) - ->method('visitValueObject') - ->with($this->isInstanceOf('eZ\\Publish\\Core\\REST\\Server\\Values\\RestContent')); + $this->setVisitValueObjectExpectations([ + new ResourceRouteReference('ezpublish_rest_loadLocation', ['locationPath' => '1/2/21']), + new ResourceRouteReference('ezpublish_rest_loadContent', ['contentId' => $trashItem->trashItem->contentInfo->id]), + new ResourceRouteReference('ezpublish_rest_loadContent', ['contentId' => $trashItem->trashItem->contentInfo->id]), + $this->isInstanceOf('eZ\Publish\Core\REST\Server\Values\RestContent'), + ]); $visitor->visit( $this->getVisitorMock(), @@ -133,7 +118,6 @@ public function testResultContainsTrashItemAttributes($result) 'tag' => 'TrashItem', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.TrashItem+xml', - 'href' => '/content/trash/42', ), ), $result, @@ -175,7 +159,6 @@ public function testResultContainsContentInfoAttributes($result) 'tag' => 'ContentInfo', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.ContentInfo+xml', - 'href' => '/content/objects/84', ), ), $result, @@ -317,7 +300,6 @@ public function testResultContainsParentLocationAttributes($result) 'tag' => 'ParentLocation', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.Location+xml', - 'href' => '/content/locations/1/2/21', ), ), $result, @@ -419,7 +401,6 @@ public function testResultContainsContentAttributes($result) 'tag' => 'Content', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.Content+xml', - 'href' => '/content/objects/84', ), ), $result, diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserGroupRoleAssignmentTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserGroupRoleAssignmentTest.php index f74ac66e3c0..76af4d72dc4 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserGroupRoleAssignmentTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserGroupRoleAssignmentTest.php @@ -51,11 +51,9 @@ public function testVisit() ), "/user/groups/1/5/14/roles/{$userGroupRoleAssignment->roleAssignment->role->id}" ); - $this->addRouteExpectation( - 'ezpublish_rest_loadRole', - array('roleId' => $userGroupRoleAssignment->roleAssignment->role->id), - "/user/roles/{$userGroupRoleAssignment->roleAssignment->role->id}" - ); + $this->setVisitValueObjectExpectations([ + new Values\ResourceRouteReference('ezpublish_rest_loadRole', ['roleId' => $userGroupRoleAssignment->roleAssignment->role->id]), + ]); $visitor->visit( $this->getVisitorMock(), @@ -106,7 +104,6 @@ public function testResultContainsRoleAssignmentAttributes($result) 'tag' => 'RoleAssignment', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.RoleAssignment+xml', - 'href' => '/user/groups/1/5/14/roles/42', ), ), $result, @@ -148,7 +145,6 @@ public function testResultContainsRoleAttributes($result) 'tag' => 'Role', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.Role+xml', - 'href' => '/user/roles/42', ), ), $result, diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserGroupTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserGroupTest.php index 2ee90daab51..8074bac5082 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserGroupTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserGroupTest.php @@ -11,6 +11,7 @@ namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; use eZ\Publish\Core\REST\Server\Values\RestUserGroup; use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; use eZ\Publish\Core\Repository\Values; @@ -30,65 +31,22 @@ public function testVisitWithoutEmbeddedVersion() $restUserGroup = $this->getBasicRestUserGroup(); - $this->getVisitorMock()->expects($this->once()) - ->method('visitValueObject'); - $userGroupPath = implode('/', $restUserGroup->mainLocation->path); - $this->addRouteExpectation( - 'ezpublish_rest_loadUserGroup', - array('groupPath' => $userGroupPath), - "/user/groups/{$userGroupPath}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadContentType', - array('contentTypeId' => $restUserGroup->contentInfo->contentTypeId), - "/content/types/{$restUserGroup->contentInfo->contentTypeId}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadContentVersions', - array('contentId' => $restUserGroup->contentInfo->id), - "/content/objects/{$restUserGroup->contentInfo->id}/versions" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadSection', - array('sectionId' => $restUserGroup->contentInfo->sectionId), - "/content/sections/{$restUserGroup->contentInfo->sectionId}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadLocation', - array('locationPath' => $userGroupPath), - "/content/locations/{$userGroupPath}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadLocationsForContent', - array('contentId' => $restUserGroup->contentInfo->id), - "/content/objects/{$restUserGroup->contentInfo->id}/locations" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadUser', - array('userId' => $restUserGroup->contentInfo->ownerId), - "/user/users/{$restUserGroup->contentInfo->ownerId}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadUserGroup', - array('groupPath' => '1/2'), - '/user/groups/1/2' - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadSubUserGroups', - array('groupPath' => $userGroupPath), - "/user/groups/{$userGroupPath}/subgroups" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadUsersFromGroup', - array('groupPath' => $userGroupPath), - "/user/groups/{$userGroupPath}/users" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadRoleAssignmentsForUserGroup', - array('groupPath' => $userGroupPath), - "/user/groups/{$userGroupPath}/roles" - ); + + $this->setVisitValueObjectExpectations([ + new ResourceRouteReference('ezpublish_rest_loadUserGroup', ['groupPath' => $userGroupPath]), + new ResourceRouteReference('ezpublish_rest_loadContentType', ['contentTypeId' => $restUserGroup->contentInfo->contentTypeId]), + new ResourceRouteReference('ezpublish_rest_loadContentVersions', ['contentId' => $restUserGroup->contentInfo->id]), + new ResourceRouteReference('ezpublish_rest_loadSection', ['sectionId' => $restUserGroup->contentInfo->sectionId]), + new ResourceRouteReference('ezpublish_rest_loadLocation', ['locationPath' => $userGroupPath]), + new ResourceRouteReference('ezpublish_rest_loadLocationsForContent', ['contentId' => $restUserGroup->contentInfo->id]), + new ResourceRouteReference('ezpublish_rest_loadUser', ['userId' => $restUserGroup->contentInfo->ownerId]), + $this->isInstanceOf('eZ\Publish\Core\REST\Server\Values\Version'), + new ResourceRouteReference('ezpublish_rest_loadUserGroup', ['groupPath' => '1/2']), + new ResourceRouteReference('ezpublish_rest_loadSubUserGroups', ['groupPath' => $userGroupPath]), + new ResourceRouteReference('ezpublish_rest_loadUsersFromGroup', ['groupPath' => $userGroupPath]), + new ResourceRouteReference('ezpublish_rest_loadRoleAssignmentsForUserGroup', ['groupPath' => $userGroupPath]), + ]); $visitor->visit( $this->getVisitorMock(), @@ -138,16 +96,6 @@ protected function getBasicRestUserGroup() ); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testUserGroupHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/UserGroup[@href="/user/groups/1/2/23"]'); - } - /** * @param \DOMDocument $dom * @@ -178,16 +126,6 @@ public function testUserGroupRemoteIdCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/UserGroup[@remoteId="abc123"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testUserGroupTypeHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/UserGroup/ContentType[@href="/content/types/contentType23"]'); - } - /** * @param \DOMDocument $dom * @@ -208,16 +146,6 @@ public function testNameCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/UserGroup/name[text()="Sindelfingen"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testVersionsHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/UserGroup/Versions[@href="/content/objects/content23/versions"]'); - } - /** * @param \DOMDocument $dom * @@ -228,16 +156,6 @@ public function testVersionsMediaTypeCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/UserGroup/Versions[@media-type="application/vnd.ez.api.VersionList+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testSectionHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/UserGroup/Section[@href="/content/sections/section23"]'); - } - /** * @param \DOMDocument $dom * @@ -248,16 +166,6 @@ public function testSectionMediaTypeCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/UserGroup/Section[@media-type="application/vnd.ez.api.Section+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testMainLocationHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/UserGroup/MainLocation[@href="/content/locations/1/2/23"]'); - } - /** * @param \DOMDocument $dom * @@ -268,16 +176,6 @@ public function testMainLocationMediaTypeCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/UserGroup/MainLocation[@media-type="application/vnd.ez.api.Location+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testLocationsHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/UserGroup/Locations[@href="/content/objects/content23/locations"]'); - } - /** * @param \DOMDocument $dom * @@ -288,16 +186,6 @@ public function testLocationsMediaTypeCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/UserGroup/Locations[@media-type="application/vnd.ez.api.LocationList+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testOwnerHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/UserGroup/Owner[@href="/user/users/user23"]'); - } - /** * @param \DOMDocument $dom * @@ -338,46 +226,6 @@ public function testAlwaysAvailableCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/UserGroup/alwaysAvailable[text()="true"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testParentUserGroupHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/UserGroup/ParentUserGroup[@href="/user/groups/1/2"]'); - } - - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testSubgroupsHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/UserGroup/Subgroups[@href="/user/groups/1/2/23/subgroups"]'); - } - - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testUsersHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/UserGroup/Users[@href="/user/groups/1/2/23/users"]'); - } - - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testRolesHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/UserGroup/Roles[@href="/user/groups/1/2/23/roles"]'); - } - /** * @param \DOMDocument $dom * diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserRoleAssignmentTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserRoleAssignmentTest.php index 1096ea95de3..e1cb34c780a 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserRoleAssignmentTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserRoleAssignmentTest.php @@ -14,6 +14,7 @@ use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; use eZ\Publish\Core\Repository\Values\User; use eZ\Publish\Core\REST\Server\Values; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; class RestUserRoleAssignmentTest extends ValueObjectVisitorBaseTest { @@ -52,11 +53,9 @@ public function testVisit() "/user/users/{$userRoleAssignment->id}/roles/{$userRoleAssignment->roleAssignment->role->id}" ); - $this->addRouteExpectation( - 'ezpublish_rest_loadRole', - array('roleId' => $userRoleAssignment->roleAssignment->role->id), - "/user/roles/{$userRoleAssignment->roleAssignment->role->id}" - ); + $this->setVisitValueObjectExpectations([ + new ResourceRouteReference('ezpublish_rest_loadRole', ['roleId' => $userRoleAssignment->roleAssignment->role->id]), + ]); $visitor->visit( $this->getVisitorMock(), @@ -107,7 +106,6 @@ public function testResultContainsRoleAssignmentAttributes($result) 'tag' => 'RoleAssignment', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.RoleAssignment+xml', - 'href' => '/user/users/14/roles/42', ), ), $result, @@ -149,7 +147,6 @@ public function testResultContainsRoleAttributes($result) 'tag' => 'Role', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.Role+xml', - 'href' => '/user/roles/42', ), ), $result, diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserTest.php index d4abb0f98bc..f0135579131 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserTest.php @@ -11,6 +11,7 @@ namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; use eZ\Publish\Core\REST\Server\Values\RestUser; use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; use eZ\Publish\Core\Repository\Values; @@ -30,60 +31,25 @@ public function testVisitWithoutEmbeddedVersion() $restUser = $this->getBasicRestUser(); - $this->getVisitorMock()->expects($this->once()) - ->method('visitValueObject'); - $locationPath = implode('/', $restUser->mainLocation->path); $this->addRouteExpectation( 'ezpublish_rest_loadUser', array('userId' => $restUser->contentInfo->id), "/user/users/{$restUser->contentInfo->id}" ); - $this->addRouteExpectation( - 'ezpublish_rest_loadContentType', - array('contentTypeId' => $restUser->contentInfo->contentTypeId), - "/content/types/{$restUser->contentInfo->contentTypeId}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadContentVersions', - array('contentId' => $restUser->contentInfo->id), - "/content/objects/{$restUser->contentInfo->id}/versions" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadSection', - array('sectionId' => $restUser->contentInfo->sectionId), - "/content/sections/{$restUser->contentInfo->sectionId}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadLocation', - array('locationPath' => $locationPath), - "/content/locations/{$locationPath}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadLocationsForContent', - array('contentId' => $restUser->contentInfo->id), - "/content/objects/{$restUser->contentInfo->id}/locations" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadUserGroupsOfUser', - array('userId' => $restUser->contentInfo->id), - "/user/users/{$restUser->contentInfo->id}/groups" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadUser', - array('userId' => $restUser->contentInfo->ownerId), - "/user/users/{$restUser->contentInfo->ownerId}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadUserGroupsOfUser', - array('userId' => $restUser->contentInfo->id), - "/user/users/{$restUser->contentInfo->id}/groups" - ); - $this->addRouteExpectation( - 'ezpublish_rest_loadRoleAssignmentsForUser', - array('userId' => $restUser->contentInfo->id), - "/user/users/{$restUser->contentInfo->id}/roles" - ); + + $this->setVisitValueObjectExpectations([ + new ResourceRouteReference('ezpublish_rest_loadContentType', ['contentTypeId' => $restUser->contentInfo->contentTypeId]), + new ResourceRouteReference('ezpublish_rest_loadContentVersions', ['contentId' => $restUser->contentInfo->id]), + new ResourceRouteReference('ezpublish_rest_loadSection', ['sectionId' => $restUser->contentInfo->sectionId]), + new ResourceRouteReference('ezpublish_rest_loadLocation', ['locationPath' => $locationPath]), + new ResourceRouteReference('ezpublish_rest_loadLocationsForContent', ['contentId' => $restUser->contentInfo->id]), + new ResourceRouteReference('ezpublish_rest_loadUserGroupsOfUser', ['userId' => $restUser->contentInfo->id]), + new ResourceRouteReference('ezpublish_rest_loadUser', ['userId' => $restUser->contentInfo->ownerId]), + $this->isInstanceOf('eZ\Publish\Core\REST\Server\Values\Version'), + new ResourceRouteReference('ezpublish_rest_loadUserGroupsOfUser', ['userId' => $restUser->contentInfo->id]), + new ResourceRouteReference('ezpublish_rest_loadRoleAssignmentsForUser', ['userId' => $restUser->contentInfo->id]), + ]); $visitor->visit( $this->getVisitorMock(), @@ -173,16 +139,6 @@ public function testUserRemoteIdCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/User[@remoteId="abc123"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testUserTypeHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/User/ContentType[@href="/content/types/contentType23"]'); - } - /** * @param \DOMDocument $dom * @@ -203,16 +159,6 @@ public function testNameCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/User/name[text()="Sindelfingen"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testVersionsHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/User/Versions[@href="/content/objects/content23/versions"]'); - } - /** * @param \DOMDocument $dom * @@ -223,16 +169,6 @@ public function testVersionsMediaTypeCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/User/Versions[@media-type="application/vnd.ez.api.VersionList+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testSectionHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/User/Section[@href="/content/sections/section23"]'); - } - /** * @param \DOMDocument $dom * @@ -243,16 +179,6 @@ public function testSectionMediaTypeCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/User/Section[@media-type="application/vnd.ez.api.Section+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testMainLocationHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/User/MainLocation[@href="/content/locations/1/2/23"]'); - } - /** * @param \DOMDocument $dom * @@ -263,16 +189,6 @@ public function testMainLocationMediaTypeCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/User/MainLocation[@media-type="application/vnd.ez.api.Location+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testLocationsHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/User/Locations[@href="/content/objects/content23/locations"]'); - } - /** * @param \DOMDocument $dom * @@ -283,16 +199,6 @@ public function testLocationsMediaTypeCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/User/Locations[@media-type="application/vnd.ez.api.LocationList+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testOwnerHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/User/Owner[@href="/user/users/user23"]'); - } - /** * @param \DOMDocument $dom * @@ -333,16 +239,6 @@ public function testAlwaysAvailableCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/User/alwaysAvailable[text()="true"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testUserGroupsHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/User/UserGroups[@href="/user/users/content23/groups"]'); - } - /** * @param \DOMDocument $dom * @@ -353,16 +249,6 @@ public function testUserGroupsMediaTypeCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/User/UserGroups[@media-type="application/vnd.ez.api.UserGroupList+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisitWithoutEmbeddedVersion - */ - public function testRolesHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/User/Roles[@href="/user/users/content23/roles"]'); - } - /** * @param \DOMDocument $dom * diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RoleTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RoleTest.php index 13bef90c1df..5c3ec3bcc81 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RoleTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RoleTest.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; use eZ\Publish\Core\Repository\Values\User; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; class RoleTest extends ValueObjectVisitorBaseTest { @@ -47,7 +48,9 @@ public function testVisit() ); $this->addRouteExpectation('ezpublish_rest_loadRole', array('roleId' => $role->id), "/user/roles/{$role->id}"); - $this->addRouteExpectation('ezpublish_rest_loadPolicies', array('roleId' => $role->id), "/user/roles/{$role->id}/policies"); + $this->setVisitValueObjectExpectations([ + new ResourceRouteReference('ezpublish_rest_loadPolicies', ['roleId' => $role->id]), + ]); $visitor->visit( $this->getVisitorMock(), @@ -98,7 +101,6 @@ public function testResultContainsRoleAttributes($result) 'tag' => 'Role', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.Role+xml', - 'href' => '/user/roles/42', ), ), $result, @@ -227,7 +229,6 @@ public function testResultContainsPoliciesAttributes($result) 'tag' => 'Policies', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.PolicyList+xml', - 'href' => '/user/roles/42/policies', ), ), $result, diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserGroupRefListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserGroupRefListTest.php index 9d6b33f755f..daa51eaea0f 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserGroupRefListTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserGroupRefListTest.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; use eZ\Publish\Core\Repository\Values\User\UserGroup; use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; use eZ\Publish\Core\REST\Server\Values\UserGroupRefList; use eZ\Publish\Core\REST\Server\Values\RestUserGroup; use eZ\Publish\API\Repository\Values\Content\ContentInfo; @@ -63,29 +64,12 @@ public function testVisit() 14 ); - $groupPath = trim($UserGroupRefList->userGroups[0]->mainLocation->pathString, '/'); - $this->addRouteExpectation( - 'ezpublish_rest_loadUserGroup', - array('groupPath' => $groupPath), - "/user/groups/{$groupPath}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_unassignUserFromUserGroup', - array('userId' => $UserGroupRefList->userId, 'groupPath' => 14), - '/user/users/14/groups/14' - ); - - $groupPath = trim($UserGroupRefList->userGroups[1]->mainLocation->pathString, '/'); - $this->addRouteExpectation( - 'ezpublish_rest_loadUserGroup', - array('groupPath' => '1/5/13'), - "/user/groups/{$groupPath}" - ); - $this->addRouteExpectation( - 'ezpublish_rest_unassignUserFromUserGroup', - array('userId' => $UserGroupRefList->userId, 'groupPath' => 13), - '/user/users/14/groups/13' - ); + $this->setVisitValueObjectExpectations([ + new ResourceRouteReference('ezpublish_rest_loadUserGroup', ['groupPath' => '1/5/14']), + new ResourceRouteReference('ezpublish_rest_unassignUserFromUserGroup', ['userId' => $UserGroupRefList->userId, 'groupPath' => 14]), + new ResourceRouteReference('ezpublish_rest_loadUserGroup', ['groupPath' => '1/5/13']), + new ResourceRouteReference('ezpublish_rest_unassignUserFromUserGroup', ['userId' => $UserGroupRefList->userId, 'groupPath' => 13]), + ]); $visitor->visit( $this->getVisitorMock(), @@ -103,16 +87,6 @@ public function testVisit() return $dom; } - /** - * @param \DOMDocument $dom - * - * @depends testVisit - */ - public function testUserGroupRefListHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/UserGroupRefList[@href="/some/path"]'); - } - /** * @param \DOMDocument $dom * @@ -123,16 +97,6 @@ public function testUserGroupRefListMediaTypeCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/UserGroupRefList[@media-type="application/vnd.ez.api.UserGroupRefList+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisit - */ - public function testFirstUserGroupHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/UserGroupRefList/UserGroup[1][@href="/user/groups/1/5/14"]'); - } - /** * @param \DOMDocument $dom * @@ -143,16 +107,6 @@ public function testFirstUserGroupMediaTypeCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/UserGroupRefList/UserGroup[1][@media-type="application/vnd.ez.api.UserGroup+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisit - */ - public function testFirstUserGroupUnassignHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/UserGroupRefList/UserGroup[1]/unassign[@href="/user/users/14/groups/14"]'); - } - /** * @param \DOMDocument $dom * @@ -163,16 +117,6 @@ public function testFirstUserGroupUnassignMethodCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/UserGroupRefList/UserGroup[1]/unassign[@method="DELETE"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisit - */ - public function testSecondUserGroupHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/UserGroupRefList/UserGroup[2][@href="/user/groups/1/5/13"]'); - } - /** * @param \DOMDocument $dom * @@ -183,16 +127,6 @@ public function testSecondUserGroupMediaTypeCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/UserGroupRefList/UserGroup[2][@media-type="application/vnd.ez.api.UserGroup+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisit - */ - public function testSecondUserGroupUnassignHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/UserGroupRefList/UserGroup[2]/unassign[@href="/user/users/14/groups/13"]'); - } - /** * @param \DOMDocument $dom * diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserRefListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserRefListTest.php index 9c5d9f0b09d..a520fe46e35 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserRefListTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserRefListTest.php @@ -13,6 +13,7 @@ use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; use eZ\Publish\Core\Repository\Values\User\User; use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; use eZ\Publish\Core\REST\Server\Values\UserRefList; use eZ\Publish\Core\REST\Server\Values\RestUser; use eZ\Publish\API\Repository\Values\Content\ContentInfo; @@ -49,11 +50,9 @@ public function testVisit() '/some/path' ); - $this->addRouteExpectation( - 'ezpublish_rest_loadUser', - array('userId' => $UserRefList->users[0]->contentInfo->id), - "/user/users/{$UserRefList->users[0]->contentInfo->id}" - ); + $this->setVisitValueObjectExpectations([ + new ResourceRouteReference('ezpublish_rest_loadUser', ['userId' => $UserRefList->users[0]->contentInfo->id]), + ]); $visitor->visit( $this->getVisitorMock(), @@ -91,16 +90,6 @@ public function testUserRefListMediaTypeCorrect(\DOMDocument $dom) $this->assertXPath($dom, '/UserRefList[@media-type="application/vnd.ez.api.UserRefList+xml"]'); } - /** - * @param \DOMDocument $dom - * - * @depends testVisit - */ - public function testUserHrefCorrect(\DOMDocument $dom) - { - $this->assertXPath($dom, '/UserRefList/User[@href="/user/users/14"]'); - } - /** * @param \DOMDocument $dom * diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserSessionCreatedTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserSessionCreatedTest.php index 593c96cf288..fac413d2d5e 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserSessionCreatedTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserSessionCreatedTest.php @@ -50,11 +50,9 @@ public function testVisit() "/user/sessions/{$session->sessionId}" ); - $this->addRouteExpectation( - 'ezpublish_rest_loadUser', - array('userId' => $session->user->id), - "/user/users/{$session->user->id}" - ); + $this->setVisitValueObjectExpectations([ + new Values\ResourceRouteReference('ezpublish_rest_loadUser', ['userId' => $session->user->id]), + ]); $visitor->visit( $this->getVisitorMock(), diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserSessionTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserSessionTest.php index 8fae69cc213..a66e9b30852 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserSessionTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserSessionTest.php @@ -52,11 +52,9 @@ public function testVisit() "/user/sessions/{$session->sessionId}" ); - $this->addRouteExpectation( - 'ezpublish_rest_loadUser', - array('userId' => $session->user->id), - "/user/users/{$session->user->id}" - ); + $this->setVisitValueObjectExpectations([ + new Values\ResourceRouteReference('ezpublish_rest_loadUser', ['userId' => $session->user->id]), + ]); $visitor->visit( $this->getVisitorMock(), @@ -219,7 +217,6 @@ public function testResultContainsUserAttributes($result) array( 'tag' => 'User', 'attributes' => array( - 'href' => '/user/users/user123', 'media-type' => 'application/vnd.ez.api.User+xml', ), ), diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/VersionInfoTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/VersionInfoTest.php index 5510ba791e2..c9e24d3f39b 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/VersionInfoTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/VersionInfoTest.php @@ -14,6 +14,7 @@ use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; use eZ\Publish\Core\Repository\Values\Content; use eZ\Publish\API\Repository\Values\Content\ContentInfo; +use eZ\Publish\Core\REST\Server\Values\ResourceRouteReference; class VersionInfoTest extends ValueObjectVisitorBaseTest { @@ -63,17 +64,10 @@ public function testVisit() ) ); - $this->addRouteExpectation( - 'ezpublish_rest_loadUser', - array('userId' => $versionInfo->creatorId), - "/user/users/{$versionInfo->creatorId}" - ); - - $this->addRouteExpectation( - 'ezpublish_rest_loadContent', - array('contentId' => $versionInfo->contentInfo->id), - "/content/objects/{$versionInfo->contentInfo->id}" - ); + $this->setVisitValueObjectExpectations([ + new ResourceRouteReference('ezpublish_rest_loadUser', ['userId' => $versionInfo->creatorId]), + new ResourceRouteReference('ezpublish_rest_loadContent', ['contentId' => $versionInfo->contentInfo->id]), + ]); $visitor->visit( $this->getVisitorMock(), @@ -268,7 +262,6 @@ public function testVersionInfoContentElement($result) 'tag' => 'Content', 'attributes' => array( 'media-type' => 'application/vnd.ez.api.ContentInfo+xml', - 'href' => '/content/objects/42', ), ), $result, From 8ca219ad75c6730845d2f4aef1de94a799118629 Mon Sep 17 00:00:00 2001 From: Bertrand Dunogier Date: Tue, 30 Aug 2016 15:48:51 +0200 Subject: [PATCH 06/14] EZP-26033: Refactored resource expansion test --- .../ValueObjectVisitor/ResourceLink.php | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php index 47be988671a..049e9235875 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php @@ -33,20 +33,33 @@ public function __construct(UriValueLoader $valueLoader) */ public function visit(Visitor $visitor, Generator $generator, $data) { - $request = $this->getRequestStack()->getMasterRequest(); - $expandedPathList = []; - if ($request->headers->has('x-ez-embed-value')) { - $expandedPathList = explode(',', $request->headers->get('x-ez-embed-value')); - } - $generator->startAttribute('href', $data->link); $generator->endAttribute('href'); - if (in_array($generator->getStackPath(), $expandedPathList)) { + if ($this->needsResourceExpansion($generator->getStackPath())) { try { $visitor->visitValueObject($this->valueLoader->load($data->link)); } catch (ApiUnauthorizedException $e) { } } } + + /** + * Tests if the current $nodePath requires the resource to be expanded, + * based on the custom X-eZ-Embed-Value Request header. + * + * @param string $nodePath + * + * @return bool + */ + public function needsResourceExpansion($nodePath) + { + $request = $this->getRequestStack()->getMasterRequest(); + $expandedPathList = []; + if ($request->headers->has('x-ez-embed-value')) { + $expandedPathList = explode(',', $request->headers->get('x-ez-embed-value')); + } + + return in_array($nodePath, $expandedPathList); + } } From 72a05dc0e012f596d7cbc7cba14beea7b0c5fc88 Mon Sep 17 00:00:00 2001 From: Bertrand Dunogier Date: Tue, 30 Aug 2016 16:42:45 +0200 Subject: [PATCH 07/14] EZP-26033: Refactored link expansion check to PathExpansionChecker interface --- .../config/value_object_visitors.yml | 7 +- .../PathExpansion/PathExpansionChecker.php | 30 +++++++ .../RequestHeaderPathExpansionChecker.php | 49 ++++++++++++ .../ValueObjectVisitor/ResourceLink.php | 31 ++----- .../RequestHeaderPathExpansionCheckerTest.php | 80 +++++++++++++++++++ 5 files changed, 172 insertions(+), 25 deletions(-) create mode 100644 eZ/Publish/Core/REST/Server/Output/PathExpansion/PathExpansionChecker.php create mode 100644 eZ/Publish/Core/REST/Server/Output/PathExpansion/RequestHeaderPathExpansionChecker.php create mode 100644 eZ/Publish/Core/REST/Server/Tests/Output/PathExpansion/RequestHeaderPathExpansionCheckerTest.php diff --git a/eZ/Bundle/EzPublishRestBundle/Resources/config/value_object_visitors.yml b/eZ/Bundle/EzPublishRestBundle/Resources/config/value_object_visitors.yml index c192577408d..4f04e8eed66 100644 --- a/eZ/Bundle/EzPublishRestBundle/Resources/config/value_object_visitors.yml +++ b/eZ/Bundle/EzPublishRestBundle/Resources/config/value_object_visitors.yml @@ -867,6 +867,10 @@ services: - { name: ezpublish_rest.output.value_object_visitor, type: 'eZ\Publish\Core\REST\Server\Values\ResourceLink' } arguments: - '@ezpublish_rest.controller_uri_value_loader' + - '@ezpublish_rest.output.path_expansion_checker.request_header' + + ezpublish_rest.output.path_expansion_checker.request_header: + class: 'eZ\Publish\Core\REST\Server\Output\PathExpansion\RequestHeaderPathExpansionChecker' calls: - [setRequestStack, ['@request_stack']] @@ -877,5 +881,4 @@ services: - { name: ezpublish_rest.output.value_object_visitor, type: 'eZ\Publish\Core\REST\Server\Values\ResourceRouteReference' } arguments: - '@ezpublish_rest.controller_uri_value_loader' - calls: - - [setRequestStack, ['@request_stack']] + - '@ezpublish_rest.output.path_expansion_checker.request_header' diff --git a/eZ/Publish/Core/REST/Server/Output/PathExpansion/PathExpansionChecker.php b/eZ/Publish/Core/REST/Server/Output/PathExpansion/PathExpansionChecker.php new file mode 100644 index 00000000000..b7681338bb0 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/PathExpansion/PathExpansionChecker.php @@ -0,0 +1,30 @@ + + * + * + * + * + * ``` + */ +interface PathExpansionChecker +{ + /** + * Tests if the link at $documentPath must be expanded. + * + * @param string $documentPath Path in a rest generator (example: Content.Owner). + * + * @return bool + */ + public function needsExpansion($documentPath); +} diff --git a/eZ/Publish/Core/REST/Server/Output/PathExpansion/RequestHeaderPathExpansionChecker.php b/eZ/Publish/Core/REST/Server/Output/PathExpansion/RequestHeaderPathExpansionChecker.php new file mode 100644 index 00000000000..6e5f27a2ff4 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/PathExpansion/RequestHeaderPathExpansionChecker.php @@ -0,0 +1,49 @@ +getRequestStack()->getMasterRequest(); + + if (is_null($request)) { + return false; + } + if (!$request->headers->has('x-ez-embed-value')) { + return false; + } + + $documentPath = strtolower($documentPath); + foreach (explode(',', $request->headers->get('x-ez-embed-value')) as $requestedPath) { + $requestedPath = strtolower($requestedPath); + if ($requestedPath === $documentPath) { + return true; + } + if (substr($requestedPath, 0, strlen($documentPath)) === $documentPath) { + return true; + } + } + + return false; + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php index 049e9235875..30a8bd6c595 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php @@ -6,24 +6,28 @@ namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; use eZ\Publish\API\Repository\Exceptions\UnauthorizedException as ApiUnauthorizedException; -use eZ\Publish\Core\MVC\Symfony\RequestStackAware; use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Output\PathExpansion\PathExpansionChecker; use eZ\Publish\Core\REST\Server\ValueLoaders\UriValueLoader; class ResourceLink extends ValueObjectVisitor { - use RequestStackAware; + /** + * @var PathExpansionChecker + */ + private $pathExpansionChecker; /** * @var UriValueLoader */ private $valueLoader; - public function __construct(UriValueLoader $valueLoader) + public function __construct(UriValueLoader $valueLoader, PathExpansionChecker $pathExpansionChecker) { $this->valueLoader = $valueLoader; + $this->pathExpansionChecker = $pathExpansionChecker; } /** @@ -36,30 +40,11 @@ public function visit(Visitor $visitor, Generator $generator, $data) $generator->startAttribute('href', $data->link); $generator->endAttribute('href'); - if ($this->needsResourceExpansion($generator->getStackPath())) { + if ($this->pathExpansionChecker->needsExpansion($generator->getStackPath())) { try { $visitor->visitValueObject($this->valueLoader->load($data->link)); } catch (ApiUnauthorizedException $e) { } } } - - /** - * Tests if the current $nodePath requires the resource to be expanded, - * based on the custom X-eZ-Embed-Value Request header. - * - * @param string $nodePath - * - * @return bool - */ - public function needsResourceExpansion($nodePath) - { - $request = $this->getRequestStack()->getMasterRequest(); - $expandedPathList = []; - if ($request->headers->has('x-ez-embed-value')) { - $expandedPathList = explode(',', $request->headers->get('x-ez-embed-value')); - } - - return in_array($nodePath, $expandedPathList); - } } diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/PathExpansion/RequestHeaderPathExpansionCheckerTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/PathExpansion/RequestHeaderPathExpansionCheckerTest.php new file mode 100644 index 00000000000..105c03292a8 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/PathExpansion/RequestHeaderPathExpansionCheckerTest.php @@ -0,0 +1,80 @@ +buildCheckerWithRequestStack(new RequestStack()); + + self::assertFalse($checker->needsExpansion('anything')); + } + + public function testNoHeader() + { + $requestStack = new RequestStack(); + $requestStack->push(new Request()); + + $checker = $this->buildCheckerWithRequestStack($requestStack); + + self::assertFalse($checker->needsExpansion('anything')); + } + + public function testEmptyHeader() + { + $checker = $this->buildCheckerWithRequestStack($this->buildRequestStackWithHeader('')); + + self::assertFalse($checker->needsExpansion('anything')); + } + + public function testSimpleExpansion() + { + $checker = $this->buildCheckerWithRequestStack( + $this->buildRequestStackWithHeader('Content.MainLocation,Content.Owner') + ); + $checker = $this->buildCheckerWithRequestStack($this->buildRequestStackWithHeader('Content.MainLocation,Content.Owner')); + + self::assertTrue($checker->needsExpansion('Content.MainLocation')); + self::assertTrue($checker->needsExpansion('Content.Owner')); + self::assertFalse($checker->needsExpansion('Content.SomethingElse')); + } + + public function testChildrenExpansion() + { + $checker = $this->buildCheckerWithRequestStack( + $this->buildRequestStackWithHeader('Location.Children.Location.ContentInfo') + ); + + self::assertTrue($checker->needsExpansion('Location.Children')); + self::assertTrue($checker->needsExpansion('Location.Children.Location')); + self::assertFalse($checker->needsExpansion('Location.urlAliases')); + } + + private function buildRequestStackWithHeader($headerValue) + { + $requestStack = new RequestStack(); + + $request = new Request(); + $request->headers->set('x-ez-embed-value', $headerValue); + $requestStack->push($request); + + return $requestStack; + } + + private function buildCheckerWithRequestStack(RequestStack $requestStack) + { + $checker = new RequestHeaderPathExpansionChecker(); + $checker->setRequestStack($requestStack); + + return $checker; + } +} From ebb4091894e020775dcfd032f0d91bbb6a73d732 Mon Sep 17 00:00:00 2001 From: Bertrand Dunogier Date: Wed, 31 Aug 2016 11:12:44 +0200 Subject: [PATCH 08/14] EZP-26033: Refactored Visitor::visitValueobject() Reverts an old refactoring: visiting a value object requires again that the visitor and generator are passed as arguments. --- .../Common/Output/ValueObjectVisitorDispatcher.php | 12 ++++++++++-- eZ/Publish/Core/REST/Common/Output/Visitor.php | 9 ++++++--- .../Server/Output/ValueObjectVisitor/CachedValue.php | 2 +- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/eZ/Publish/Core/REST/Common/Output/ValueObjectVisitorDispatcher.php b/eZ/Publish/Core/REST/Common/Output/ValueObjectVisitorDispatcher.php index f5cee7967d4..ab87192f638 100644 --- a/eZ/Publish/Core/REST/Common/Output/ValueObjectVisitorDispatcher.php +++ b/eZ/Publish/Core/REST/Common/Output/ValueObjectVisitorDispatcher.php @@ -59,18 +59,26 @@ public function addVisitor($visitedClassName, ValueObjectVisitor $visitor) * * @return mixed */ - public function visit($data) + public function visit($data, Generator $generator = null, Visitor $visitor = null) { if (!is_object($data)) { throw new Exceptions\InvalidTypeException($data); } $checkedClassNames = array(); + if ($visitor === null) { + $visitor = $this->outputVisitor; + } + + if ($generator === null) { + $generator = $this->outputGenerator; + } + $className = get_class($data); do { $checkedClassNames[] = $className; if (isset($this->visitors[$className])) { - return $this->visitors[$className]->visit($this->outputVisitor, $this->outputGenerator, $data); + return $this->visitors[$className]->visit($visitor, $generator, $data); } } while ($className = get_parent_class($className)); diff --git a/eZ/Publish/Core/REST/Common/Output/Visitor.php b/eZ/Publish/Core/REST/Common/Output/Visitor.php index b2c20a43f00..ad67b628027 100644 --- a/eZ/Publish/Core/REST/Common/Output/Visitor.php +++ b/eZ/Publish/Core/REST/Common/Output/Visitor.php @@ -134,12 +134,15 @@ public function visit($data) * * @return mixed */ - public function visitValueObject($data) + public function visitValueObject($data, Generator $generator = null, Visitor $visitor = null) { $this->valueObjectVisitorDispatcher->setOutputGenerator($this->generator); - $this->valueObjectVisitorDispatcher->setOutputVisitor($this); - return $this->valueObjectVisitorDispatcher->visit($data); + return $this->valueObjectVisitorDispatcher->visit( + $data, + $generator ?: $this->generator, + $visitor ?: $this + ); } /** diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CachedValue.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CachedValue.php index 61bff461dca..dacf09d69c7 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CachedValue.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CachedValue.php @@ -38,7 +38,7 @@ public function __construct(ConfigResolverInterface $configResolver) */ public function visit(Visitor $visitor, Generator $generator, $data) { - $visitor->visitValueObject($data->value); + $visitor->visitValueObject($data->value, $generator, $visitor); if ($this->getParameter('content.view_cache') !== true) { return; From 55ddb4081dcd34627ee4d0434bb17b380b1b2440 Mon Sep 17 00:00:00 2001 From: Bertrand Dunogier Date: Wed, 31 Aug 2016 11:14:28 +0200 Subject: [PATCH 09/14] EZP-26033: Use visitorDispatcher in ResourceLink visitor --- .../Resources/config/value_object_visitors.yml | 2 ++ .../Output/ValueObjectVisitor/ResourceLink.php | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/eZ/Bundle/EzPublishRestBundle/Resources/config/value_object_visitors.yml b/eZ/Bundle/EzPublishRestBundle/Resources/config/value_object_visitors.yml index 4f04e8eed66..97eb7ba8fd5 100644 --- a/eZ/Bundle/EzPublishRestBundle/Resources/config/value_object_visitors.yml +++ b/eZ/Bundle/EzPublishRestBundle/Resources/config/value_object_visitors.yml @@ -868,6 +868,7 @@ services: arguments: - '@ezpublish_rest.controller_uri_value_loader' - '@ezpublish_rest.output.path_expansion_checker.request_header' + - '@ezpublish_rest.output.value_object_visitor.dispatcher' ezpublish_rest.output.path_expansion_checker.request_header: class: 'eZ\Publish\Core\REST\Server\Output\PathExpansion\RequestHeaderPathExpansionChecker' @@ -882,3 +883,4 @@ services: arguments: - '@ezpublish_rest.controller_uri_value_loader' - '@ezpublish_rest.output.path_expansion_checker.request_header' + - '@ezpublish_rest.output.value_object_visitor.dispatcher' diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php index 30a8bd6c595..dea41ae5d31 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php @@ -8,6 +8,7 @@ use eZ\Publish\API\Repository\Exceptions\UnauthorizedException as ApiUnauthorizedException; use eZ\Publish\Core\REST\Common\Output\Generator; use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitorDispatcher; use eZ\Publish\Core\REST\Common\Output\Visitor; use eZ\Publish\Core\REST\Server\Output\PathExpansion\PathExpansionChecker; use eZ\Publish\Core\REST\Server\ValueLoaders\UriValueLoader; @@ -24,10 +25,19 @@ class ResourceLink extends ValueObjectVisitor */ private $valueLoader; - public function __construct(UriValueLoader $valueLoader, PathExpansionChecker $pathExpansionChecker) + /** + * @var ValueObjectVisitorDispatcher + */ + private $visitorDispatcher; + + public function __construct( + UriValueLoader $valueLoader, + PathExpansionChecker $pathExpansionChecker, + ValueObjectVisitorDispatcher $visitorDispatcher) { $this->valueLoader = $valueLoader; $this->pathExpansionChecker = $pathExpansionChecker; + $this->visitorDispatcher = $visitorDispatcher; } /** @@ -42,7 +52,11 @@ public function visit(Visitor $visitor, Generator $generator, $data) if ($this->pathExpansionChecker->needsExpansion($generator->getStackPath())) { try { - $visitor->visitValueObject($this->valueLoader->load($data->link)); + $this->visitorDispatcher->visit( + $this->valueLoader->load($data->link), + $generator = new ExpansionGenerator($generator), + $visitor + ); } catch (ApiUnauthorizedException $e) { } } From b246106afaa8d755154dc769fd058879d2fb5b94 Mon Sep 17 00:00:00 2001 From: Bertrand Dunogier Date: Wed, 31 Aug 2016 11:16:22 +0200 Subject: [PATCH 10/14] EZP-26033: Added custom ExpansionGenerator, used in ResourceLink Visitor A decorator for the OutputGenerator that skips the root object element as well as its attributes. --- .../PathExpansion/ExpansionGenerator.php | 232 ++++++++++++++++++ .../ValueObjectVisitor/ResourceLink.php | 3 +- .../PathExpansion/ExpansionGeneratorTest.php | 12 +- 3 files changed, 242 insertions(+), 5 deletions(-) create mode 100644 eZ/Publish/Core/REST/Server/Output/PathExpansion/ExpansionGenerator.php diff --git a/eZ/Publish/Core/REST/Server/Output/PathExpansion/ExpansionGenerator.php b/eZ/Publish/Core/REST/Server/Output/PathExpansion/ExpansionGenerator.php new file mode 100644 index 00000000000..eb945762552 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/PathExpansion/ExpansionGenerator.php @@ -0,0 +1,232 @@ +innerGenerator = $generator; + } + + /** + * Not supported in this generator, as the context is always within a generated document. + * + * @param mixed $data + * + * @throws BadStateException + */ + public function startDocument($data) + { + throw new BadStateException( + 'generator', + 'start/endDocument can not be used with the ExpansionGenerator' + ); + } + + /** + * Returns if the document is empty or already contains data. + * + * @return bool + */ + public function isEmpty() + { + return $this->innerGenerator->isEmpty(); + } + + /** + * Not supported in this generator, as the context is always within a generated document. + * + * @param mixed $data + * + * @throws BadStateException + */ + public function endDocument($data) + { + throw new BadStateException('generator', 'start/endDocument can not be used with the ExpansionGenerator'); + } + + /** + * Start object element. + * If the element is the first added to this generator, it is silently skipped. + * Subsequent elements are started as expected. + * + * @param string $name + * @param string $mediaTypeName + */ + public function startObjectElement($name, $mediaTypeName = null) + { + $this->stack[] = $name; + + if (count($this->stack) > 1) { + $this->innerGenerator->startObjectElement($name, $mediaTypeName); + } + } + + /** + * End object element. + * + * @param string $name + */ + public function endObjectElement($name) + { + $objectElementName = array_pop($this->stack); + if (count($this->stack) > 0) { + $this->innerGenerator->endObjectElement($name); + } else { + if ($name !== $objectElementName) { + throw new OutputGeneratorException("Closing object element name doesn't match the opening one ($objectElementName)"); + } + } + } + + /** + * Start hash element. + * + * @param string $name + */ + public function startHashElement($name) + { + $this->innerGenerator->startHashElement($name); + } + + /** + * End hash element. + * + * @param string $name + */ + public function endHashElement($name) + { + $this->innerGenerator->endHashElement($name); + } + + /** + * Start value element. + * + * @param string $name + * @param string $value + */ + public function startValueElement($name, $value) + { + $this->innerGenerator->startValueElement($name, $value); + } + + /** + * End value element. + * + * @param string $name + */ + public function endValueElement($name) + { + $this->innerGenerator->endValueElement($name); + } + + /** + * Start list. + * + * @param string $name + */ + public function startList($name) + { + $this->innerGenerator->startList($name); + } + + /** + * End list. + * + * @param string $name + */ + public function endList($name) + { + $this->innerGenerator->endList($name); + } + + /** + * Start attribute. + * Skips the href and media-type attribute at stack depth 0. + * + * @param string $name + * @param string $value + */ + public function startAttribute($name, $value) + { + if (!in_array($name, ['href', 'media-type']) || count($this->stack) > 1) { + $this->innerGenerator->startAttribute($name, $value); + } + } + + /** + * End attribute. + * + * @param string $name + */ + public function endAttribute($name) + { + if (!in_array($name, ['href', 'media-type']) || count($this->stack) > 1) { + $this->innerGenerator->endAttribute($name); + } + } + + /** + * Get media type. + * + * @param string $name + * + * @return string + */ + public function getMediaType($name) + { + return $this->innerGenerator->getMediaType($name); + } + + /** + * Generates a generic representation of the scalar, hash or list given in + * $hashValue into the document, using an element of $hashElementName as + * its parent. + * + * @param string $hashElementName + * @param mixed $hashValue + */ + public function generateFieldTypeHash($hashElementName, $hashValue) + { + $this->innerGenerator->generateFieldTypeHash($hashElementName, $hashValue); + } + + /** + * Serializes a boolean value. + * + * @param bool $boolValue + * + * @return mixed + */ + public function serializeBool($boolValue) + { + return $this->innerGenerator->serializeBool($boolValue); + } + + public function getStackPath() + { + return $this->innerGenerator->getStackPath(); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php index dea41ae5d31..e456f962020 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php @@ -10,6 +10,7 @@ use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitorDispatcher; use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Output\PathExpansion\ExpansionGenerator; use eZ\Publish\Core\REST\Server\Output\PathExpansion\PathExpansionChecker; use eZ\Publish\Core\REST\Server\ValueLoaders\UriValueLoader; @@ -54,7 +55,7 @@ public function visit(Visitor $visitor, Generator $generator, $data) try { $this->visitorDispatcher->visit( $this->valueLoader->load($data->link), - $generator = new ExpansionGenerator($generator), + new ExpansionGenerator($generator), $visitor ); } catch (ApiUnauthorizedException $e) { diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/PathExpansion/ExpansionGeneratorTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/PathExpansion/ExpansionGeneratorTest.php index e00b399b955..0ad592d32c3 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/PathExpansion/ExpansionGeneratorTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/PathExpansion/ExpansionGeneratorTest.php @@ -146,15 +146,19 @@ public function testStartEndAttributeAtRoot() $this->getInnerGeneratorMock() ->expects($this->once()) - ->method('startAttribute'); + ->method('startAttribute') + ->with('jacket'); $this->getInnerGeneratorMock() - ->expects($this->never()) - ->method('endAttribute'); + ->expects($this->once()) + ->method('endAttribute') + ->with('jacket'); $this->buildGenerator()->startObjectElement('eccleston'); - $this->buildGenerator()->startAttribute('href', 'htt://google.cm'); + $this->buildGenerator()->startAttribute('href', 'http://ez.no'); $this->buildGenerator()->endAttribute('href'); + $this->buildGenerator()->startAttribute('media-type', 'application/planet.gallifrey.doctor'); + $this->buildGenerator()->endAttribute('media-type'); $this->buildGenerator()->startAttribute('jacket', 'leather'); $this->buildGenerator()->endAttribute('jacket'); } From 4e19cda20395a1838a51f5e06a5b7107bbb7f1ab Mon Sep 17 00:00:00 2001 From: Bertrand Dunogier Date: Thu, 1 Sep 2016 16:21:19 +0200 Subject: [PATCH 11/14] EZP-26033: add media-type argument to RestRouteReference ResourceLink and ValueLoader --- .../Output/ValueObjectVisitor/ResourceLink.php | 2 +- .../ResourceRouteReference.php | 3 ++- .../Output/ValueObjectVisitor/RestLocation.php | 7 +++++-- .../ValueLoaders/ControllerUriValueLoader.php | 6 +++++- .../REST/Server/ValueLoaders/UriValueLoader.php | 3 ++- .../Core/REST/Server/Values/ResourceLink.php | 10 +++++++++- .../Server/Values/ResourceRouteReference.php | 16 +++++++++++++++- 7 files changed, 39 insertions(+), 8 deletions(-) diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php index e456f962020..86aadc7ce4a 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php @@ -54,7 +54,7 @@ public function visit(Visitor $visitor, Generator $generator, $data) if ($this->pathExpansionChecker->needsExpansion($generator->getStackPath())) { try { $this->visitorDispatcher->visit( - $this->valueLoader->load($data->link), + $this->valueLoader->load($data->link, $data->mediaType ?: null), new ExpansionGenerator($generator), $visitor ); diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceRouteReference.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceRouteReference.php index ccf34670775..e977ffe5bbe 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceRouteReference.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceRouteReference.php @@ -25,7 +25,8 @@ public function visit(Visitor $visitor, Generator $generator, $data) $this->router->generate( $data->route, $data->loadParameters - ) + ), + isset($data->mediaTypeName) ? $generator->getMediaType($data->mediaTypeName) : null ) ); } diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestLocation.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestLocation.php index a1d84ecea75..03d7cde094c 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestLocation.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestLocation.php @@ -104,8 +104,11 @@ public function visit(Visitor $visitor, Generator $generator, $data) $visitor->visitValueObject( new ResourceRouteReference( 'ezpublish_rest_loadContent', - ['contentId' => $contentInfo->id] - ) + ['contentId' => $contentInfo->id], + 'Content' + ), + $generator, + $visitor ); $generator->endObjectElement('Content'); diff --git a/eZ/Publish/Core/REST/Server/ValueLoaders/ControllerUriValueLoader.php b/eZ/Publish/Core/REST/Server/ValueLoaders/ControllerUriValueLoader.php index dee728d9fe0..3504baa8cb8 100644 --- a/eZ/Publish/Core/REST/Server/ValueLoaders/ControllerUriValueLoader.php +++ b/eZ/Publish/Core/REST/Server/ValueLoaders/ControllerUriValueLoader.php @@ -37,11 +37,15 @@ public function __construct(RouterInterface $router, ControllerResolverInterface $this->controllerResolver = $controllerResolver; } - public function load($restResourceLink) + public function load($restResourceLink, $mediaType = null) { $request = Request::create($restResourceLink); $request->attributes->add($this->router->match($restResourceLink)); + if ($mediaType !== null) { + $request->headers->set('Accept', $mediaType); + } + $controller = $this->controllerResolver->getController($request); $arguments = $this->controllerResolver->getArguments($request, $controller); diff --git a/eZ/Publish/Core/REST/Server/ValueLoaders/UriValueLoader.php b/eZ/Publish/Core/REST/Server/ValueLoaders/UriValueLoader.php index ea08bb9990a..cb76f05765a 100644 --- a/eZ/Publish/Core/REST/Server/ValueLoaders/UriValueLoader.php +++ b/eZ/Publish/Core/REST/Server/ValueLoaders/UriValueLoader.php @@ -12,8 +12,9 @@ interface UriValueLoader { /** * @param string $uri REST URI to a value object. Ex: /api/ezp/v2/content/objects/1 + * @param string $mediaType The media-type to load, default if not specified. Ex: application/vnd.ez.api.Content+xml. * * @return \eZ\Publish\API\Repository\Values\ValueObject */ - public function load($uri); + public function load($uri, $mediaType = null); } diff --git a/eZ/Publish/Core/REST/Server/Values/ResourceLink.php b/eZ/Publish/Core/REST/Server/Values/ResourceLink.php index 718f5848bd2..7435363c3ff 100644 --- a/eZ/Publish/Core/REST/Server/Values/ResourceLink.php +++ b/eZ/Publish/Core/REST/Server/Values/ResourceLink.php @@ -11,6 +11,7 @@ * A link to a REST resource. * * @property string $link + * @property string $mediaType */ class ResourceLink extends ValueObject { @@ -22,8 +23,15 @@ class ResourceLink extends ValueObject */ protected $link; - public function __construct($link) + /** + * Resource media-type. If not specified, the default one is used. + * @var string|null + */ + protected $mediaType; + + public function __construct($link, $mediaType = null) { $this->link = $link; + $this->mediaType = $mediaType; } } diff --git a/eZ/Publish/Core/REST/Server/Values/ResourceRouteReference.php b/eZ/Publish/Core/REST/Server/Values/ResourceRouteReference.php index b8e95531946..fd0dd23d398 100644 --- a/eZ/Publish/Core/REST/Server/Values/ResourceRouteReference.php +++ b/eZ/Publish/Core/REST/Server/Values/ResourceRouteReference.php @@ -12,6 +12,7 @@ * * @property string $route * @property array $loadParameters + * @property string $mediaTypeName */ class ResourceRouteReference extends ValueObject { @@ -25,9 +26,22 @@ class ResourceRouteReference extends ValueObject */ protected $loadParameters; - public function __construct($route, $loadParameters) + /** + * The media-type name (ContentInfo, Location) of the resource. If null, the default will be used. + * @var null + */ + protected $mediaTypeName; + + /** + * ResourceRouteReference constructor. + * @param array $route + * @param $loadParameters + * @param string $mediaType The media-type name (ContentInfo, Location) of the resource. If null, the default will be used. + */ + public function __construct($route, $loadParameters, $mediaType = null) { $this->route = $route; $this->loadParameters = $loadParameters; + $this->mediaTypeName = $mediaType; } } From 432ae32f5d50a6095549895f426a93848b39f2bd Mon Sep 17 00:00:00 2001 From: Bertrand Dunogier Date: Fri, 2 Sep 2016 18:23:50 +0200 Subject: [PATCH 12/14] EZP-26033: Added value loader errors as attributes of the response --- .../Resources/config/services.yml | 5 + .../config/value_object_visitors.yml | 4 +- .../Exceptions/MultipleValueLoadException.php | 19 ++ .../ValueLoaders/UniqueUriValueLoader.php | 45 +++ .../ValueObjectVisitor/ResourceLink.php | 8 +- .../ValueLoaders/UniqueUriValueLoaderTest.php | 59 ++++ .../ValueObjectVisitor/ResourceLinkTest.php | 268 ++++++++++++++++++ 7 files changed, 405 insertions(+), 3 deletions(-) create mode 100644 eZ/Publish/Core/REST/Server/Output/PathExpansion/Exceptions/MultipleValueLoadException.php create mode 100644 eZ/Publish/Core/REST/Server/Output/PathExpansion/ValueLoaders/UniqueUriValueLoader.php create mode 100644 eZ/Publish/Core/REST/Server/Tests/Output/PathExpansion/ValueLoaders/UniqueUriValueLoaderTest.php create mode 100644 eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ResourceLinkTest.php diff --git a/eZ/Bundle/EzPublishRestBundle/Resources/config/services.yml b/eZ/Bundle/EzPublishRestBundle/Resources/config/services.yml index abed3fd9d96..95648bc7f5b 100644 --- a/eZ/Bundle/EzPublishRestBundle/Resources/config/services.yml +++ b/eZ/Bundle/EzPublishRestBundle/Resources/config/services.yml @@ -410,3 +410,8 @@ services: arguments: - '@router' - '@controller_resolver' + + ezpublish_rest.unique_controller_uri_value_loader: + class: eZ\Publish\Core\REST\Server\Output\PathExpansion\ValueLoaders\UniqueUriValueLoader + arguments: + - '@ezpublish_rest.controller_uri_value_loader' diff --git a/eZ/Bundle/EzPublishRestBundle/Resources/config/value_object_visitors.yml b/eZ/Bundle/EzPublishRestBundle/Resources/config/value_object_visitors.yml index 97eb7ba8fd5..3246885e13b 100644 --- a/eZ/Bundle/EzPublishRestBundle/Resources/config/value_object_visitors.yml +++ b/eZ/Bundle/EzPublishRestBundle/Resources/config/value_object_visitors.yml @@ -866,7 +866,7 @@ services: tags: - { name: ezpublish_rest.output.value_object_visitor, type: 'eZ\Publish\Core\REST\Server\Values\ResourceLink' } arguments: - - '@ezpublish_rest.controller_uri_value_loader' + - '@ezpublish_rest.unique_controller_uri_value_loader' - '@ezpublish_rest.output.path_expansion_checker.request_header' - '@ezpublish_rest.output.value_object_visitor.dispatcher' @@ -881,6 +881,6 @@ services: tags: - { name: ezpublish_rest.output.value_object_visitor, type: 'eZ\Publish\Core\REST\Server\Values\ResourceRouteReference' } arguments: - - '@ezpublish_rest.controller_uri_value_loader' + - '@ezpublish_rest.unique_controller_uri_value_loader' - '@ezpublish_rest.output.path_expansion_checker.request_header' - '@ezpublish_rest.output.value_object_visitor.dispatcher' diff --git a/eZ/Publish/Core/REST/Server/Output/PathExpansion/Exceptions/MultipleValueLoadException.php b/eZ/Publish/Core/REST/Server/Output/PathExpansion/Exceptions/MultipleValueLoadException.php new file mode 100644 index 00000000000..17d327ddf1e --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/PathExpansion/Exceptions/MultipleValueLoadException.php @@ -0,0 +1,19 @@ +innerLoader = $innerLoader; + } + + /** + * @param string $uri REST URI to a value object. Ex: /api/ezp/v2/content/objects/1 + * @param string $mediaType The media-type to load, default if not specified. Ex: application/vnd.ez.api.Content+xml. + * + * @return \eZ\Publish\API\Repository\Values\ValueObject + * + * @throws MultipleValueLoadException When load is called on an URI that was previously loaded (at instance level). + */ + public function load($uri, $mediaType = null) + { + if (isset($this->loadedUris[$uri]) && array_key_exists($mediaType, $this->loadedUris[$uri])) { + throw new MultipleValueLoadException(); + } + + $this->loadedUris[$uri][$mediaType] = true; + + return $this->innerLoader->load($uri, $mediaType); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php index 86aadc7ce4a..3f95778ecab 100644 --- a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceLink.php @@ -12,7 +12,8 @@ use eZ\Publish\Core\REST\Common\Output\Visitor; use eZ\Publish\Core\REST\Server\Output\PathExpansion\ExpansionGenerator; use eZ\Publish\Core\REST\Server\Output\PathExpansion\PathExpansionChecker; -use eZ\Publish\Core\REST\Server\ValueLoaders\UriValueLoader; +use eZ\Publish\Core\REST\Server\Output\PathExpansion\Exceptions\MultipleValueLoadException; +use eZ\Publish\Core\REST\Server\Output\PathExpansion\ValueLoaders\UriValueLoader; class ResourceLink extends ValueObjectVisitor { @@ -59,6 +60,11 @@ public function visit(Visitor $visitor, Generator $generator, $data) $visitor ); } catch (ApiUnauthorizedException $e) { + $generator->startAttribute('embed-error', $e->getMessage()); + $generator->endAttribute('embed-error'); + } catch (MultipleValueLoadException $e) { + $generator->startAttribute('embed-error', $e->getMessage()); + $generator->endAttribute('embed-error'); } } } diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/PathExpansion/ValueLoaders/UniqueUriValueLoaderTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/PathExpansion/ValueLoaders/UniqueUriValueLoaderTest.php new file mode 100644 index 00000000000..1abe2c93a74 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/PathExpansion/ValueLoaders/UniqueUriValueLoaderTest.php @@ -0,0 +1,59 @@ +buildLoader(); + + $returnValue = new stdClass(); + + $this->getInnerLoaderMock() + ->expects($this->exactly(2)) + ->method('load') + ->withConsecutive( + ['/doctors/david-tenant', null], + ['/doctors/david-tenant', 'application/other-type'] + ) + ->will($this->returnValue($returnValue)); + + self::assertEquals($returnValue, $loader->load('/doctors/david-tenant')); + self::assertEquals($returnValue, $loader->load('/doctors/david-tenant', 'application/other-type')); + $loader->load('/doctors/david-tenant'); + } + + /** + * @return \eZ\Publish\Core\REST\Server\Output\PathExpansion\ValueLoaders\UniqueUriValueLoader + */ + protected function buildLoader() + { + return new UniqueUriValueLoader($this->getInnerLoaderMock()); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|\eZ\Publish\Core\REST\Server\Output\PathExpansion\ValueLoaders\UriValueLoader + */ + protected function getInnerLoaderMock() + { + if (!isset($this->innerLoaderMock)) { + $this->innerLoaderMock = $this + ->getMockBuilder('eZ\Publish\Core\REST\Server\Output\PathExpansion\ValueLoaders\UriValueLoader') + ->getMock(); + } + + return $this->innerLoaderMock; + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ResourceLinkTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ResourceLinkTest.php new file mode 100644 index 00000000000..ce475519290 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ResourceLinkTest.php @@ -0,0 +1,268 @@ +getVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument(null); + $generator->startObjectElement('SomeRoot'); + $generator->startObjectElement('SomeObject'); + + $this->getPathExpansionCheckerMock() + ->expects($this->once()) + ->method('needsExpansion') + ->with('SomeRoot.SomeObject') + ->will($this->returnValue(true)); + + $this->getValueLoaderMock() + ->expects($this->once()) + ->method('load') + ->with($resourceLink->link, $resourceLink->mediaType) + ->will($this->returnValue($loadedValue = new \stdClass())); + + $this->getValueObjectVisitorDispatcherMock() + ->expects($this->once()) + ->method('visit') + ->with( + $loadedValue, + $this->isInstanceOf('eZ\Publish\Core\REST\Server\Output\PathExpansion\ExpansionGenerator'), + $this->getVisitorMock() + ); + + $visitor->visit($this->getVisitorMock(), $generator, $resourceLink); + + $generator->endObjectElement('SomeObject'); + $generator->endObjectElement('SomeRoot'); + + $result = $generator->endDocument(null); + + $this->assertNotNull($result); + + $dom = new \DOMDocument(); + $dom->loadXml($result); + + $this->assertXPath($dom, '//SomeObject[@href="' . $resourceLink->link . '"]'); + $this->assertXPath($dom, '//SomeObject[@media-type="application/vnd.ez.api.SomeObject+xml"]'); + } + + /** + * @param ResourceLinkValue $resourceLink + * @dataProvider buildValueObject + */ + public function testVisitWithNoExpansion(ResourceLinkValue $resourceLink) + { + $visitor = $this->getVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument(null); + $generator->startObjectElement('SomeRoot'); + $generator->startObjectElement('SomeObject'); + + $this->getPathExpansionCheckerMock() + ->expects($this->once()) + ->method('needsExpansion') + ->with('SomeRoot.SomeObject') + ->will($this->returnValue(false)); + + $this->getValueLoaderMock() + ->expects($this->never()) + ->method('load'); + + $this->getValueObjectVisitorDispatcherMock() + ->expects($this->never()) + ->method('visit'); + + $visitor->visit($this->getVisitorMock(), $generator, $resourceLink); + + $generator->endObjectElement('SomeObject'); + $generator->endObjectElement('SomeRoot'); + + $result = $generator->endDocument(null); + + $this->assertNotNull($result); + + $dom = new \DOMDocument(); + $dom->loadXml($result); + + $this->assertXPath($dom, '//SomeObject[@href="' . $resourceLink->link . '"]'); + $this->assertXPath($dom, '//SomeObject[@media-type="application/vnd.ez.api.SomeObject+xml"]'); + } + + /** + * @dataProvider buildValueObject + */ + public function testVisitUnauthorizedException(ResourceLinkValue $resourceLink) + { + $visitor = $this->getVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument(null); + $generator->startObjectElement('SomeRoot'); + $generator->startObjectElement('SomeObject'); + + $this->getPathExpansionCheckerMock() + ->expects($this->once()) + ->method('needsExpansion') + ->with('SomeRoot.SomeObject') + ->will($this->returnValue(true)); + + $this->getValueLoaderMock() + ->expects($this->once()) + ->method('load') + ->will($this->throwException(new UnauthorizedException('something', 'load'))); + + $this->getValueObjectVisitorDispatcherMock() + ->expects($this->never()) + ->method('visit'); + + $visitor->visit($this->getVisitorMock(), $generator, $resourceLink); + + $generator->endObjectElement('SomeObject'); + $generator->endObjectElement('SomeRoot'); + + $result = $generator->endDocument(null); + + $this->assertNotNull($result); + + $dom = new \DOMDocument(); + $dom->loadXml($result); + + $this->assertXPath($dom, '//SomeObject[@href="' . $resourceLink->link . '"]'); + $this->assertXPath($dom, '//SomeObject[@media-type="application/vnd.ez.api.SomeObject+xml"]'); + $this->assertXPath($dom, '//SomeObject[@embed-error="User does not have access to \'load\' \'something\'"]'); + } + + /** + * @dataProvider buildValueObject + */ + public function testVisitMultipleLoadException(ResourceLinkValue $resourceLink) + { + $visitor = $this->getVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument(null); + $generator->startObjectElement('SomeRoot'); + $generator->startObjectElement('SomeObject'); + + $this->getPathExpansionCheckerMock() + ->expects($this->once()) + ->method('needsExpansion') + ->with('SomeRoot.SomeObject') + ->will($this->returnValue(true)); + + $this->getValueLoaderMock() + ->expects($this->once()) + ->method('load') + ->will($this->throwException(new MultipleValueLoadException())); + + $this->getValueObjectVisitorDispatcherMock() + ->expects($this->never()) + ->method('visit'); + + $visitor->visit($this->getVisitorMock(), $generator, $resourceLink); + + $generator->endObjectElement('SomeObject'); + $generator->endObjectElement('SomeRoot'); + + $result = $generator->endDocument(null); + + $this->assertNotNull($result); + + $dom = new \DOMDocument(); + $dom->loadXml($result); + + $this->assertXPath($dom, '//SomeObject[@href="' . $resourceLink->link . '"]'); + $this->assertXPath($dom, '//SomeObject[@media-type="application/vnd.ez.api.SomeObject+xml"]'); + $this->assertXPath($dom, '//SomeObject[@embed-error="Value was already loaded"]'); + } + + public function testVisitCircularLoadException() + { + self::markTestIncomplete('@todo Implement feature'); + } + + public function buildValueObject() + { + return [ + [new ResourceLinkValue('/api/ezp/v2/resource')], + ]; + } + + /** + * Must return an instance of the tested visitor object. + * + * @return \eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor + */ + protected function internalGetVisitor() + { + return new ResourceLink( + $this->getValueLoaderMock(), + $this->getPathExpansionCheckerMock(), + $this->getValueObjectVisitorDispatcherMock() + ); + } + + /** + * @return \eZ\Publish\Core\REST\Server\ValueLoaders\UriValueLoader|\PHPUnit_Framework_MockObject_MockObject + */ + protected function getValueLoaderMock() + { + if ($this->valueLoaderMock === null) { + $this->valueLoaderMock = $this + ->getMockBuilder('eZ\Publish\Core\REST\Server\ValueLoaders\UriValueLoader') + ->getMock(); + } + + return $this->valueLoaderMock; + } + + /** + * @return \eZ\Publish\Core\REST\Server\Output\PathExpansion\PathExpansionChecker|\PHPUnit_Framework_MockObject_MockObject + */ + protected function getPathExpansionCheckerMock() + { + if ($this->pathExpansionCheckerMock === null) { + $this->pathExpansionCheckerMock = $this + ->getMockBuilder('eZ\Publish\Core\REST\Server\Output\PathExpansion\PathExpansionChecker') + ->getMock(); + } + + return $this->pathExpansionCheckerMock; + } + + /** + * @return \eZ\Publish\Core\REST\Common\Output\ValueObjectVisitorDispatcher|\PHPUnit_Framework_MockObject_MockObject + */ + protected function getValueObjectVisitorDispatcherMock() + { + if ($this->valueObjectVisitorDispatcherMock === null) { + $this->valueObjectVisitorDispatcherMock = $this + ->getMockBuilder('eZ\Publish\Core\REST\Common\Output\ValueObjectVisitorDispatcher') + ->getMock(); + } + + return $this->valueObjectVisitorDispatcherMock; + } +} From 12b837d01006cd308a8fb2530b6948c36eca3a6c Mon Sep 17 00:00:00 2001 From: Bertrand Dunogier Date: Fri, 2 Sep 2016 22:12:48 +0200 Subject: [PATCH 13/14] EZP-26033: Renamed PathExpansion ValueLoaders --- eZ/Bundle/EzPublishRestBundle/Resources/config/services.yml | 2 +- .../ValueLoaders/ControllerUriValueLoader.php | 2 +- .../PathExpansion}/ValueLoaders/UriValueLoader.php | 2 +- .../ValueLoaders/ControllerUriValueLoaderTest.php | 6 +++--- .../Tests/Output/ValueObjectVisitor/ResourceLinkTest.php | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) rename eZ/Publish/Core/REST/Server/{ => Output/PathExpansion}/ValueLoaders/ControllerUriValueLoader.php (96%) rename eZ/Publish/Core/REST/Server/{ => Output/PathExpansion}/ValueLoaders/UriValueLoader.php (89%) rename eZ/Publish/Core/REST/Server/Tests/{ => Output/PathExpansion}/ValueLoaders/ControllerUriValueLoaderTest.php (91%) diff --git a/eZ/Bundle/EzPublishRestBundle/Resources/config/services.yml b/eZ/Bundle/EzPublishRestBundle/Resources/config/services.yml index 95648bc7f5b..0358194ec22 100644 --- a/eZ/Bundle/EzPublishRestBundle/Resources/config/services.yml +++ b/eZ/Bundle/EzPublishRestBundle/Resources/config/services.yml @@ -406,7 +406,7 @@ services: - [ setOption, [ strict_requirements, ~ ] ] ezpublish_rest.controller_uri_value_loader: - class: eZ\Publish\Core\REST\Server\ValueLoaders\ControllerUriValueLoader + class: eZ\Publish\Core\REST\Server\Output\PathExpansion\ValueLoaders\ControllerUriValueLoader arguments: - '@router' - '@controller_resolver' diff --git a/eZ/Publish/Core/REST/Server/ValueLoaders/ControllerUriValueLoader.php b/eZ/Publish/Core/REST/Server/Output/PathExpansion/ValueLoaders/ControllerUriValueLoader.php similarity index 96% rename from eZ/Publish/Core/REST/Server/ValueLoaders/ControllerUriValueLoader.php rename to eZ/Publish/Core/REST/Server/Output/PathExpansion/ValueLoaders/ControllerUriValueLoader.php index 3504baa8cb8..17ac92e281f 100644 --- a/eZ/Publish/Core/REST/Server/ValueLoaders/ControllerUriValueLoader.php +++ b/eZ/Publish/Core/REST/Server/Output/PathExpansion/ValueLoaders/ControllerUriValueLoader.php @@ -5,7 +5,7 @@ * @copyright Copyright (C) eZ Systems AS. All rights reserved. * @license For full copyright and license information view LICENSE file distributed with this source code. */ -namespace eZ\Publish\Core\REST\Server\ValueLoaders; +namespace eZ\Publish\Core\REST\Server\Output\PathExpansion\ValueLoaders; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; diff --git a/eZ/Publish/Core/REST/Server/ValueLoaders/UriValueLoader.php b/eZ/Publish/Core/REST/Server/Output/PathExpansion/ValueLoaders/UriValueLoader.php similarity index 89% rename from eZ/Publish/Core/REST/Server/ValueLoaders/UriValueLoader.php rename to eZ/Publish/Core/REST/Server/Output/PathExpansion/ValueLoaders/UriValueLoader.php index cb76f05765a..b1d8569d61f 100644 --- a/eZ/Publish/Core/REST/Server/ValueLoaders/UriValueLoader.php +++ b/eZ/Publish/Core/REST/Server/Output/PathExpansion/ValueLoaders/UriValueLoader.php @@ -3,7 +3,7 @@ * @copyright Copyright (C) eZ Systems AS. All rights reserved. * @license For full copyright and license information view LICENSE file distributed with this source code. */ -namespace eZ\Publish\Core\REST\Server\ValueLoaders; +namespace eZ\Publish\Core\REST\Server\Output\PathExpansion\ValueLoaders; /** * A value object loader that uses the rest URI as an argument. diff --git a/eZ/Publish/Core/REST/Server/Tests/ValueLoaders/ControllerUriValueLoaderTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/PathExpansion/ValueLoaders/ControllerUriValueLoaderTest.php similarity index 91% rename from eZ/Publish/Core/REST/Server/Tests/ValueLoaders/ControllerUriValueLoaderTest.php rename to eZ/Publish/Core/REST/Server/Tests/Output/PathExpansion/ValueLoaders/ControllerUriValueLoaderTest.php index 53223272114..361de22a729 100644 --- a/eZ/Publish/Core/REST/Server/Tests/ValueLoaders/ControllerUriValueLoaderTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/PathExpansion/ValueLoaders/ControllerUriValueLoaderTest.php @@ -3,16 +3,16 @@ * @copyright Copyright (C) eZ Systems AS. All rights reserved. * @license For full copyright and license information view LICENSE file distributed with this source code. */ -namespace eZ\Publish\Core\REST\Server\Tests\ValueLoaders; +namespace eZ\Publish\Core\REST\Server\Tests\Output\PathExpansion\ValueLoaders; -use eZ\Publish\Core\REST\Server\ValueLoaders\ControllerUriValueLoader; +use eZ\Publish\Core\REST\Server\Output\PathExpansion\ValueLoaders\ControllerUriValueLoader; use PHPUnit_Framework_TestCase; use Symfony\Component\HttpFoundation\Response; class ControllerUriValueLoaderTest extends PHPUnit_Framework_TestCase { /** - * @var \eZ\Publish\Core\REST\Server\ValueLoaders\ControllerUriValueLoader + * @var \eZ\Publish\Core\REST\Server\Output\PathExpansion\ValueLoaders\ControllerUriValueLoader */ private $loader; diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ResourceLinkTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ResourceLinkTest.php index ce475519290..a7a198c552b 100644 --- a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ResourceLinkTest.php +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ResourceLinkTest.php @@ -225,13 +225,13 @@ protected function internalGetVisitor() } /** - * @return \eZ\Publish\Core\REST\Server\ValueLoaders\UriValueLoader|\PHPUnit_Framework_MockObject_MockObject + * @return \eZ\Publish\Core\REST\Server\Output\PathExpansion\ValueLoaders\UriValueLoader|\PHPUnit_Framework_MockObject_MockObject */ protected function getValueLoaderMock() { if ($this->valueLoaderMock === null) { $this->valueLoaderMock = $this - ->getMockBuilder('eZ\Publish\Core\REST\Server\ValueLoaders\UriValueLoader') + ->getMockBuilder('eZ\Publish\Core\REST\Server\Output\PathExpansion\ValueLoaders\UriValueLoader') ->getMock(); } From 77c6903ef715095082980554e5c33626be06a3b5 Mon Sep 17 00:00:00 2001 From: Bertrand Dunogier Date: Mon, 5 Sep 2016 14:10:33 +0200 Subject: [PATCH 14/14] EZP-26033: Resource embedding functional test case --- .../Functional/ResourceEmbeddingTest.php | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 eZ/Bundle/EzPublishRestBundle/Tests/Functional/ResourceEmbeddingTest.php diff --git a/eZ/Bundle/EzPublishRestBundle/Tests/Functional/ResourceEmbeddingTest.php b/eZ/Bundle/EzPublishRestBundle/Tests/Functional/ResourceEmbeddingTest.php new file mode 100644 index 00000000000..3ce1d2862e5 --- /dev/null +++ b/eZ/Bundle/EzPublishRestBundle/Tests/Functional/ResourceEmbeddingTest.php @@ -0,0 +1,41 @@ +createHttpRequest('GET', '/api/ezp/v2/content/objects/1'); + $request->addHeader('x-ez-embed-value: Content.MainLocation,Content.Owner.Section'); + + $response = $this->sendHttpRequest($request); + + self::assertHttpResponseCodeEquals($response, 200); + + $doc = new \DOMDocument(); + $doc->loadXML($response->getContent()); + + $this->assertXPath($doc, '/Content/MainLocation/id'); + $this->assertXPath($doc, '/Content/Owner/name'); + $this->assertXPath($doc, '/Content/Owner/Section/sectionId'); + } + + protected function assertXPath(\DOMDocument $document, $xpathExpression) + { + $xpath = new \DOMXPath($document); + + $this->assertTrue( + $xpath->evaluate("boolean({$xpathExpression})"), + "XPath expression '{$xpathExpression}' resulted in an empty node set." + ); + } +}