From 9ba65aa25f869a7f3a7cc5d69b007121ca775e75 Mon Sep 17 00:00:00 2001 From: Alex Pott <alex.a.pott@googlemail.com> Date: Mon, 7 Sep 2015 15:42:21 +0100 Subject: [PATCH] Issue #2463659 by andypost, Wim Leers, rpayanm, Fabianx, googletorp: Regression test coverage: integration test for an uncacheable menu link that depends on session data --- ...nuTranslateTest.php => MenuAccessTest.php} | 25 ++++++++++---- .../menu_test/menu_test.links.menu.yml | 5 +++ .../modules/menu_test/menu_test.routing.yml | 9 +++++ .../modules/menu_test/menu_test.services.yml | 5 +++ .../menu_test/src/Access/AccessCheck.php | 33 +++++++++++++++++++ .../modules/menu_test/src/TestControllers.php | 11 +++++++ 6 files changed, 82 insertions(+), 6 deletions(-) rename core/modules/system/src/Tests/Menu/{MenuTranslateTest.php => MenuAccessTest.php} (57%) create mode 100644 core/modules/system/tests/modules/menu_test/src/Access/AccessCheck.php diff --git a/core/modules/system/src/Tests/Menu/MenuTranslateTest.php b/core/modules/system/src/Tests/Menu/MenuAccessTest.php similarity index 57% rename from core/modules/system/src/Tests/Menu/MenuTranslateTest.php rename to core/modules/system/src/Tests/Menu/MenuAccessTest.php index 3641ab1fb0dd..8867dcb390c2 100644 --- a/core/modules/system/src/Tests/Menu/MenuTranslateTest.php +++ b/core/modules/system/src/Tests/Menu/MenuAccessTest.php @@ -2,7 +2,7 @@ /** * @file - * Contains \Drupal\system\Tests\Menu\MenuTranslateTest. + * Contains \Drupal\system\Tests\Menu\MenuAccessTest. */ namespace Drupal\system\Tests\Menu; @@ -11,12 +11,11 @@ use Drupal\simpletest\WebTestBase; /** - * Tests the _menu_translate() method. + * Tests the route access checks on menu links. * * @group Menu - * @see _menu_translate(). */ -class MenuTranslateTest extends WebTestBase { +class MenuAccessTest extends WebTestBase { /** * Modules to enable. @@ -35,9 +34,23 @@ protected function setUp() { } /** - * Tests _menu_translate(). + * Tests menu link for route with access check. + * + * @see \Drupal\menu_test\Access\AccessCheck::access() */ - public function testMenuTranslate() { + public function testMenuBlockLinksAccessCheck() { + $this->drupalPlaceBlock('system_menu_block:account'); + // Test that there's link rendered on the route. + $this->drupalGet('menu_test_access_check_session'); + $this->assertLink('Test custom route access check'); + // Page still accessible but thre should not be menu link. + $this->drupalGet('menu_test_access_check_session'); + $this->assertResponse(200); + $this->assertNoLink('Test custom route access check'); + // Test that page is no more accessible. + $this->drupalGet('menu_test_access_check_session'); + $this->assertResponse(403); + // Check for access to a restricted local task from a default local task. $this->drupalGet('foo/asdf'); $this->assertResponse(200); diff --git a/core/modules/system/tests/modules/menu_test/menu_test.links.menu.yml b/core/modules/system/tests/modules/menu_test/menu_test.links.menu.yml index 613bc9211776..eecd42c9a1da 100644 --- a/core/modules/system/tests/modules/menu_test/menu_test.links.menu.yml +++ b/core/modules/system/tests/modules/menu_test/menu_test.links.menu.yml @@ -83,3 +83,8 @@ menu_test.child: menu_test.unsafe: route_name: menu_test.menu_name_test deriver: '\Drupal\menu_test\Plugin\Derivative\MenuLinkTestWithUnsafeTitle' + +menu_test.access_check: + title: 'Test custom route access check' + route_name: menu_test.router_test_session + menu_name: account diff --git a/core/modules/system/tests/modules/menu_test/menu_test.routing.yml b/core/modules/system/tests/modules/menu_test/menu_test.routing.yml index b69d72259bc2..751bdf7bc41d 100644 --- a/core/modules/system/tests/modules/menu_test/menu_test.routing.yml +++ b/core/modules/system/tests/modules/menu_test/menu_test.routing.yml @@ -74,6 +74,15 @@ menu_test.router_test4: requirements: _access: 'TRUE' +menu_test.router_test_session: + path: '/menu_test_access_check_session' + defaults: + _controller: '\Drupal\menu_test\TestControllers::testSession' + options: + no_cache: TRUE + requirements: + _menu_test_session_access: 'TRUE' + menu_test.local_action1: path: '/menu-test-local-action' defaults: diff --git a/core/modules/system/tests/modules/menu_test/menu_test.services.yml b/core/modules/system/tests/modules/menu_test/menu_test.services.yml index 8841320535a9..81f1f50b9578 100644 --- a/core/modules/system/tests/modules/menu_test/menu_test.services.yml +++ b/core/modules/system/tests/modules/menu_test/menu_test.services.yml @@ -3,3 +3,8 @@ services: class: Drupal\menu_test\Theme\TestThemeNegotiator tags: - { name: theme_negotiator } + + access_check.menu_test_session: + class: Drupal\menu_test\Access\AccessCheck + tags: + - { name: access_check, applies_to: _menu_test_session_access } diff --git a/core/modules/system/tests/modules/menu_test/src/Access/AccessCheck.php b/core/modules/system/tests/modules/menu_test/src/Access/AccessCheck.php new file mode 100644 index 000000000000..c6b9054a1704 --- /dev/null +++ b/core/modules/system/tests/modules/menu_test/src/Access/AccessCheck.php @@ -0,0 +1,33 @@ +<?php +/** + * @file + * Contains \Drupal\menu_test\Access\AccessCheck. + */ + +namespace Drupal\menu_test\Access; + +use Drupal\Core\Access\AccessResult; +use Drupal\Core\Routing\Access\AccessInterface; + +/** + * Checks access based on the 'menu_test' key in session. + */ +class AccessCheck implements AccessInterface { + + /** + * Check to see if user accessed this page. + * + * @return \Drupal\Core\Access\AccessResultInterface + * The access result. + */ + public function access() { + if (!isset($_SESSION['menu_test'])) { + $result = AccessResult::allowed(); + } + else { + $result = AccessResult::allowedIf($_SESSION['menu_test'] < 2); + } + return $result->setCacheMaxAge(0); + } + +} diff --git a/core/modules/system/tests/modules/menu_test/src/TestControllers.php b/core/modules/system/tests/modules/menu_test/src/TestControllers.php index 2a91286412ce..364c77b01651 100644 --- a/core/modules/system/tests/modules/menu_test/src/TestControllers.php +++ b/core/modules/system/tests/modules/menu_test/src/TestControllers.php @@ -36,6 +36,17 @@ public function test2() { return ['#markup' => 'test2']; } + /** + * Prints out test data. + */ + public function testSession() { + if (!isset($_SESSION['menu_test'])) { + $_SESSION['menu_test'] = 0; + } + $_SESSION['menu_test']++; + return ['#markup' => SafeMarkup::format('Session menu_test is @count', ['@count' => $_SESSION['menu_test']])]; + } + /** * Prints out test data. */ -- GitLab