View source
<?php
namespace Drupal\Tests\fraction\Kernel;
use Drupal\Core\Database\Database;
use Drupal\Core\Utility\UpdateException;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
use Drupal\node\Entity\NodeType;
class FractionUpdateTest extends EntityKernelTestBase {
protected $connection;
protected $schema;
public static $modules = [
'fraction',
'node',
];
protected $fieldsToUpdate;
protected function setUp() {
parent::setUp();
$this->connection = Database::getConnection();
$this->schema = $this->connection
->schema();
$node_type = NodeType::create([
'type' => 'article',
'name' => 'Article',
]);
$node_type
->save();
FieldStorageConfig::create([
'field_name' => 'field_fraction_node',
'entity_type' => 'node',
'type' => 'fraction',
'cardinality' => -1,
])
->save();
FieldConfig::create([
'field_name' => 'field_fraction_node',
'entity_type' => 'node',
'bundle' => 'article',
'label' => $this
->randomMachineName() . '_label',
])
->save();
FieldStorageConfig::create([
'field_name' => 'field_fraction_user',
'entity_type' => 'user',
'type' => 'fraction',
'cardinality' => -1,
])
->save();
FieldConfig::create([
'field_name' => 'field_fraction_user',
'entity_type' => 'user',
'bundle' => 'user',
'label' => $this
->randomMachineName() . '_label',
])
->save();
$this->fieldsToUpdate = [
[
'table_name' => 'node__field_fraction_node',
'columns' => [
'numerator' => 'field_fraction_node_numerator',
'denominator' => 'field_fraction_node_denominator',
],
],
[
'table_name' => 'user__field_fraction_user',
'columns' => [
'numerator' => 'field_fraction_user_numerator',
'denominator' => 'field_fraction_user_denominator',
],
],
];
foreach ($this->fieldsToUpdate as $field) {
$this->schema
->changeField($field['table_name'], $field['columns']['denominator'], $field['columns']['denominator'], [
'type' => 'int',
'not null' => TRUE,
'unsigned' => TRUE,
'default' => 1,
]);
}
}
public function testUpdateDenominatorSigned() {
foreach ($this->fieldsToUpdate as $field) {
$this
->assertFalse($this
->tryUnsignedInsert($field['table_name'], $field['columns']), 'Column rejected a negative value.');
}
$post_update_registry = $this->container
->get('update.post_update_registry');
foreach ($post_update_registry
->getModuleUpdateFunctions('fraction') as $function) {
$function();
}
foreach ($this->fieldsToUpdate as $field) {
$this
->assertTrue($this
->tryUnsignedInsert($field['table_name'], $field['columns']), 'Column accepted a negative value.');
}
}
public function testUpdateDenominatorSignedException() {
foreach ($this->fieldsToUpdate as $field) {
$this
->assertFalse($this
->tryUnsignedInsert($field['table_name'], $field['columns']), 'Column rejected a negative value.');
}
$this->container
->get('database')
->insert('node__field_fraction_node')
->fields([
'entity_id' => 1,
'revision_id' => 1,
'delta' => 0,
'field_fraction_node_numerator' => 9,
'field_fraction_node_denominator' => 2147483699,
])
->execute();
try {
$post_update_registry = $this->container
->get('update.post_update_registry');
foreach ($post_update_registry
->getModuleUpdateFunctions('fraction') as $function) {
$function();
}
$this
->fail('Failed due to update going through when it should not.');
} catch (UpdateException $e) {
$this
->pass('Updating with field values higher than the limit thows a message.');
foreach ($this->fieldsToUpdate as $field) {
$this
->assertFalse($this
->tryUnsignedInsert($field['table_name'], $field['columns']), 'Column rejected a negative value.');
}
}
}
public function tryUnsignedInsert($table_name, $columns) {
try {
$this->container
->get('database')
->insert($table_name)
->fields([
'entity_id' => 1,
'revision_id' => 1,
'delta' => 0,
$columns['numerator'] => 1,
$columns['denominator'] => -10,
])
->execute();
return TRUE;
} catch (\Exception $e) {
return FALSE;
}
}
}