class ConfigEntityQueryTest

Same name in other branches
  1. 9 core/tests/Drupal/KernelTests/Core/Entity/ConfigEntityQueryTest.php \Drupal\KernelTests\Core\Entity\ConfigEntityQueryTest
  2. 8.9.x core/tests/Drupal/KernelTests/Core/Entity/ConfigEntityQueryTest.php \Drupal\KernelTests\Core\Entity\ConfigEntityQueryTest
  3. 11.x core/tests/Drupal/KernelTests/Core/Entity/ConfigEntityQueryTest.php \Drupal\KernelTests\Core\Entity\ConfigEntityQueryTest

Tests Config Entity Query functionality.

@group Entity

Hierarchy

Expanded class hierarchy of ConfigEntityQueryTest

See also

\Drupal\Core\Config\Entity\Query

File

core/tests/Drupal/KernelTests/Core/Entity/ConfigEntityQueryTest.php, line 18

Namespace

Drupal\KernelTests\Core\Entity
View source
class ConfigEntityQueryTest extends KernelTestBase {
    
    /**
     * {@inheritdoc}
     */
    protected static $modules = [
        'config_test',
    ];
    
    /**
     * Stores the search results for alter comparison.
     *
     * @var array
     */
    protected $queryResults;
    
    /**
     * The query factory used to construct all queries in the test.
     *
     * @var \Drupal\Core\Config\Entity\Query\QueryFactory
     */
    protected $factory;
    
    /**
     * The config entity storage used for testing.
     */
    protected ConfigEntityStorageInterface $entityStorage;
    
    /**
     * Stores all config entities created for the test.
     *
     * @var array
     */
    protected $entities;
    
    /**
     * {@inheritdoc}
     */
    protected function setUp() : void {
        parent::setUp();
        $this->entities = [];
        $this->entityStorage = $this->container
            ->get('entity_type.manager')
            ->getStorage('config_query_test');
        // These two are here to make sure that matchArray needs to go over several
        // non-matches on every levels.
        $array['level1']['level2a'] = 9;
        $array['level1a']['level2'] = 9;
        // The tests match array.level1.level2.
        $array['level1']['level2'] = 1;
        $entity = ConfigQueryTest::create([
            'label' => 'entity_1',
            'id' => '1',
            'number' => 31,
            'array' => $array,
        ]);
        $this->entities[] = $entity;
        $entity->enforceIsNew();
        $entity->save();
        $array['level1']['level2'] = 2;
        $entity = ConfigQueryTest::create([
            'label' => 'entity_2',
            'id' => '2',
            'number' => 41,
            'array' => $array,
        ]);
        $this->entities[] = $entity;
        $entity->enforceIsNew();
        $entity->save();
        $array['level1']['level2'] = 1;
        $entity = ConfigQueryTest::create([
            'label' => 'test_prefix_entity_3',
            'id' => '3',
            'number' => 59,
            'array' => $array,
        ]);
        $this->entities[] = $entity;
        $entity->enforceIsNew();
        $entity->save();
        $array['level1']['level2'] = 2;
        $entity = ConfigQueryTest::create([
            'label' => 'entity_4_test_suffix',
            'id' => '4',
            'number' => 26,
            'array' => $array,
        ]);
        $this->entities[] = $entity;
        $entity->enforceIsNew();
        $entity->save();
        $array['level1']['level2'] = 3;
        $entity = ConfigQueryTest::create([
            'label' => 'entity_5_TEST_contains_entity_5',
            'id' => '5',
            'number' => 53,
            'array' => $array,
        ]);
        $this->entities[] = $entity;
        $entity->enforceIsNew();
        $entity->save();
        $array['level1'] = [];
        $entity = ConfigQueryTest::create([
            'label' => $this->randomMachineName(),
            'id' => '6',
            'array' => $array,
        ]);
        $this->entities[] = $entity;
        $entity->enforceIsNew();
        $entity->save();
        $array['level1']['level2'] = 4;
        $entity = ConfigQueryTest::create([
            'label' => $this->randomMachineName(),
            'id' => '7',
            'number' => 70,
            'array' => $array,
        ]);
        $this->entities[] = $entity;
        $entity->enforceIsNew();
        $entity->save();
    }
    
