HookOrderTest.php

Same filename in this branch
  1. 11.x core/tests/Drupal/Tests/Core/Hook/HookOrderTest.php

Namespace

Drupal\KernelTests\Core\Hook

File

core/tests/Drupal/KernelTests/Core/Hook/HookOrderTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\KernelTests\Core\Hook;

use Drupal\aaa_hook_order_test\Hook\AHooks;
use Drupal\bbb_hook_order_test\Hook\BHooks;
use Drupal\ccc_hook_order_test\Hook\CHooks;
use Drupal\ddd_hook_order_test\Hook\DHooks;
use Drupal\KernelTests\KernelTestBase;

/**
 * @group Hook
 * @group legacy
 */
class HookOrderTest extends KernelTestBase {
    use HookOrderTestTrait;
    
    /**
     * {@inheritdoc}
     */
    protected static $modules = [
        'aaa_hook_order_test',
        'bbb_hook_order_test',
        'ccc_hook_order_test',
        'ddd_hook_order_test',
    ];
    
    /**
     * Test hook implementation order.
     */
    public function testHookOrder() : void {
        $this->assertSameCallList([
            CHooks::class . '::testHookReorderFirst',
            CHooks::class . '::testHookFirst',
            AHooks::class . '::testHookFirst',
            'aaa_hook_order_test_test_hook',
            AHooks::class . '::testHook',
            'bbb_hook_order_test_test_hook',
            BHooks::class . '::testHook',
            AHooks::class . '::testHookAfterB',
            'ccc_hook_order_test_test_hook',
            CHooks::class . '::testHook',
            'ddd_hook_order_test_test_hook',
            DHooks::class . '::testHook',
            AHooks::class . '::testHookLast',
        ], \Drupal::moduleHandler()->invokeAll('test_hook'));
    }
    
    /**
     * Tests hook order when each module has either oop or procedural listeners.
     *
     * This would detect a possible mistake where we would first collect modules
     * from all procedural and then from all oop implementations, without fixing
     * the order.
     */
    public function testSparseHookOrder() : void {
        $this->assertSameCallList([
            // OOP and procedural listeners are correctly intermixed by module
            // order.
'aaa_hook_order_test_sparse_test_hook',
            BHooks::class . '::sparseTestHook',
            'ccc_hook_order_test_sparse_test_hook',
            DHooks::class . '::sparseTestHook',
        ], \Drupal::moduleHandler()->invokeAll('sparse_test_hook'));
    }
    
    /**
     * Tests hook order when both parameters are passed to RelativeOrderBase.
     *
     * This tests when both $modules and $classesAndMethods are passed as
     * parameters to OrderAfter.
     */
    public function testBothParametersHookOrder() : void {
        $this->assertSameCallList([
            BHooks::class . '::testBothParametersHook',
            CHooks::class . '::testBothParametersHook',
            AHooks::class . '::testBothParametersHook',
        ], \Drupal::moduleHandler()->invokeAll('test_both_parameters_hook'));
    }

}

Classes

Title Deprecated Summary
HookOrderTest @group Hook @group legacy

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.