public function testInvoke()
 {
     $var = 'bar';
     Debug::dump($var);
     $system = System::init([], true);
     $view = $this->getMock(View::CLASS, ['render']);
     $services = new Services();
     $services->set('System', $system);
     $services->set('View', $view);
     $this->setServices($services);
     $html = '<body></body>';
     $stream = Stream::make($html);
     $response = new Response(200, $stream, ['Content-Type' => ['text/html']]);
     $event = new SystemEvent();
     $event->setResult(SystemEvent::FINISH, $response);
     $model = new ViewModel();
     $listener = new InjectDumpListener();
     $listener->setModel($model);
     $view->expects($this->once())->method('render')->with($this->identicalTo($model))->will($this->returnValue('foo'));
     $listener($event);
     $this->assertTrue(isset($model['dumps']));
     $this->assertSame($model['dumps'], Debug::getDumpInstances());
     $injected = $event->getResult(SystemEvent::FINISH);
     $this->assertInstanceOf(Response::CLASS, $injected);
     $body = $injected->getBody();
     $this->assertSame('<body>foo</body>', (string) $body);
 }
 /**
  * @dataProvider invalidResponseDataProvider
  */
 public function testInvokeRaiseExceptionIfEventResultIsNotPsrResponse($response)
 {
     $event = new SystemEvent();
     $event->setResult(SystemEvent::FINISH, $response);
     $listener = new ResponseListener();
     $this->setExpectedException('UnexpectedValueException');
     $listener($event);
 }
Ejemplo n.º 3
0
 /**
  * Creates the view model.
  *
  * @param SystemEvent $event The system event
  */
 public function __invoke(SystemEvent $event)
 {
     $result = $event->getResult(SystemEvent::DISPATCH);
     if (false !== $result && !$result instanceof ViewModelInterface && !$result instanceof ResponseInterface) {
         $model = new ViewModel($result);
         $event->setResult(SystemEvent::DISPATCH, $model);
     }
 }
Ejemplo n.º 4
0
 /**
  * Injects the view model to Layout.
  *
  * @param \Es\System\SystemEvent $event The system event
  */
 public function __invoke(SystemEvent $event)
 {
     $result = $event->getResult(SystemEvent::DISPATCH);
     if ($result instanceof ViewModelInterface) {
         $view = $this->getView();
         $layout = $view->getLayout();
         $layout->addChild($result);
     }
 }
Ejemplo n.º 5
0
 /**
  * Renders the view.
  *
  * @param \Es\System\SystemEvent $event The system event
  */
 public function __invoke(SystemEvent $event)
 {
     $view = $this->getView();
     $layout = $view->getLayout();
     $result = $view->render($layout);
     $contentType = $layout->getContentType();
     $server = $this->getServer();
     $response = $server->getResponse()->withHeader('Content-Type', $contentType)->withBody(Stream::make($result));
     $event->setResult(SystemEvent::FINISH, $response);
 }
Ejemplo n.º 6
0
 /**
  * Sends a response to client.
  *
  * @param \Es\System\SystemEvent $event The system event
  *
  * @throws \UnexpectedValueException If the final result of a system event
  *                                   is not PSR Response
  */
 public function __invoke(SystemEvent $event)
 {
     $result = $event->getResult(SystemEvent::FINISH);
     if (!$result instanceof ResponseInterface) {
         throw new UnexpectedValueException(sprintf('The system event provided invalid final result; must be ' . 'an instance of "%s", "%s" received.', ResponseInterface::CLASS, is_object($result) ? get_class($result) : gettype($result)));
     }
     $server = $this->getServer();
     $emitter = $server->getEmitter();
     $emitter->emit($result);
 }
Ejemplo n.º 7
0
 public function testConstructor()
 {
     $name = 'Foo';
     $context = 'Bar';
     $params = ['baz' => 'bat'];
     $event = new SystemEvent($name, $context, $params);
     $this->assertSame($name, $event->getName());
     $this->assertSame($context, $event->getContext());
     $this->assertSame($params, $event->getParams());
 }
 public function testInvoke()
 {
     $result = ['foo' => 'bar', 'bat' => 'baz'];
     $event = new SystemEvent();
     $event->setResult(SystemEvent::DISPATCH, $result);
     $listener = new CreateModelListener();
     $listener($event);
     $model = $event->getResult(SystemEvent::DISPATCH);
     $this->assertInstanceOf(ViewModel::CLASS, $model);
     $this->assertSame($result, $model->getVariables());
 }