    /**
     * Tests basic functionality.
     */
    public function testConfigEntityQuery() : void {
        // Run a test without any condition.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->execute();
        $this->assertResults([
            '1',
            '2',
            '3',
            '4',
            '5',
            '6',
            '7',
        ]);
        // No conditions, OR.
        $this->queryResults = $this->entityStorage
            ->getQuery('OR')
            ->execute();
        $this->assertResults([
            '1',
            '2',
            '3',
            '4',
            '5',
            '6',
            '7',
        ]);
        // Filter by ID with equality.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', '3')
            ->execute();
        $this->assertResults([
            '3',
        ]);
        // Filter by label with a known prefix.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('label', 'test_prefix', 'STARTS_WITH')
            ->execute();
        $this->assertResults([
            '3',
        ]);
        // Filter by label with a known suffix.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('label', 'test_suffix', 'ENDS_WITH')
            ->execute();
        $this->assertResults([
            '4',
        ]);
        // Filter by label with a known containing word.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('label', 'test_contains', 'CONTAINS')
            ->execute();
        $this->assertResults([
            '5',
        ]);
        // Filter by ID with the IN operator.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', [
            '2',
            '3',
        ], 'IN')
            ->execute();
        $this->assertResults([
            '2',
            '3',
        ]);
        // Filter by ID with the implicit IN operator.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', [
            '2',
            '3',
        ])
            ->execute();
        $this->assertResults([
            '2',
            '3',
        ]);
        // Filter by ID with the > operator.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', '3', '>')
            ->execute();
        $this->assertResults([
            '4',
            '5',
            '6',
            '7',
        ]);
        // Filter by ID with the >= operator.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', '3', '>=')
            ->execute();
        $this->assertResults([
            '3',
            '4',
            '5',
            '6',
            '7',
        ]);
        // Filter by ID with the <> operator.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', '3', '<>')
            ->execute();
        $this->assertResults([
            '1',
            '2',
            '4',
            '5',
            '6',
            '7',
        ]);
        // Filter by ID with the < operator.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', '3', '<')
            ->execute();
        $this->assertResults([
            '1',
            '2',
        ]);
        // Filter by ID with the <= operator.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', '3', '<=')
            ->execute();
        $this->assertResults([
            '1',
            '2',
            '3',
        ]);
        // Filter by two conditions on the same field.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('label', 'test_pref', 'STARTS_WITH')
            ->condition('label', 'test_prefix', 'STARTS_WITH')
            ->execute();
        $this->assertResults([
            '3',
        ]);
        // Filter by two conditions on different fields. The first query matches for
        // a different ID, so the result is empty.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('label', 'test_prefix', 'STARTS_WITH')
            ->condition('id', '5')
            ->execute();
        $this->assertResults([]);
        // Filter by two different conditions on different fields. This time the
        // first condition matches on one item, but the second one does as well.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('label', 'test_prefix', 'STARTS_WITH')
            ->condition('id', '3')
            ->execute();
        $this->assertResults([
            '3',
        ]);
        // Filter by two different conditions, of which the first one matches for
        // every entry, the second one as well, but just the third one filters so
        // that just two are left.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', '1', '>=')
            ->condition('number', 10, '>=')
            ->condition('number', 50, '>=')
            ->execute();
        $this->assertResults([
            '3',
            '5',
            '7',
        ]);
        // Filter with an OR condition group.
        $this->queryResults = $this->entityStorage
            ->getQuery('OR')
            ->condition('id', 1)
            ->condition('id', '2')
            ->execute();
        $this->assertResults([
            '1',
            '2',
        ]);
        // Simplify it with IN.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', [
            '1',
            '2',
        ])
            ->execute();
        $this->assertResults([
            '1',
            '2',
        ]);
        // Try explicit IN.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', [
            '1',
            '2',
        ], 'IN')
            ->execute();
        $this->assertResults([
            '1',
            '2',
        ]);
        // Try not IN.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', [
            '1',
            '2',
        ], 'NOT IN')
            ->execute();
        $this->assertResults([
            '3',
            '4',
            '5',
            '6',
            '7',
        ]);
        // Filter with an OR condition group on different fields.
        $this->queryResults = $this->entityStorage
            ->getQuery('OR')
            ->condition('id', 1)
            ->condition('number', 41)
            ->execute();
        $this->assertResults([
            '1',
            '2',
        ]);
        // Filter with an OR condition group on different fields but matching on the
        // same entity.
        $this->queryResults = $this->entityStorage
            ->getQuery('OR')
            ->condition('id', 1)
            ->condition('number', 31)
            ->execute();
        $this->assertResults([
            '1',
        ]);
        // NO simple conditions, YES complex conditions, 'AND'.
        $query = $this->entityStorage
            ->getQuery('AND');
        $and_condition_1 = $query->orConditionGroup()
            ->condition('id', '2')
            ->condition('label', $this->entities[0]->label);
        $and_condition_2 = $query->orConditionGroup()
            ->condition('id', 1)
            ->condition('label', $this->entities[3]->label);
        $this->queryResults = $query->condition($and_condition_1)
            ->condition($and_condition_2)
            ->execute();
        $this->assertResults([
            '1',
        ]);
        // NO simple conditions, YES complex conditions, 'OR'.
        $query = $this->entityStorage
            ->getQuery('OR');
        $and_condition_1 = $query->andConditionGroup()
            ->condition('id', 1)
            ->condition('label', $this->entities[0]->label);
        $and_condition_2 = $query->andConditionGroup()
            ->condition('id', '2')
            ->condition('label', $this->entities[1]->label);
        $this->queryResults = $query->condition($and_condition_1)
            ->condition($and_condition_2)
            ->execute();
        $this->assertResults([
            '1',
            '2',
        ]);
        // YES simple conditions, YES complex conditions, 'AND'.
        $query = $this->entityStorage
            ->getQuery('AND');
        $and_condition_1 = $query->orConditionGroup()
            ->condition('id', '2')
            ->condition('label', $this->entities[0]->label);
        $and_condition_2 = $query->orConditionGroup()
            ->condition('id', 1)
            ->condition('label', $this->entities[3]->label);
        $this->queryResults = $query->condition('number', 31)
            ->condition($and_condition_1)
            ->condition($and_condition_2)
            ->execute();
        $this->assertResults([
            '1',
        ]);
        // YES simple conditions, YES complex conditions, 'OR'.
        $query = $this->entityStorage
            ->getQuery('OR');
        $and_condition_1 = $query->orConditionGroup()
            ->condition('id', '2')
            ->condition('label', $this->entities[0]->label);
        $and_condition_2 = $query->orConditionGroup()
            ->condition('id', 1)
            ->condition('label', $this->entities[3]->label);
        $this->queryResults = $query->condition('number', 53)
            ->condition($and_condition_1)
            ->condition($and_condition_2)
            ->execute();
        $this->assertResults([
            '1',
            '2',
            '4',
            '5',
        ]);
        // Test the exists and notExists conditions.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->exists('id')
            ->execute();
        $this->assertResults([
            '1',
            '2',
            '3',
            '4',
            '5',
            '6',
            '7',
        ]);
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->exists('non-existent')
            ->execute();
        $this->assertResults([]);
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->notExists('id')
            ->execute();
        $this->assertResults([]);
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->notExists('non-existent')
            ->execute();
        $this->assertResults([
            '1',
            '2',
            '3',
            '4',
            '5',
            '6',
            '7',
        ]);
    }
    
    /**
     * Tests ID conditions.
     */
    public function testStringIdConditions() : void {
        // We need an entity with a non-numeric ID.
        $entity = ConfigQueryTest::create([
            'label' => 'entity_1',
            'id' => 'foo.bar',
        ]);
        $this->entities[] = $entity;
        $entity->enforceIsNew();
        $entity->save();
        // Test 'STARTS_WITH' condition.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', 'foo.bar', 'STARTS_WITH')
            ->execute();
        $this->assertResults([
            'foo.bar',
        ]);
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', 'f', 'STARTS_WITH')
            ->execute();
        $this->assertResults([
            'foo.bar',
        ]);
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', 'miss', 'STARTS_WITH')
            ->execute();
        $this->assertResults([]);
        // Test 'CONTAINS' condition.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', 'foo.bar', 'CONTAINS')
            ->execute();
        $this->assertResults([
            'foo.bar',
        ]);
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', 'oo.ba', 'CONTAINS')
            ->execute();
        $this->assertResults([
            'foo.bar',
        ]);
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', 'miss', 'CONTAINS')
            ->execute();
        $this->assertResults([]);
        // Test 'ENDS_WITH' condition.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', 'foo.bar', 'ENDS_WITH')
            ->execute();
        $this->assertResults([
            'foo.bar',
        ]);
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', 'r', 'ENDS_WITH')
            ->execute();
        $this->assertResults([
            'foo.bar',
        ]);
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', 'miss', 'ENDS_WITH')
            ->execute();
        $this->assertResults([]);
    }
    
    /**
     * Tests count query.
     */
    public function testCount() : void {
        // Test count on no conditions.
        $count = $this->entityStorage
            ->getQuery()
            ->count()
            ->execute();
        $this->assertCount($count, $this->entities);
        // Test count on a complex query.
        $query = $this->entityStorage
            ->getQuery('OR');
        $and_condition_1 = $query->andConditionGroup()
            ->condition('id', 1)
            ->condition('label', $this->entities[0]->label);
        $and_condition_2 = $query->andConditionGroup()
            ->condition('id', '2')
            ->condition('label', $this->entities[1]->label);
        $count = $query->condition($and_condition_1)
            ->condition($and_condition_2)
            ->count()
            ->execute();
        $this->assertSame(2, $count);
    }
    
    /**
     * Tests sorting and range on config entity queries.
     */
    public function testSortRange() : void {
        // Sort by simple ascending/descending.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->sort('number', 'DESC')
            ->execute();
        $this->assertSame([
            '7',
            '3',
            '5',
            '2',
            '1',
            '4',
            '6',
        ], array_values($this->queryResults));
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->sort('number', 'ASC')
            ->execute();
        $this->assertSame([
            '6',
            '4',
            '1',
            '2',
            '5',
            '3',
            '7',
        ], array_values($this->queryResults));
        // Apply some filters and sort.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', '3', '>')
            ->sort('number', 'DESC')
            ->execute();
        $this->assertSame([
            '7',
            '5',
            '4',
            '6',
        ], array_values($this->queryResults));
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('id', '3', '>')
            ->sort('number', 'ASC')
            ->execute();
        $this->assertSame([
            '6',
            '4',
            '5',
            '7',
        ], array_values($this->queryResults));
        // Apply a pager and sort.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->sort('number', 'DESC')
            ->range('2', '2')
            ->execute();
        $this->assertSame([
            '5',
            '2',
        ], array_values($this->queryResults));
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->sort('number', 'ASC')
            ->range('2', '2')
            ->execute();
        $this->assertSame([
            '1',
            '2',
        ], array_values($this->queryResults));
        // Add a range to a query without a start parameter.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->range(0, '3')
            ->sort('id', 'ASC')
            ->execute();
        $this->assertSame([
            '1',
            '2',
            '3',
        ], array_values($this->queryResults));
        // Omit optional parameters for the range and sort.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->range()
            ->sort('id')
            ->execute();
        $this->assertSame([
            '1',
            '2',
            '3',
            '4',
            '5',
            '6',
            '7',
        ], array_values($this->queryResults));
        // Explicitly pass NULL for the range and sort.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->range(NULL, NULL)
            ->sort('id')
            ->execute();
        $this->assertSame([
            '1',
            '2',
            '3',
            '4',
            '5',
            '6',
            '7',
        ], array_values($this->queryResults));
        // Omit the optional start parameter for the range.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->range(NULL, 1)
            ->sort('id')
            ->execute();
        $this->assertSame([
            '1',
        ], array_values($this->queryResults));
        // Omit the optional length parameter for the range.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->range(4)
            ->sort('id')
            ->execute();
        $this->assertSame([
            '5',
            '6',
            '7',
        ], array_values($this->queryResults));
        // Request an empty range.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->range(0, 0)
            ->execute();
        $this->assertEmpty($this->queryResults);
        // Apply a pager with limit 4.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->pager('4', 0)
            ->sort('id', 'ASC')
            ->execute();
        $this->assertSame([
            '1',
            '2',
            '3',
            '4',
        ], array_values($this->queryResults));
    }
    
    /**
     * Tests sorting with tableSort on config entity queries.
     */
    public function testTableSort() : void {
        $header = [
            [
                'data' => 'ID',
                'specifier' => 'id',
            ],
            [
                'data' => 'Number',
                'specifier' => 'number',
            ],
        ];
        // Sort key: id
        // Sorting with 'DESC' upper case
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->tableSort($header)
            ->sort('id', 'DESC')
            ->execute();
        $this->assertSame([
            '7',
            '6',
            '5',
            '4',
            '3',
            '2',
            '1',
        ], array_values($this->queryResults));
        // Sorting with 'ASC' upper case
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->tableSort($header)
            ->sort('id', 'ASC')
            ->execute();
        $this->assertSame([
            '1',
            '2',
            '3',
            '4',
            '5',
            '6',
            '7',
        ], array_values($this->queryResults));
        // Sorting with 'desc' lower case
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->tableSort($header)
            ->sort('id', 'desc')
            ->execute();
        $this->assertSame([
            '7',
            '6',
            '5',
            '4',
            '3',
            '2',
            '1',
        ], array_values($this->queryResults));
        // Sorting with 'asc' lower case
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->tableSort($header)
            ->sort('id', 'asc')
            ->execute();
        $this->assertSame([
            '1',
            '2',
            '3',
            '4',
            '5',
            '6',
            '7',
        ], array_values($this->queryResults));
        // Sort key: number
        // Sorting with 'DeSc' mixed upper and lower case
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->tableSort($header)
            ->sort('number', 'DeSc')
            ->execute();
        $this->assertSame([
            '7',
            '3',
            '5',
            '2',
            '1',
            '4',
            '6',
        ], array_values($this->queryResults));
        // Sorting with 'AsC' mixed upper and lower case
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->tableSort($header)
            ->sort('number', 'AsC')
            ->execute();
        $this->assertSame([
            '6',
            '4',
            '1',
            '2',
            '5',
            '3',
            '7',
        ], array_values($this->queryResults));
        // Sorting with 'dEsC' mixed upper and lower case
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->tableSort($header)
            ->sort('number', 'dEsC')
            ->execute();
        $this->assertSame([
            '7',
            '3',
            '5',
            '2',
            '1',
            '4',
            '6',
        ], array_values($this->queryResults));
        // Sorting with 'aSc' mixed upper and lower case
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->tableSort($header)
            ->sort('number', 'aSc')
            ->execute();
        $this->assertSame([
            '6',
            '4',
            '1',
            '2',
            '5',
            '3',
            '7',
        ], array_values($this->queryResults));
    }
    
    /**
     * Tests dotted path matching.
     */
    public function testDotted() : void {
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('array.level1.*', 1)
            ->execute();
        $this->assertResults([
            '1',
            '3',
        ]);
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('*.level1.level2', 2)
            ->execute();
        $this->assertResults([
            '2',
            '4',
        ]);
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('array.level1.*', 3)
            ->execute();
        $this->assertResults([
            '5',
        ]);
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('array.level1.level2', 3)
            ->execute();
        $this->assertResults([
            '5',
        ]);
        // Test dotted sorting.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->sort('array.level1.level2')
            ->execute();
        $this->assertResults([
            '6',
            '1',
            '3',
            '2',
            '4',
            '5',
            '7',
        ]);
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->sort('array.level1.level2', 'DESC')
            ->execute();
        $this->assertResults([
            '7',
            '5',
            '2',
            '4',
            '1',
            '3',
            '6',
        ]);
        // Make sure that values on the wildcard level do not match if there are
        // sub-keys defined. This must not find anything even if entity 2 has a
        // top-level key number with value 41.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('*.level1.level2', 41)
            ->execute();
        $this->assertResults([]);
        // Make sure that "IS NULL" and "IS NOT NULL" work correctly with
        // array-valued fields/keys.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->exists('array.level1.level2')
            ->execute();
        $this->assertResults([
            '1',
            '2',
            '3',
            '4',
            '5',
            '7',
        ]);
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->exists('array.level1')
            ->execute();
        $this->assertResults([
            '1',
            '2',
            '3',
            '4',
            '5',
            '6',
            '7',
        ]);
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->exists('array')
            ->execute();
        $this->assertResults([
            '1',
            '2',
            '3',
            '4',
            '5',
            '6',
            '7',
        ]);
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->notExists('array.level1.level2')
            ->execute();
        $this->assertResults([
            '6',
        ]);
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->notExists('array.level1')
            ->execute();
        $this->assertResults([]);
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->notExists('array')
            ->execute();
        $this->assertResults([]);
        // Make sure that "IS NULL" and "IS NOT NULL" work correctly when the dotted
        // path cannot be fully followed.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->exists('does.not.exist')
            ->execute();
        $this->assertResults([]);
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->notExists('does.not.exist')
            ->execute();
        $this->assertResults([
            '1',
            '2',
            '3',
            '4',
            '5',
            '6',
            '7',
        ]);
    }
    
    /**
     * Tests case sensitivity.
     */
    public function testCaseSensitivity() : void {
        // Filter by label with a known containing case-sensitive word.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('label', 'TEST', 'CONTAINS')
            ->execute();
        $this->assertResults([
            '3',
            '4',
            '5',
        ]);
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->condition('label', 'test', 'CONTAINS')
            ->execute();
        $this->assertResults([
            '3',
            '4',
            '5',
        ]);
    }
    
    /**
     * Tests lookup keys are added to the key value store.
     */
    public function testLookupKeys() : void {
        \Drupal::service('state')->set('config_test.lookup_keys', TRUE);
        \Drupal::entityTypeManager()->clearCachedDefinitions();
        $key_value = $this->container
            ->get('keyvalue')
            ->get(QueryFactory::CONFIG_LOOKUP_PREFIX . 'config_test');
        $test_entities = [];
        $storage = \Drupal::entityTypeManager()->getStorage('config_test');
        $entity = $storage->create([
            'label' => 'entity_1',
            'id' => '1',
            'style' => 'test',
        ]);
        $test_entities[$entity->getConfigDependencyName()] = $entity;
        $entity->enforceIsNew();
        $entity->save();
        $expected[] = $entity->getConfigDependencyName();
        $this->assertEquals($expected, $key_value->get('style:test'));
        $entity = $storage->create([
            'label' => 'entity_2',
            'id' => '2',
            'style' => 'test',
        ]);
        $test_entities[$entity->getConfigDependencyName()] = $entity;
        $entity->enforceIsNew();
        $entity->save();
        $expected[] = $entity->getConfigDependencyName();
        $this->assertEquals($expected, $key_value->get('style:test'));
        $entity = $storage->create([
            'label' => 'entity_3',
            'id' => '3',
            'style' => 'blah',
        ]);
        $entity->enforceIsNew();
        $entity->save();
        // Do not add this entity to the list of expected result as it has a
        // different value.
        $this->assertEquals($expected, $key_value->get('style:test'));
        $this->assertEquals([
            $entity->getConfigDependencyName(),
        ], $key_value->get('style:blah'));
        // Ensure that a delete clears a key.
        $entity->delete();
        $this->assertNull($key_value->get('style:blah'));
        // Ensure that delete only clears one key.
        $entity_id = array_pop($expected);
        $test_entities[$entity_id]->delete();
        $this->assertEquals($expected, $key_value->get('style:test'));
        $entity_id = array_pop($expected);
        $test_entities[$entity_id]->delete();
        $this->assertNull($key_value->get('style:test'));
    }
    
    /**
     * Test the entity query alter hooks are invoked.
     *
     * @see config_test_entity_query_tag__config_query_test__config_entity_query_alter_hook_test_alter()
     */
    public function testAlterHook() : void {
        // Run a test without any condition.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->execute();
        $this->assertResults([
            '1',
            '2',
            '3',
            '4',
            '5',
            '6',
            '7',
        ]);
        // config_test alter hook removes the entity with id '7'.
        $this->queryResults = $this->entityStorage
            ->getQuery()
            ->addTag('config_entity_query_alter_hook_test')
            ->execute();
        $this->assertResults([
            '1',
            '2',
            '3',
            '4',
            '5',
            '6',
        ]);
    }
    
    /**
     * Asserts the results as expected regardless of order.
     *
     * @param array $expected
     *   Array of expected entity IDs.
     *
     * @internal
     */
    protected function assertResults(array $expected) : void {
        $expected_count = count($expected);
        $this->assertCount($expected_count, $this->queryResults);
        foreach ($expected as $value) {
            // This also tests whether $this->queryResults[$value] is even set at all.
            $this->assertSame($value, $this->queryResults[$value]);
        }
    }

}

