public function setUp() { $this->resource = $resource = new Resource(); $this->controller = $controller = new ResourceController(); $controller->setResource($resource); $this->matches = $matches = new RouteMatch(array()); $this->query = $query = new Parameters(); $this->request = $request = new Request(); $request->setQuery($query); $this->event = new MvcEvent(); $this->event->setTarget($controller); $this->event->setRouteMatch($matches); $this->event->setRequest($request); $this->listener = new ResourceParametersListener(); }
/** * Loop through configuration to discover and set controller options. * * @param array $config * @param ResourceController $controller */ protected function setControllerOptions(array $config, ResourceController $controller) { foreach ($config as $option => $value) { switch ($option) { case 'accept_criteria': $controller->setAcceptCriteria($value); break; case 'collection_http_options': $controller->setCollectionHttpOptions($value); break; case 'collection_name': $controller->setCollectionName($value); break; case 'collection_query_whitelist': if (is_string($value)) { $value = (array) $value; } if (!is_array($value)) { break; } // Create a listener that checks the query string against // the whitelisted query parameters in order to seed the // collection route options. $whitelist = $value; $controller->getEventManager()->attach('getList.post', function ($e) use($whitelist) { $request = $e->getTarget()->getRequest(); if (!method_exists($request, 'getQuery')) { return; } $query = $request->getQuery(); $params = array(); foreach ($query as $key => $value) { if (!in_array($key, $whitelist)) { continue; } $params[$key] = $value; } if (empty($params)) { return; } $collection = $e->getParam('collection'); $collection->setCollectionRouteOptions(array('query' => $params)); }); break; case 'content_types': $controller->setContentTypes($value); break; case 'identifier_name': $controller->setIdentifierName($value); break; case 'page_size': $controller->setPageSize($value); break; case 'page_size_param': $controller->setPageSizeParam($value); break; case 'resource_http_options': $controller->setResourceHttpOptions($value); break; case 'route_name': $controller->setRoute($value); break; } } }
/** * @expectedException \PhlyRestfully\Exception\DomainException */ public function testGetResourceThrowsExceptionOnMissingResource() { $controller = new ResourceController(); $controller->getResource(); }
public function testChildResourceObjectIdentiferMappingInCollectionsViaControllerReturn() { $this->setUpAlternateRouter(); $resource = new Resource(); $resource->getEventManager()->attach('fetchAll', function ($e) { return array((object) array('id' => 'luke', 'name' => 'Luke Skywalker'), (object) array('id' => 'leia', 'name' => 'Leia Organa')); }); $controller = new ResourceController(); $controller->setPluginManager($this->plugins); $controller->setResource($resource); $controller->setRoute('parent/child'); $controller->setIdentifierName('child_id'); $controller->setCollectionName('children'); $r = new ReflectionObject($controller); $m = $r->getMethod('getIdentifier'); $m->setAccessible(true); $uri = 'http://localhost.localdomain/api/parent/anakin/child'; $request = new Request(); $request->setUri($uri); $matches = $this->router->match($request); $this->assertInstanceOf('Zend\\Mvc\\Router\\RouteMatch', $matches); $this->assertEquals('anakin', $matches->getParam('id')); $this->assertNull($matches->getParam('child_id')); $this->assertEquals('parent/child', $matches->getMatchedRouteName()); // Emulate url helper factory and inject route matches $this->helpers->get('url')->setRouteMatch($matches); $result = $controller->getList(); $this->assertInstanceOf('PhlyRestfully\\HalCollection', $result); // Now, what happens if we render this? $model = new RestfulJsonModel(); $model->setPayload($result); $json = $this->renderer->render($model); $test = json_decode($json); $this->assertObjectHasAttribute('_links', $test); $this->assertObjectHasAttribute('self', $test->_links); $this->assertObjectHasAttribute('href', $test->_links->self); $this->assertEquals('http://localhost.localdomain/api/parent/anakin/child', $test->_links->self->href); $this->assertObjectHasAttribute('_embedded', $test); $this->assertObjectHasAttribute('children', $test->_embedded); $this->assertInternalType('array', $test->_embedded->children); foreach ($test->_embedded->children as $child) { $this->assertObjectHasAttribute('_links', $child); $this->assertObjectHasAttribute('self', $child->_links); $this->assertObjectHasAttribute('href', $child->_links->self); $this->assertRegexp('#^http://localhost.localdomain/api/parent/anakin/child/[^/]+$#', $child->_links->self->href); } }