I’m setting up a controller on Drupal 8 which should redirect to the home page if certain query parameters aren’t set. Writing a test to make sure that the redirect happens correctly took longer than expected. After trying a number of different approaches, I finally figured it out.
Normally you would check if a page is the front page using the path matcher service:
$path_matcher = \Drupal::service('path.matcher'); $is_front = $path_matcher->isFrontPage();
This didn’t seem to work when running PHPUnit tests though. For some reason, the site was redirecting to /user
(despite my controller returning a redirect response to /
).
That meant my tests were all failing. I spent most of today trying to track down a solution until I finally came across an issue on Drupal.org: “User cancel link doesn’t redirect to the homepage” – not quite what I was looking for, but it was fixed in 8.6-dev, which suggested there might be tests to check the redirect.
There in the patch was a useful assertion to check the current address:
+ // Confirm that the user was redirected to the front page. + $this->assertSession()->addressEquals('');
Pop that into my test and it works like a charm:
public function testDirectAccessNoParameters() { // If no parameters are provided, expect a redirect. $this->drupalGet('add-product'); $this->assertSession()->addressEquals(''); }
And the output of my test:
sophie@Belgaer:$ fin phpunit --group=current_tests WARNING: No swap limit support PHPUnit 6.5.10 by Sebastian Bergmann and contributors. Testing . 1 / 1 (100%) Time: 36.78 seconds, Memory: 914.50MB OK (1 test, 3 assertions)
Bingo!