You are here

public function SqlContentEntityStorageSchemaTest::testonEntityTypeUpdateWithNewIndex in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 core/tests/Drupal/Tests/Core/Entity/Sql/SqlContentEntityStorageSchemaTest.php \Drupal\Tests\Core\Entity\Sql\SqlContentEntityStorageSchemaTest::testonEntityTypeUpdateWithNewIndex()

::onEntityTypeUpdate

File

core/tests/Drupal/Tests/Core/Entity/Sql/SqlContentEntityStorageSchemaTest.php, line 1397
Contains \Drupal\Tests\Core\Entity\Sql\SqlContentEntityStorageSchemaTest.

Class

SqlContentEntityStorageSchemaTest
@coversDefaultClass \Drupal\Core\Entity\Sql\SqlContentEntityStorageSchema @group Entity

Namespace

Drupal\Tests\Core\Entity\Sql

Code

public function testonEntityTypeUpdateWithNewIndex() {
  $this->entityType = $original_entity_type = new ContentEntityType(array(
    'id' => 'entity_test',
    'entity_keys' => array(
      'id' => 'id',
    ),
  ));

  // Add a field with a really long index.
  $this
    ->setUpStorageDefinition('long_index_name', array(
    'columns' => array(
      'long_index_name' => array(
        'type' => 'int',
      ),
    ),
    'indexes' => array(
      'long_index_name_really_long_long_name' => array(
        array(
          'long_index_name',
          10,
        ),
      ),
    ),
  ));
  $expected = array(
    'entity_test' => array(
      'description' => 'The base table for entity_test entities.',
      'fields' => array(
        'id' => array(
          'type' => 'serial',
          'not null' => TRUE,
        ),
        'long_index_name' => array(
          'type' => 'int',
          'not null' => FALSE,
        ),
      ),
      'indexes' => array(
        'entity_test__b588603cb9' => array(
          array(
            'long_index_name',
            10,
          ),
        ),
      ),
    ),
  );
  $this
    ->setUpStorageSchema($expected);
  $table_mapping = new DefaultTableMapping($this->entityType, $this->storageDefinitions);
  $table_mapping
    ->setFieldNames('entity_test', array_keys($this->storageDefinitions));
  $table_mapping
    ->setExtraColumns('entity_test', array(
    'default_langcode',
  ));
  $this->storage
    ->expects($this
    ->any())
    ->method('getTableMapping')
    ->will($this
    ->returnValue($table_mapping));
  $this->storageSchema
    ->expects($this
    ->any())
    ->method('loadEntitySchemaData')
    ->willReturn([
    'entity_test' => [
      'indexes' => [
        // A changed index definition.
        'entity_test__b588603cb9' => [
          'longer_index_name',
        ],
        // An index that has been removed.
        'entity_test__removed_field' => [
          'removed_field',
        ],
      ],
    ],
  ]);

  // The original indexes should be dropped before the new one is added.
  $this->dbSchemaHandler
    ->expects($this
    ->at(0))
    ->method('dropIndex')
    ->with('entity_test', 'entity_test__b588603cb9');
  $this->dbSchemaHandler
    ->expects($this
    ->at(1))
    ->method('dropIndex')
    ->with('entity_test', 'entity_test__removed_field');
  $this->dbSchemaHandler
    ->expects($this
    ->atLeastOnce())
    ->method('fieldExists')
    ->willReturn(TRUE);
  $this->dbSchemaHandler
    ->expects($this
    ->atLeastOnce())
    ->method('addIndex')
    ->with('entity_test', 'entity_test__b588603cb9', [
    [
      'long_index_name',
      10,
    ],
  ], $this
    ->callback(function ($actual_value) use ($expected) {
    $this
      ->assertEquals($expected['entity_test']['indexes'], $actual_value['indexes']);
    $this
      ->assertEquals($expected['entity_test']['fields'], $actual_value['fields']);

    // If the parameters don't match, the assertions above will throw an
    // exception.
    return TRUE;
  }));
  $this
    ->assertNull($this->storageSchema
    ->onEntityTypeUpdate($this->entityType, $original_entity_type));
}