Ejemplo n.º 9
0
 /**
  * Processes the response.
  *
  * @param \Psr\Http\Message\ResponseInterface $response The response
  * @param \Es\System\SystemEvent              $event    The system event
  */
 public function processResponse(ResponseInterface $response, SystemEvent $event)
 {
     if ($event->getName() === SystemEvent::FINISH) {
         $event->stopPropagation(true);
         $server = $this->getServer();
         $emitter = $server->getEmitter();
         $emitter->emit($response);
         return;
     }
     $events = $this->getEvents();
     $event->setResult(SystemEvent::FINISH, $response);
     $events->trigger($event(SystemEvent::FINISH));
 }
Ejemplo n.º 10
0
 /**
  * Handles an error in development mode.
  *
  * @param \Es\System\SystemEvent $systemEvent The system event
  * @param \Exception|\Error      $exception   The exception or the error
  */
 public function handleDevelopmentError(SystemEvent $systemEvent, $exception)
 {
     $options = ['exception' => $exception, 'eventName' => $systemEvent->getName()];
     $renderer = $this->getRenderer();
     $result = $renderer->render('error/development', $options);
     $body = Stream::make($result);
     $status = 503;
     if ($exception instanceof ExceptionInterface && $exception->getCode()) {
         $status = $exception->getCode();
     }
     $response = new Response($status, $body, ['Content-Type' => 'text/html']);
     $this->processResponse($response, $systemEvent);
 }
Ejemplo n.º 11
0
 /**
  * Removes from the response of type "text/html" the blank lines.
  *
  * @param \Es\System\SystemEvent $event The system event
  */
 public function __invoke(SystemEvent $event)
 {
     $result = $event->getResult(SystemEvent::FINISH);
     if ($result instanceof ResponseInterface) {
         $contentType = $result->getHeaderLine('Content-Type');
         if (0 === strpos($contentType, 'text/html')) {
             $body = (string) $result->getBody();
             $cleaned = preg_replace("#(\\s)*(\n)+(\r)*#", "\n", $body);
             $stream = Stream::make($cleaned);
             $event->setResult(SystemEvent::FINISH, $result->withBody($stream));
         }
     }
 }
Ejemplo n.º 12
0
 public function testInvokeOnSuccess()
 {
     $view = new View();
     $listener = new InjectModelListener();
     $listener->setView($view);
     $event = new SystemEvent();
     $model = new ViewModel();
     $event->setResult(SystemEvent::DISPATCH, $model);
     $listener($event);
     $layout = $view->getLayout();
     $iterator = $layout->getIterator();
     $array = iterator_to_array($iterator);
     $this->assertContains($model, $array);
 }
Ejemplo n.º 13
0
 public function testInvokeWithTextHtmlContent()
 {
     $source = "Lorem ipsum\n\n dolor sit amet,\n\n\n consectetur adipiscing elit";
     $expected = "Lorem ipsum\n dolor sit amet,\n consectetur adipiscing elit";
     $body = Stream::make($source);
     $headers = ['Content-type' => ['text/html']];
     $response = new Response(200, $body, $headers);
     $event = new SystemEvent();
     $event->setResult(SystemEvent::FINISH, $response);
     $listener = new ClearOutputListener();
     $listener($event);
     $result = $event->getResult(SystemEvent::FINISH);
     $this->assertInstanceOf(ResponseInterface::CLASS, $result);
     $this->assertSame($expected, (string) $result->getBody());
 }
 public function testInvokeOnSuccess()
 {
     $server = new Server();
     $request = $server->getRequest();
     $server->setRequest($request->withAttribute('action', 'foo'));
     $model = new ViewModel();
     $model->setModule(__NAMESPACE__);
     $event = new SystemEvent();
     $event->setResult(SystemEvent::DISPATCH, $model);
     $event->setContext(new FakeController());
     $listener = new InjectTemplateListener();
     $listener->setServer($server);
     $listener($event);
     $this->assertSame('fake/foo', $model->getTemplate());
 }
Ejemplo n.º 15
0
 /**
  * Injects the template name to a view model.
  *
  * @param \Es\System\SystemEvent $event The system event
  *
  * @throws \RuntimeException         If the module namespace is not specified
  * @throws \UnexpectedValueException If the context of system event is
  *                                   not object
  */
 public function __invoke(SystemEvent $event)
 {
     $result = $event->getResult(SystemEvent::DISPATCH);
     if ($result instanceof ViewModelInterface && !$result->getTemplate()) {
         $module = $result->getModule();
         if (!$module) {
             throw new RuntimeException('Unable to resolve template for View Model. ' . 'The module namespace is not specified.');
         }
         $context = $event->getContext();
         if (!is_object($context)) {
             throw new UnexpectedValueException(sprintf('Invalid context of system event; must be an object, ' . '"%s" received.', gettype($context)));
         }
         $template = $this->resolveTemplate($context, $module);
         $result->setTemplate($template);
     }
 }
