3 namespace Drupal\Tests\Core\Entity;
5 use Drupal\Core\DependencyInjection\ContainerBuilder;
6 use Drupal\Core\Field\BaseFieldDefinition;
7 use Drupal\Core\Field\FieldStorageDefinitionInterface;
8 use Drupal\Tests\UnitTestCase;
11 * Unit test for BaseFieldDefinition.
14 * @coversDefaultClass \Drupal\Core\Field\BaseFieldDefinition
16 class BaseFieldDefinitionTest extends UnitTestCase {
19 * A dummy field type name.
26 * A dummy field type definition.
30 protected $fieldTypeDefinition;
36 protected function setUp() {
37 // Mock the field type manager and place it in the container.
38 $field_type_manager = $this->getMock('Drupal\Core\Field\FieldTypePluginManagerInterface');
40 $this->fieldType = $this->randomMachineName();
41 $this->fieldTypeDefinition = [
42 'id' => $this->fieldType,
43 'storage_settings' => [
44 'some_setting' => 'value 1'
47 'some_instance_setting' => 'value 2',
51 $field_type_manager->expects($this->any())
52 ->method('getDefinitions')
53 ->will($this->returnValue([$this->fieldType => $this->fieldTypeDefinition]));
54 $field_type_manager->expects($this->any())
55 ->method('getDefinition')
56 ->with($this->fieldType)
57 ->will($this->returnValue($this->fieldTypeDefinition));
58 $field_type_manager->expects($this->any())
59 ->method('getDefaultStorageSettings')
60 ->with($this->fieldType)
61 ->will($this->returnValue($this->fieldTypeDefinition['storage_settings']));
62 $field_type_manager->expects($this->any())
63 ->method('getDefaultFieldSettings')
64 ->with($this->fieldType)
65 ->will($this->returnValue($this->fieldTypeDefinition['field_settings']));
67 $container = new ContainerBuilder();
68 $container->set('plugin.manager.field.field_type', $field_type_manager);
69 \Drupal::setContainer($container);
73 * Tests field name methods.
77 public function testFieldName() {
78 $definition = BaseFieldDefinition::create($this->fieldType);
79 $field_name = $this->randomMachineName();
80 $definition->setName($field_name);
81 $this->assertEquals($field_name, $definition->getName());
85 * Tests field label methods.
89 public function testFieldLabel() {
90 $definition = BaseFieldDefinition::create($this->fieldType);
91 $label = $this->randomMachineName();
92 $definition->setLabel($label);
93 $this->assertEquals($label, $definition->getLabel());
97 * Tests field description methods.
99 * @covers ::getDescription
101 public function testFieldDescription() {
102 $definition = BaseFieldDefinition::create($this->fieldType);
103 $description = $this->randomMachineName();
104 $definition->setDescription($description);
105 $this->assertEquals($description, $definition->getDescription());
109 * Tests field type methods.
113 public function testFieldType() {
114 $definition = BaseFieldDefinition::create($this->fieldType);
115 $this->assertEquals($this->fieldType, $definition->getType());
119 * Tests field settings methods.
121 * @covers ::getSetting
122 * @covers ::setSetting
123 * @covers ::getSettings
125 public function testFieldSettings() {
126 $definition = BaseFieldDefinition::create($this->fieldType);
127 $setting = $this->randomMachineName();
128 $value = $this->randomMachineName();
129 $definition->setSetting($setting, $value);
130 $this->assertEquals($value, $definition->getSetting($setting));
131 $default_settings = $this->fieldTypeDefinition['storage_settings'] + $this->fieldTypeDefinition['field_settings'];
132 $this->assertEquals([$setting => $value] + $default_settings, $definition->getSettings());
136 * Tests the initialization of default field settings.
138 * @covers ::getSetting
139 * @covers ::setSetting
140 * @covers ::getSettings
142 public function testDefaultFieldSettings() {
143 $definition = BaseFieldDefinition::create($this->fieldType);
144 $expected_settings = $this->fieldTypeDefinition['storage_settings'] + $this->fieldTypeDefinition['field_settings'];
145 $this->assertEquals($expected_settings, $definition->getSettings());
146 foreach ($expected_settings as $setting => $value) {
147 $this->assertEquals($value, $definition->getSetting($setting));
152 * Tests field default value.
154 * @covers ::getDefaultValue
155 * @covers ::setDefaultValue
157 public function testFieldDefaultValue() {
158 $definition = BaseFieldDefinition::create($this->fieldType);
160 'value' => $this->randomMachineName(),
162 $expected_default_value = [$default_value];
163 $definition->setDefaultValue($default_value);
164 $entity = $this->getMockBuilder('Drupal\Core\Entity\ContentEntityBase')
165 ->disableOriginalConstructor()
167 // Set the field item list class to be used to avoid requiring the typed
168 // data manager to retrieve it.
169 $definition->setClass('Drupal\Core\Field\FieldItemList');
170 $this->assertEquals($expected_default_value, $definition->getDefaultValue($entity));
172 $data_definition = $this->getMockBuilder('Drupal\Core\TypedData\DataDefinition')
173 ->disableOriginalConstructor()
175 $data_definition->expects($this->any())
177 ->will($this->returnValue('Drupal\Core\Field\FieldItemBase'));
178 $definition->setItemDefinition($data_definition);
180 // Set default value only with a literal.
181 $definition->setDefaultValue($default_value['value']);
182 $this->assertEquals($expected_default_value, $definition->getDefaultValue($entity));
184 // Set default value with an indexed array.
185 $definition->setDefaultValue($expected_default_value);
186 $this->assertEquals($expected_default_value, $definition->getDefaultValue($entity));
188 // Set default value with an empty array.
189 $definition->setDefaultValue([]);
190 $this->assertEquals([], $definition->getDefaultValue($entity));
192 // Set default value with NULL.
193 $definition->setDefaultValue(NULL);
194 $this->assertEquals([], $definition->getDefaultValue($entity));
198 * Tests field translatable methods.
200 * @covers ::isTranslatable
201 * @covers ::setTranslatable
203 public function testFieldTranslatable() {
204 $definition = BaseFieldDefinition::create($this->fieldType);
205 $this->assertFalse($definition->isTranslatable());
206 $definition->setTranslatable(TRUE);
207 $this->assertTrue($definition->isTranslatable());
208 $definition->setTranslatable(FALSE);
209 $this->assertFalse($definition->isTranslatable());
213 * Tests field revisionable methods.
215 * @covers ::isRevisionable
216 * @covers ::setRevisionable
218 public function testFieldRevisionable() {
219 $definition = BaseFieldDefinition::create($this->fieldType);
220 $this->assertFalse($definition->isRevisionable());
221 $definition->setRevisionable(TRUE);
222 $this->assertTrue($definition->isRevisionable());
223 $definition->setRevisionable(FALSE);
224 $this->assertFalse($definition->isRevisionable());
228 * Tests field cardinality.
230 * @covers ::getCardinality
231 * @covers ::setCardinality
233 public function testFieldCardinality() {
234 $definition = BaseFieldDefinition::create($this->fieldType);
235 $this->assertEquals(1, $definition->getCardinality());
236 $definition->setCardinality(2);
237 $this->assertEquals(2, $definition->getCardinality());
238 $definition->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED);
239 $this->assertEquals(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED, $definition->getCardinality());
245 * @covers ::isRequired
246 * @covers ::setRequired
248 public function testFieldRequired() {
249 $definition = BaseFieldDefinition::create($this->fieldType);
250 $this->assertFalse($definition->isRequired());
251 $definition->setRequired(TRUE);
252 $this->assertTrue($definition->isRequired());
253 $definition->setRequired(FALSE);
254 $this->assertFalse($definition->isRequired());
258 * Tests storage required.
260 * @covers ::isStorageRequired
261 * @covers ::setStorageRequired
263 public function testFieldStorageRequired() {
264 $definition = BaseFieldDefinition::create($this->fieldType);
265 $this->assertFalse($definition->isStorageRequired());
266 $definition->setStorageRequired(TRUE);
267 $this->assertTrue($definition->isStorageRequired());
268 $definition->setStorageRequired(FALSE);
269 $this->assertFalse($definition->isStorageRequired());
275 * @covers ::getProvider
276 * @covers ::setProvider
278 public function testFieldProvider() {
279 $definition = BaseFieldDefinition::create($this->fieldType);
280 $provider = $this->randomMachineName();
281 $definition->setProvider($provider);
282 $this->assertEquals($provider, $definition->getProvider());
286 * Tests custom storage.
288 * @covers ::hasCustomStorage
289 * @covers ::setCustomStorage
291 public function testCustomStorage() {
292 $definition = BaseFieldDefinition::create($this->fieldType);
293 $this->assertFalse($definition->hasCustomStorage());
294 $definition->setCustomStorage(TRUE);
295 $this->assertTrue($definition->hasCustomStorage());
296 $definition->setCustomStorage(FALSE);
297 $this->assertFalse($definition->hasCustomStorage());
301 * Tests default value callbacks.
303 * @covers ::setDefaultValueCallback
305 public function testDefaultValueCallback() {
306 $definition = BaseFieldDefinition::create($this->fieldType);
307 $callback = get_class($this) . '::mockDefaultValueCallback';
308 // setDefaultValueCallback returns $this.
309 $this->assertSame($definition, $definition->setDefaultValueCallback($callback));
313 * Tests invalid default value callbacks.
315 * @covers ::setDefaultValueCallback
317 public function testInvalidDefaultValueCallback() {
318 $definition = BaseFieldDefinition::create($this->fieldType);
319 // setDefaultValueCallback returns $this.
320 $this->setExpectedException(\InvalidArgumentException::class);
321 $definition->setDefaultValueCallback([get_class($this), 'mockDefaultValueCallback']);
325 * Tests NULL default value callbacks.
327 * @covers ::setDefaultValueCallback
329 public function testNullDefaultValueCallback() {
330 $definition = BaseFieldDefinition::create($this->fieldType);
331 // setDefaultValueCallback returns $this.
332 $this->assertSame($definition, $definition->setDefaultValueCallback(NULL));
336 * Provides a Mock base field default value callback.
338 * @param \Drupal\Core\Entity\EntityInterface $entity
340 * @param \Drupal\Core\Field\FieldDefinitionInterface $definition
346 public static function mockDefaultValueCallback($entity, $definition) {
347 return 'a default value';