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);
     }
 }