Ejemplo n.º 16
0
 /**
  * Injects the module namespace of the dispatched controller to a view model
  * and to layout.
  *
  * @param \Es\System\SystemEvent $event The system event
  *
  * @throws \UnexpectedValueException If the context of system event is
  *                                   not object
  */
 public function __invoke(SystemEvent $event)
 {
     $context = $event->getContext();
     if (!is_object($context)) {
         throw new UnexpectedValueException(sprintf('Invalid context of system event; must be an object, ' . '"%s" received.', gettype($context)));
     }
     $module = $this->resolveModule($context);
     $view = $this->getView();
     $layout = $view->getLayout();
     if (!$layout->getModule()) {
         $layout->setModule($module);
     }
     $result = $event->getResult(SystemEvent::DISPATCH);
     if ($result instanceof ViewModelInterface && !$result->getModule()) {
         $result->setModule($module);
     }
 }
Ejemplo n.º 17
0
 public function testHandleDevelopmentErrorWithSpecifiedStatus()
 {
     $renderer = $this->getMock(ErrorRenderer::CLASS);
     $events = $this->getMock(Events::CLASS);
     $strategy = new HtmlErrorStrategy();
     $strategy->setRenderer($renderer);
     $strategy->setEvents($events);
     $event = new SystemEvent('Foo');
     $exception = new FakeException('Foo', 405);
     $content = 'Lorem ipsum dolor sit amet';
     $renderer->expects($this->once())->method('render')->with($this->identicalTo('error/development'), $this->identicalTo(['exception' => $exception, 'eventName' => $event->getName()]))->will($this->returnValue($content));
     $events->expects($this->once())->method('trigger')->with($this->identicalTo($event));
     $strategy->handleDevelopmentError($event, $exception);
     $response = $event->getResult(SystemEvent::FINISH);
     $this->assertInstanceOf(ResponseInterface::CLASS, $response);
     $this->assertSame($content, (string) $response->getBody());
     $this->assertSame('text/html', $response->getHeaderLine('Content-Type'));
     $this->assertSame(405, $response->getStatusCode());
 }
Ejemplo n.º 18
0
 /**
  * Creates the report about debugging dump.
  *
  * @param \Es\System\SystemEvent $event The system event
  */
 public function __invoke(SystemEvent $event)
 {
     $system = $this->getSystem();
     if ($system->isDevMode()) {
         $result = $event->getResult(SystemEvent::FINISH);
         if ($result instanceof ResponseInterface) {
             $contentType = $result->getHeaderLine('Content-Type');
             if (0 === strpos($contentType, 'text/html')) {
                 $model = $this->getModel();
                 $view = $this->getView();
                 $model['dumps'] = Debug::getDumpInstances();
                 $injection = $view->render($model);
                 $body = (string) $result->getBody();
                 $html = str_replace('</body>', $injection . '</body>', $body);
                 $stream = Stream::make($html);
                 $event->setResult(SystemEvent::FINISH, $result->withBody($stream));
             }
         }
     }
 }
 /**
  * Triggers the DispatchEvent.
  *
  * @param \Es\System\SystemEvent $event The system event
  *
  * @throws \RuntimeException If the ServerRequest not contain the
  *                           "controller" attribute
  */
 public function onDispatch(SystemEvent $event)
 {
     $server = $this->getServer();
     $request = $server->getRequest();
     $controllerName = $request->getAttribute('controller');
     if (!$controllerName) {
         throw new RuntimeException('Unable to dispatch the system event, the server request not ' . 'contains the "controller" attribute.');
     }
     $actionName = $request->getAttribute('action', 'index');
     $events = $this->getEvents();
     $controllers = $this->getControllers();
     $controller = $controllers->get($controllerName);
     $event->setContext($controller);
     $dispatchEvent = new DispatchEvent($controller, $controllerName, $actionName, $event->getParams());
     $events->trigger($dispatchEvent);
     $result = $dispatchEvent->getResult();
     $target = SystemEvent::DISPATCH;
     if ($result instanceof ResponseInterface) {
         $target = SystemEvent::FINISH;
     }
     $event->setResult($target, $result);
 }
 public function testInvokeOnSuccess()
 {
     $modules = new Modules();
     $module = $this->getMock(AbstractModule::CLASS);
     $modules->set(__NAMESPACE__, $module);
     $view = new View();
     $listener = new InjectModuleListener();
     $listener->setModules($modules);
     $listener->setView($view);
     $event = new SystemEvent();
     $model = new ViewModel();
     $controller = new FakeController();
     $event->setContext($controller);
     $event->setResult(SystemEvent::DISPATCH, $model);
     $listener($event);
     $layout = $view->getLayout();
     $this->assertSame(__NAMESPACE__, $layout->getModule());
     $this->assertSame(__NAMESPACE__, $model->getModule());
 }
Ejemplo n.º 21
0
 public function __invoke(SystemEvent $event)
 {
     $event->setResult(SystemEvent::INIT, true);
 }