SqlContentEntityStorageTest.php

Same filename in this branch
  1. 11.x core/tests/Drupal/Tests/Core/Entity/Sql/SqlContentEntityStorageTest.php
Same filename in other branches
  1. 9 core/tests/Drupal/Tests/Core/Entity/Sql/SqlContentEntityStorageTest.php
  2. 8.9.x core/tests/Drupal/Tests/Core/Entity/Sql/SqlContentEntityStorageTest.php
  3. 10 core/tests/Drupal/Tests/Core/Entity/Sql/SqlContentEntityStorageTest.php

Namespace

Drupal\KernelTests\Core\Entity\Sql

File

core/tests/Drupal/KernelTests/Core/Entity/Sql/SqlContentEntityStorageTest.php

View source
<?php

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

use Drupal\Core\Database\Event\StatementEvent;
use Drupal\Core\Entity\Sql\DefaultTableMapping;
use Drupal\Core\Database\Log;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\KernelTests\KernelTestBase;

/**
 * Tests that the deleteFromDedicatedTables() method only executes one DELETE query.
 *
 * @group Entity
 */
class SqlContentEntityStorageTest extends KernelTestBase {
    
    /**
     * {@inheritdoc}
     */
    protected static $modules = [
        'system',
    ];
    
    /**
     * Tests that only one SQL DELETE is executed on dedicated data tables.
     */
    public function testDeleteFromDedicatedTablesExecutesOneDelete() : void {
        // The array of entity IDs to delete.
        $ids = [
            1,
            2,
            3,
        ];
        // Create a dummy field storage definition.
        $dummy_storage_definition = $this->getMockBuilder(FieldStorageDefinitionInterface::class)
            ->disableOriginalConstructor()
            ->getMock();
        $fieldStorageDefinitions = [
            $dummy_storage_definition,
        ];
        // Create a dummy entity type that is revisionable.
        $entityType = $this->getMockBuilder(EntityTypeInterface::class)
            ->getMock();
        $entityType->method('isRevisionable')
            ->willReturn(TRUE);
        // Create a dummy table mapping that always requires dedicated table storage.
        $dummyTableMapping = $this->getMockBuilder(DefaultTableMapping::class)
            ->disableOriginalConstructor()
            ->getMock();
        $dummyTableMapping->method('requiresDedicatedTableStorage')
            ->with($dummy_storage_definition)
            ->willReturn(TRUE);
        $dummyTableMapping->method('getDedicatedDataTableName')
            ->with($dummy_storage_definition)
            ->willReturn('dedicated_table');
        $dummyTableMapping->method('getDedicatedRevisionTableName')
            ->with($dummy_storage_definition)
            ->willReturn('dedicated_revision_table');
        // Create an instance of our testable storage subclass.
        $storage = new TestableSqlContentEntityStorage();
        // Use the real database connection from the container.
        $storage->database = $this->container
            ->get('database');
        $storage->entityType = $entityType;
        $storage->fieldStorageDefinitions = $fieldStorageDefinitions;
        $storage->setTableMapping($dummyTableMapping);
        // Create the dummy dedicated data tables.
        $schema = $storage->database
            ->schema();
        $schema->createTable('dedicated_table', [
            'fields' => [
                'entity_id' => [
                    'type' => 'int',
                    'not null' => TRUE,
                ],
            ],
        ]);
        $schema->createTable('dedicated_revision_table', [
            'fields' => [
                'entity_id' => [
                    'type' => 'int',
                    'not null' => TRUE,
                ],
                'vid' => [
                    'type' => 'int',
                    'not null' => TRUE,
                ],
            ],
        ]);
        // Set up a test query logger to capture executed queries.
        $logger = new Log();
        $storage->database
            ->setLogger($logger);
        $storage->database
            ->enableEvents(StatementEvent::all());
        // Call the method that exposes the protected deleteFromDedicatedTables() method.
        $logger->start('default');
        $storage->publicDeleteFromDedicatedTables($ids);
        $queries = $logger->get('default');
        $logger->end('default');
        // Filter queries to include only DELETE queries over each table.
        $dedicatedTableDeleteQueries = array_filter($queries, static function ($query) {
            return preg_match('/^DELETE FROM ".*dedicated_table"/', $query['query']);
        });
        $dedicatedRevisionTableDeleteQueries = array_filter($queries, static function ($query) {
            return preg_match('/^DELETE FROM ".*dedicated_revision_table"/', $query['query']);
        });
        // Assert that exactly one DELETE query was executed on each table.
        $this->assertCount(1, $dedicatedTableDeleteQueries, 'Only one DELETE query on the dedicated data table was executed.');
        $this->assertCount(1, $dedicatedRevisionTableDeleteQueries, 'Only one DELETE query on the dedicated revision data table was executed.');
    }

}

Classes

Title Deprecated Summary
SqlContentEntityStorageTest Tests that the deleteFromDedicatedTables() method only executes one DELETE query.

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