Members

Title Sort descending Deprecated Modifiers Object type Summary Overriden Title Overrides
AssertContentTrait::$content protected property The current raw content.
AssertContentTrait::$drupalSettings protected property The drupalSettings value from the current raw $content.
AssertContentTrait::$elements protected property The XML structure parsed from the current raw $content. 1
AssertContentTrait::$plainTextContent protected property The plain-text content of raw $content (text nodes).
AssertContentTrait::assertEscaped protected function Passes if the raw text IS found escaped on the loaded page, fail otherwise.
AssertContentTrait::assertField protected function Asserts that a field exists with the given name or ID.
AssertContentTrait::assertFieldById protected function Asserts that a field exists with the given ID and value.
AssertContentTrait::assertFieldByName protected function Asserts that a field exists with the given name and value.
AssertContentTrait::assertFieldByXPath protected function Asserts that a field exists in the current page by the given XPath.
AssertContentTrait::assertFieldChecked protected function Asserts that a checkbox field in the current page is checked.
AssertContentTrait::assertFieldsByValue protected function Asserts that a field exists in the current page with a given Xpath result.
AssertContentTrait::assertLink protected function Passes if a link with the specified label is found.
AssertContentTrait::assertLinkByHref protected function Passes if a link containing a given href (part) is found.
AssertContentTrait::assertNoDuplicateIds protected function Asserts that each HTML ID is used for just a single element.
AssertContentTrait::assertNoEscaped protected function Passes if raw text IS NOT found escaped on loaded page, fail otherwise.
AssertContentTrait::assertNoField protected function Asserts that a field does not exist with the given name or ID.
AssertContentTrait::assertNoFieldById protected function Asserts that a field does not exist with the given ID and value.
AssertContentTrait::assertNoFieldByName protected function Asserts that a field does not exist with the given name and value.
AssertContentTrait::assertNoFieldByXPath protected function Asserts that a field does not exist or its value does not match, by XPath.
AssertContentTrait::assertNoFieldChecked protected function Asserts that a checkbox field in the current page is not checked.
AssertContentTrait::assertNoLink protected function Passes if a link with the specified label is not found.
AssertContentTrait::assertNoLinkByHref protected function Passes if a link containing a given href (part) is not found.
AssertContentTrait::assertNoLinkByHrefInMainRegion protected function Passes if a link containing a given href is not found in the main region.
AssertContentTrait::assertNoOption protected function Asserts that a select option in the current page does not exist.
AssertContentTrait::assertNoOptionSelected protected function Asserts that a select option in the current page is not checked.
AssertContentTrait::assertNoPattern protected function Triggers a pass if the perl regex pattern is not found in raw content.
AssertContentTrait::assertNoRaw protected function Passes if the raw text is NOT found on the loaded page, fail otherwise.
AssertContentTrait::assertNoText protected function Passes if the page (with HTML stripped) does not contains the text.
AssertContentTrait::assertNoTitle protected function Pass if the page title is not the given string.
AssertContentTrait::assertNoUniqueText protected function Passes if the text is found MORE THAN ONCE on the text version of the page.
AssertContentTrait::assertOption protected function Asserts that a select option in the current page exists.
AssertContentTrait::assertOptionByText protected function Asserts that a select option with the visible text exists.
AssertContentTrait::assertOptionSelected protected function Asserts that a select option in the current page is checked.
AssertContentTrait::assertOptionSelectedWithDrupalSelector protected function Asserts that a select option in the current page is checked.
AssertContentTrait::assertOptionWithDrupalSelector protected function Asserts that a select option in the current page exists.
AssertContentTrait::assertPattern protected function Triggers a pass if the Perl regex pattern is found in the raw content.
AssertContentTrait::assertRaw protected function Passes if the raw text IS found on the loaded page, fail otherwise.
AssertContentTrait::assertText protected function Passes if the page (with HTML stripped) contains the text.
AssertContentTrait::assertTextHelper protected function Helper for assertText and assertNoText.
AssertContentTrait::assertTextPattern protected function Asserts that a Perl regex pattern is found in the plain-text content.
AssertContentTrait::assertThemeOutput protected function Asserts themed output.
AssertContentTrait::assertTitle protected function Pass if the page title is the given string.
AssertContentTrait::assertUniqueText protected function Passes if the text is found ONLY ONCE on the text version of the page.
AssertContentTrait::assertUniqueTextHelper protected function Helper for assertUniqueText and assertNoUniqueText.
AssertContentTrait::buildXPathQuery protected function Builds an XPath query.
AssertContentTrait::constructFieldXpath protected function Helper: Constructs an XPath for the given set of attributes and value.
AssertContentTrait::cssSelect protected function Searches elements using a CSS selector in the raw content.
AssertContentTrait::getAllOptions protected function Get all option elements, including nested options, in a select.
AssertContentTrait::getDrupalSettings protected function Gets the value of drupalSettings for the currently-loaded page.
AssertContentTrait::getRawContent protected function Gets the current raw content.
AssertContentTrait::getSelectedItem protected function Get the selected value from a select field.
AssertContentTrait::getTextContent protected function Retrieves the plain-text content from the current raw content.
AssertContentTrait::parse protected function Parse content returned from curlExec using DOM and SimpleXML.
AssertContentTrait::removeWhiteSpace protected function Removes all white-space between HTML tags from the raw content.
AssertContentTrait::setDrupalSettings protected function Sets the value of drupalSettings for the currently-loaded page.
AssertContentTrait::setRawContent protected function Sets the raw content (e.g. HTML).
AssertContentTrait::xpath protected function Performs an xpath search on the contents of the internal browser.
ConfigEntityQueryTest::$entities protected property Stores all config entities created for the test.
ConfigEntityQueryTest::$entityStorage protected property The config entity storage used for testing.
ConfigEntityQueryTest::$factory protected property The query factory used to construct all queries in the test.
ConfigEntityQueryTest::$modules protected static property Modules to install. Overrides KernelTestBase::$modules
ConfigEntityQueryTest::$queryResults protected property Stores the search results for alter comparison.
ConfigEntityQueryTest::assertResults protected function Asserts the results as expected regardless of order.
ConfigEntityQueryTest::setUp protected function Overrides KernelTestBase::setUp
ConfigEntityQueryTest::testAlterHook public function Test the entity query alter hooks are invoked.
ConfigEntityQueryTest::testCaseSensitivity public function Tests case sensitivity.
ConfigEntityQueryTest::testConfigEntityQuery public function Tests basic functionality.
ConfigEntityQueryTest::testCount public function Tests count query.
ConfigEntityQueryTest::testDotted public function Tests dotted path matching.
ConfigEntityQueryTest::testLookupKeys public function Tests lookup keys are added to the key value store.
ConfigEntityQueryTest::testSortRange public function Tests sorting and range on config entity queries.
ConfigEntityQueryTest::testStringIdConditions public function Tests ID conditions.
ConfigEntityQueryTest::testTableSort public function Tests sorting with tableSort on config entity queries.
ConfigTestTrait::configImporter protected function Returns a ConfigImporter object to import test configuration.
ConfigTestTrait::copyConfig protected function Copies configuration objects from source storage to target storage.
ExtensionListTestTrait::getModulePath protected function Gets the path for the specified module.
ExtensionListTestTrait::getThemePath protected function Gets the path for the specified theme.
KernelTestBase::$backupGlobals protected property Back up and restore any global variables that may be changed by tests.
KernelTestBase::$backupStaticAttributes protected property Back up and restore static class properties that may be changed by tests.
KernelTestBase::$backupStaticAttributesBlacklist protected property Contains a few static class properties for performance.
KernelTestBase::$classLoader protected property
KernelTestBase::$configImporter protected property @todo Move into Config test base class. 6
KernelTestBase::$configSchemaCheckerExclusions protected static property An array of config object names that are excluded from schema checking. 3
KernelTestBase::$container protected property
KernelTestBase::$databasePrefix protected property
KernelTestBase::$keyValue protected property The key_value service that must persist between container rebuilds.
KernelTestBase::$preserveGlobalState protected property Do not forward any global state from the parent process to the processes
that run the actual tests.
KernelTestBase::$root protected property The app root.
KernelTestBase::$runTestInSeparateProcess protected property Kernel tests are run in separate processes because they allow autoloading
of code from extensions. Running the test in a separate process isolates
this behavior from other tests. Subclasses should not override this
property.
KernelTestBase::$siteDirectory protected property
KernelTestBase::$strictConfigSchema protected property Set to TRUE to strict check all configuration saved. 9
KernelTestBase::$usesSuperUserAccessPolicy protected property Set to TRUE to make user 1 a super user. 7
KernelTestBase::$vfsRoot protected property The virtual filesystem root directory.
KernelTestBase::assertPostConditions protected function 1
KernelTestBase::bootEnvironment protected function Bootstraps a basic test environment.
KernelTestBase::bootKernel protected function Bootstraps a kernel for a test. 1
KernelTestBase::config protected function Configuration accessor for tests. Returns non-overridden configuration.
KernelTestBase::disableModules protected function Disables modules for this test.
KernelTestBase::enableModules protected function Enables modules for this test. 1
KernelTestBase::getConfigSchemaExclusions protected function Gets the config schema exclusions for this test.
KernelTestBase::getDatabaseConnectionInfo protected function Returns the Database connection info to be used for this test. 2
KernelTestBase::getDatabasePrefix public function
KernelTestBase::getExtensionsForModules private function Returns Extension objects for $modules to install.
KernelTestBase::getModulesToEnable private static function Returns the modules to install for this test.
KernelTestBase::initFileCache protected function Initializes the FileCache component.
KernelTestBase::installConfig protected function Installs default configuration for a given list of modules.
KernelTestBase::installEntitySchema protected function Installs the storage schema for a specific entity type.
KernelTestBase::installSchema protected function Installs database tables from a module schema definition.
KernelTestBase::register public function Registers test-specific services. Overrides ServiceProviderInterface::register 27
KernelTestBase::render protected function Renders a render array. 1
KernelTestBase::setInstallProfile protected function Sets the install profile and rebuilds the container to update it.
KernelTestBase::setSetting protected function Sets an in-memory Settings variable.
KernelTestBase::setUpBeforeClass public static function 1
KernelTestBase::setUpFilesystem protected function Sets up the filesystem, so things like the file directory. 2
KernelTestBase::stop Deprecated protected function Stops test execution.
KernelTestBase::tearDown protected function 6
KernelTestBase::tearDownCloseDatabaseConnection public function @after
KernelTestBase::vfsDump protected function Dumps the current state of the virtual filesystem to STDOUT.
KernelTestBase::__get public function
KernelTestBase::__sleep public function Prevents serializing any properties.
PhpUnitWarnings::$deprecationWarnings private static property Deprecation warnings from PHPUnit to raise with @trigger_error().
PhpUnitWarnings::addWarning public function Converts PHPUnit deprecation warnings to E_USER_DEPRECATED.
RandomGeneratorTrait::getRandomGenerator protected function Gets the random generator for the utility methods.
RandomGeneratorTrait::randomMachineName protected function Generates a unique random string containing letters and numbers.
RandomGeneratorTrait::randomObject public function Generates a random PHP object.
RandomGeneratorTrait::randomString public function Generates a pseudo-random string of ASCII characters of codes 32 to 126.
RandomGeneratorTrait::randomStringValidate Deprecated public function Callback for random string validation.
StorageCopyTrait::replaceStorageContents protected static function Copy the configuration from one storage to another and remove stale items.
TestRequirementsTrait::checkModuleRequirements Deprecated private function Checks missing module requirements.
TestRequirementsTrait::checkRequirements Deprecated protected function Check module requirements for the Drupal use case.
TestRequirementsTrait::getDrupalRoot protected static function Returns the Drupal root directory.

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