Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
AbstractController.php
Go to the documentation of this file.
1 <?php
11 
17 use Magento\Framework\App\Request\Http as HttpRequest;
19 
24 abstract class AbstractController extends \PHPUnit\Framework\TestCase
25 {
26  protected $_runCode = '';
27 
28  protected $_runScope = 'store';
29 
30  protected $_runOptions = [];
31 
35  protected $_request;
36 
40  protected $_response;
41 
45  protected $_objectManager;
46 
52  protected $_assertSessionErrors = false;
53 
59  protected function _getBootstrap()
60  {
61  return \Magento\TestFramework\Helper\Bootstrap::getInstance();
62  }
63 
67  protected function setUp()
68  {
69  $this->_assertSessionErrors = false;
71  $this->_objectManager->removeSharedInstance(\Magento\Framework\App\ResponseInterface::class);
72  $this->_objectManager->removeSharedInstance(\Magento\Framework\App\RequestInterface::class);
73  }
74 
78  protected function tearDown()
79  {
80  $this->_request = null;
81  $this->_response = null;
82  $this->_objectManager = null;
83  }
84 
88  protected function assertPostConditions()
89  {
90  if ($this->_assertSessionErrors) {
91  // equalTo() is intentionally used instead of isEmpty() to provide the informative diff
92  $this->assertSessionMessages(
93  $this->equalTo([]),
94  \Magento\Framework\Message\MessageInterface::TYPE_ERROR
95  );
96  }
97  }
98 
104  public function dispatch($uri)
105  {
107  $request = $this->getRequest();
108  $request->setRequestUri($uri);
109  if ($request->isPost()
110  && !array_key_exists('form_key', $request->getPost())
111  ) {
113  $formKey = $this->_objectManager->get(FormKey::class);
114  $request->setPostValue('form_key', $formKey->getFormKey());
115  }
116  $this->_getBootstrap()->runApp();
117  }
118 
124  public function getRequest()
125  {
126  if (!$this->_request) {
127  $this->_request = $this->_objectManager->get(\Magento\Framework\App\RequestInterface::class);
128  }
129  return $this->_request;
130  }
131 
137  public function getResponse()
138  {
139  if (!$this->_response) {
140  $this->_response = $this->_objectManager->get(\Magento\Framework\App\ResponseInterface::class);
141  }
142  return $this->_response;
143  }
144 
148  public function assert404NotFound()
149  {
150  $this->assertEquals('noroute', $this->getRequest()->getControllerName());
151  $this->assertContains('404 Not Found', $this->getResponse()->getBody());
152  }
153 
161  public function assertHeaderPcre($headerName, $valueRegex)
162  {
163  $headerFound = false;
164  $headers = $this->getResponse()->getHeaders();
165  foreach ($headers as $header) {
166  if ($header->getFieldName() === $headerName) {
167  $headerFound = true;
168  $this->assertRegExp($valueRegex, $header->getFieldValue());
169  }
170  }
171  if (!$headerFound) {
172  $this->fail("Header '{$headerName}' was not found. Headers dump:\n" . var_export($headers, 1));
173  }
174  }
175 
187  public function assertRedirect(\PHPUnit\Framework\Constraint\Constraint $urlConstraint = null)
188  {
189  $this->assertTrue($this->getResponse()->isRedirect(), 'Redirect was expected, but none was performed.');
190  if ($urlConstraint) {
191  $actualUrl = '';
192  foreach ($this->getResponse()->getHeaders() as $header) {
193  if ($header->getFieldName() == 'Location') {
194  $actualUrl = $header->getFieldValue();
195  break;
196  }
197  }
198  $this->assertThat($actualUrl, $urlConstraint, 'Redirection URL does not match expectations');
199  }
200  }
201 
214  public function assertSessionMessages(
215  \PHPUnit\Framework\Constraint\Constraint $constraint,
216  $messageType = null,
217  $messageManagerClass = \Magento\Framework\Message\Manager::class
218  ) {
219  $this->_assertSessionErrors = false;
221  $messages = $this->getMessages($messageType, $messageManagerClass);
223  $messagesFiltered = array_map(
224  function ($message) {
226  return ($message instanceof MessageInterface) ? $message->toString() : $message;
227  },
228  $messages
229  );
230 
231  $this->assertThat(
232  $messagesFiltered,
233  $constraint,
234  'Session messages do not meet expectations ' . var_export($messagesFiltered, true)
235  );
236  }
237 
245  protected function getMessages(
246  $messageType = null,
247  $messageManagerClass = \Magento\Framework\Message\Manager::class
248  ) {
249  return array_merge(
250  $this->getSessionMessages($messageType, $messageManagerClass),
251  $this->getCookieMessages($messageType)
252  );
253  }
254 
262  protected function getSessionMessages(
263  $messageType = null,
264  $messageManagerClass = \Magento\Framework\Message\Manager::class
265  ) {
267  $messageManager = $this->_objectManager->get($messageManagerClass);
269  if ($messageType === null) {
270  $messages = $messageManager->getMessages()->getItems();
271  } else {
272  $messages = $messageManager->getMessages()->getItemsByType($messageType);
273  }
274 
276  $interpretationStrategy = $this->_objectManager->get(InterpretationStrategyInterface::class);
277 
278  $actualMessages = [];
279  foreach ($messages as $message) {
280  $actualMessages[] = $interpretationStrategy->interpret($message);
281  }
282 
283  return $actualMessages;
284  }
285 
292  protected function getCookieMessages($messageType = null)
293  {
295  $cookieManager = $this->_objectManager->get(CookieManagerInterface::class);
296 
298  $jsonSerializer = $this->_objectManager->get(\Magento\Framework\Serialize\Serializer\Json::class);
299  try {
300  $messages = $jsonSerializer->unserialize(
301  $cookieManager->getCookie(
303  $jsonSerializer->serialize([])
304  )
305  );
306 
307  if (!is_array($messages)) {
308  $messages = [];
309  }
310  } catch (\InvalidArgumentException $e) {
311  $messages = [];
312  }
313 
314  $actualMessages = [];
315  foreach ($messages as $message) {
316  if ($messageType === null || $message['type'] == $messageType) {
317  $actualMessages[] = $message['text'];
318  }
319  }
320 
321  return $actualMessages;
322  }
323 }
assertRedirect(\PHPUnit\Framework\Constraint\Constraint $urlConstraint=null)
$message
getMessages( $messageType=null, $messageManagerClass=\Magento\Framework\Message\Manager::class)