BaseFieldDefinitionTest.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. <?php
  2. namespace Drupal\Tests\Core\Entity;
  3. use Drupal\Core\DependencyInjection\ContainerBuilder;
  4. use Drupal\Core\Field\BaseFieldDefinition;
  5. use Drupal\Core\Field\FieldItemBase;
  6. use Drupal\Core\Field\FieldStorageDefinitionInterface;
  7. use Drupal\Core\TypedData\DataDefinition;
  8. use Drupal\Tests\UnitTestCase;
  9. /**
  10. * Unit test for BaseFieldDefinition.
  11. *
  12. * @group Entity
  13. * @coversDefaultClass \Drupal\Core\Field\BaseFieldDefinition
  14. */
  15. class BaseFieldDefinitionTest extends UnitTestCase {
  16. /**
  17. * A dummy field type name.
  18. *
  19. * @var string
  20. */
  21. protected $fieldType;
  22. /**
  23. * A dummy field type definition.
  24. *
  25. * @var string
  26. */
  27. protected $fieldTypeDefinition;
  28. /**
  29. * {@inheritdoc}
  30. */
  31. protected function setUp() {
  32. // Mock the field type manager and place it in the container.
  33. $field_type_manager = $this->createMock('Drupal\Core\Field\FieldTypePluginManagerInterface');
  34. $this->fieldType = $this->randomMachineName();
  35. $this->fieldTypeDefinition = [
  36. 'id' => $this->fieldType,
  37. 'storage_settings' => [
  38. 'some_setting' => 'value 1',
  39. ],
  40. 'field_settings' => [
  41. 'some_instance_setting' => 'value 2',
  42. ],
  43. ];
  44. $field_type_manager->expects($this->any())
  45. ->method('getDefinitions')
  46. ->will($this->returnValue([$this->fieldType => $this->fieldTypeDefinition]));
  47. $field_type_manager->expects($this->any())
  48. ->method('getDefinition')
  49. ->with($this->fieldType)
  50. ->will($this->returnValue($this->fieldTypeDefinition));
  51. $field_type_manager->expects($this->any())
  52. ->method('getDefaultStorageSettings')
  53. ->with($this->fieldType)
  54. ->will($this->returnValue($this->fieldTypeDefinition['storage_settings']));
  55. $field_type_manager->expects($this->any())
  56. ->method('getDefaultFieldSettings')
  57. ->with($this->fieldType)
  58. ->will($this->returnValue($this->fieldTypeDefinition['field_settings']));
  59. $container = new ContainerBuilder();
  60. $container->set('plugin.manager.field.field_type', $field_type_manager);
  61. \Drupal::setContainer($container);
  62. }
  63. /**
  64. * Tests field name methods.
  65. *
  66. * @covers ::getName
  67. */
  68. public function testFieldName() {
  69. $definition = BaseFieldDefinition::create($this->fieldType);
  70. $field_name = $this->randomMachineName();
  71. $definition->setName($field_name);
  72. $this->assertEquals($field_name, $definition->getName());
  73. }
  74. /**
  75. * Tests field label methods.
  76. *
  77. * @covers ::getLabel
  78. */
  79. public function testFieldLabel() {
  80. $definition = BaseFieldDefinition::create($this->fieldType);
  81. $label = $this->randomMachineName();
  82. $definition->setLabel($label);
  83. $this->assertEquals($label, $definition->getLabel());
  84. }
  85. /**
  86. * Tests field description methods.
  87. *
  88. * @covers ::getDescription
  89. */
  90. public function testFieldDescription() {
  91. $definition = BaseFieldDefinition::create($this->fieldType);
  92. $description = $this->randomMachineName();
  93. $definition->setDescription($description);
  94. $this->assertEquals($description, $definition->getDescription());
  95. }
  96. /**
  97. * Tests field type methods.
  98. *
  99. * @covers ::getType
  100. */
  101. public function testFieldType() {
  102. $definition = BaseFieldDefinition::create($this->fieldType);
  103. $this->assertEquals($this->fieldType, $definition->getType());
  104. }
  105. /**
  106. * Tests field settings methods.
  107. *
  108. * @covers ::getSetting
  109. * @covers ::setSetting
  110. * @covers ::getSettings
  111. */
  112. public function testFieldSettings() {
  113. $definition = BaseFieldDefinition::create($this->fieldType);
  114. $setting = $this->randomMachineName();
  115. $value = $this->randomMachineName();
  116. $definition->setSetting($setting, $value);
  117. $this->assertEquals($value, $definition->getSetting($setting));
  118. $default_settings = $this->fieldTypeDefinition['storage_settings'] + $this->fieldTypeDefinition['field_settings'];
  119. $this->assertEquals([$setting => $value] + $default_settings, $definition->getSettings());
  120. }
  121. /**
  122. * Tests the initialization of default field settings.
  123. *
  124. * @covers ::getSetting
  125. * @covers ::setSetting
  126. * @covers ::getSettings
  127. */
  128. public function testDefaultFieldSettings() {
  129. $definition = BaseFieldDefinition::create($this->fieldType);
  130. $expected_settings = $this->fieldTypeDefinition['storage_settings'] + $this->fieldTypeDefinition['field_settings'];
  131. $this->assertEquals($expected_settings, $definition->getSettings());
  132. foreach ($expected_settings as $setting => $value) {
  133. $this->assertEquals($value, $definition->getSetting($setting));
  134. }
  135. }
  136. /**
  137. * Tests field default value.
  138. *
  139. * @covers ::getDefaultValue
  140. * @covers ::setDefaultValue
  141. */
  142. public function testFieldDefaultValue() {
  143. $definition = BaseFieldDefinition::create($this->fieldType);
  144. $default_value = [
  145. 'value' => $this->randomMachineName(),
  146. ];
  147. $expected_default_value = [$default_value];
  148. $definition->setDefaultValue($default_value);
  149. $entity = $this->getMockBuilder('Drupal\Core\Entity\ContentEntityBase')
  150. ->disableOriginalConstructor()
  151. ->getMock();
  152. // Set the field item list class to be used to avoid requiring the typed
  153. // data manager to retrieve it.
  154. $definition->setClass('Drupal\Core\Field\FieldItemList');
  155. $definition->setItemDefinition(DataDefinition::createFromDataType('string')->setClass(FieldItemBase::class));
  156. $this->assertEquals($expected_default_value, $definition->getDefaultValue($entity));
  157. $data_definition = $this->getMockBuilder('Drupal\Core\TypedData\DataDefinition')
  158. ->disableOriginalConstructor()
  159. ->getMock();
  160. $data_definition->expects($this->any())
  161. ->method('getClass')
  162. ->will($this->returnValue('Drupal\Core\Field\FieldItemBase'));
  163. $definition->setItemDefinition($data_definition);
  164. // Set default value only with a literal.
  165. $definition->setDefaultValue($default_value['value']);
  166. $this->assertEquals($expected_default_value, $definition->getDefaultValue($entity));
  167. // Set default value with an indexed array.
  168. $definition->setDefaultValue($expected_default_value);
  169. $this->assertEquals($expected_default_value, $definition->getDefaultValue($entity));
  170. // Set default value with an empty array.
  171. $definition->setDefaultValue([]);
  172. $this->assertEquals([], $definition->getDefaultValue($entity));
  173. // Set default value with NULL.
  174. $definition->setDefaultValue(NULL);
  175. $this->assertEquals([], $definition->getDefaultValue($entity));
  176. }
  177. /**
  178. * Tests field initial value.
  179. *
  180. * @covers ::getInitialValue
  181. * @covers ::setInitialValue
  182. */
  183. public function testFieldInitialValue() {
  184. $definition = BaseFieldDefinition::create($this->fieldType);
  185. $definition->setItemDefinition(DataDefinition::createFromDataType('string')->setClass(FieldItemBase::class));
  186. $default_value = [
  187. 'value' => $this->randomMachineName(),
  188. ];
  189. $expected_default_value = [$default_value];
  190. $definition->setInitialValue($default_value);
  191. $entity = $this->getMockBuilder('Drupal\Core\Entity\ContentEntityBase')
  192. ->disableOriginalConstructor()
  193. ->getMock();
  194. // Set the field item list class to be used to avoid requiring the typed
  195. // data manager to retrieve it.
  196. $definition->setClass('Drupal\Core\Field\FieldItemList');
  197. $this->assertEquals($expected_default_value, $definition->getInitialValue($entity));
  198. $data_definition = $this->getMockBuilder('Drupal\Core\TypedData\DataDefinition')
  199. ->disableOriginalConstructor()
  200. ->getMock();
  201. $data_definition->expects($this->any())
  202. ->method('getClass')
  203. ->will($this->returnValue('Drupal\Core\Field\FieldItemBase'));
  204. $definition->setItemDefinition($data_definition);
  205. // Set default value only with a literal.
  206. $definition->setInitialValue($default_value['value']);
  207. $this->assertEquals($expected_default_value, $definition->getInitialValue($entity));
  208. // Set default value with an indexed array.
  209. $definition->setInitialValue($expected_default_value);
  210. $this->assertEquals($expected_default_value, $definition->getInitialValue($entity));
  211. // Set default value with an empty array.
  212. $definition->setInitialValue([]);
  213. $this->assertEquals([], $definition->getInitialValue($entity));
  214. // Set default value with NULL.
  215. $definition->setInitialValue(NULL);
  216. $this->assertEquals([], $definition->getInitialValue($entity));
  217. }
  218. /**
  219. * Tests field translatable methods.
  220. *
  221. * @covers ::isTranslatable
  222. * @covers ::setTranslatable
  223. */
  224. public function testFieldTranslatable() {
  225. $definition = BaseFieldDefinition::create($this->fieldType);
  226. $this->assertFalse($definition->isTranslatable());
  227. $definition->setTranslatable(TRUE);
  228. $this->assertTrue($definition->isTranslatable());
  229. $definition->setTranslatable(FALSE);
  230. $this->assertFalse($definition->isTranslatable());
  231. }
  232. /**
  233. * Tests field revisionable methods.
  234. *
  235. * @covers ::isRevisionable
  236. * @covers ::setRevisionable
  237. */
  238. public function testFieldRevisionable() {
  239. $definition = BaseFieldDefinition::create($this->fieldType);
  240. $this->assertFalse($definition->isRevisionable());
  241. $definition->setRevisionable(TRUE);
  242. $this->assertTrue($definition->isRevisionable());
  243. $definition->setRevisionable(FALSE);
  244. $this->assertFalse($definition->isRevisionable());
  245. }
  246. /**
  247. * Tests field cardinality.
  248. *
  249. * @covers ::getCardinality
  250. * @covers ::setCardinality
  251. */
  252. public function testFieldCardinality() {
  253. $definition = BaseFieldDefinition::create($this->fieldType);
  254. $this->assertEquals(1, $definition->getCardinality());
  255. $definition->setCardinality(2);
  256. $this->assertEquals(2, $definition->getCardinality());
  257. $definition->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED);
  258. $this->assertEquals(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED, $definition->getCardinality());
  259. }
  260. /**
  261. * Tests required.
  262. *
  263. * @covers ::isRequired
  264. * @covers ::setRequired
  265. */
  266. public function testFieldRequired() {
  267. $definition = BaseFieldDefinition::create($this->fieldType);
  268. $this->assertFalse($definition->isRequired());
  269. $definition->setRequired(TRUE);
  270. $this->assertTrue($definition->isRequired());
  271. $definition->setRequired(FALSE);
  272. $this->assertFalse($definition->isRequired());
  273. }
  274. /**
  275. * Tests storage required.
  276. *
  277. * @covers ::isStorageRequired
  278. * @covers ::setStorageRequired
  279. */
  280. public function testFieldStorageRequired() {
  281. $definition = BaseFieldDefinition::create($this->fieldType);
  282. $this->assertFalse($definition->isStorageRequired());
  283. $definition->setStorageRequired(TRUE);
  284. $this->assertTrue($definition->isStorageRequired());
  285. $definition->setStorageRequired(FALSE);
  286. $this->assertFalse($definition->isStorageRequired());
  287. }
  288. /**
  289. * Tests provider.
  290. *
  291. * @covers ::getProvider
  292. * @covers ::setProvider
  293. */
  294. public function testFieldProvider() {
  295. $definition = BaseFieldDefinition::create($this->fieldType);
  296. $provider = $this->randomMachineName();
  297. $definition->setProvider($provider);
  298. $this->assertEquals($provider, $definition->getProvider());
  299. }
  300. /**
  301. * Tests custom storage.
  302. *
  303. * @covers ::hasCustomStorage
  304. * @covers ::setCustomStorage
  305. */
  306. public function testCustomStorage() {
  307. $definition = BaseFieldDefinition::create($this->fieldType);
  308. $this->assertFalse($definition->hasCustomStorage());
  309. $definition->setCustomStorage(TRUE);
  310. $this->assertTrue($definition->hasCustomStorage());
  311. $definition->setCustomStorage(FALSE);
  312. $this->assertFalse($definition->hasCustomStorage());
  313. }
  314. /**
  315. * Tests default value callbacks.
  316. *
  317. * @covers ::setDefaultValueCallback
  318. */
  319. public function testDefaultValueCallback() {
  320. $definition = BaseFieldDefinition::create($this->fieldType);
  321. $callback = get_class($this) . '::mockDefaultValueCallback';
  322. // setDefaultValueCallback returns $this.
  323. $this->assertSame($definition, $definition->setDefaultValueCallback($callback));
  324. }
  325. /**
  326. * Tests invalid default value callbacks.
  327. *
  328. * @covers ::setDefaultValueCallback
  329. */
  330. public function testInvalidDefaultValueCallback() {
  331. $definition = BaseFieldDefinition::create($this->fieldType);
  332. // setDefaultValueCallback returns $this.
  333. $this->expectException(\InvalidArgumentException::class);
  334. $definition->setDefaultValueCallback([get_class($this), 'mockDefaultValueCallback']);
  335. }
  336. /**
  337. * Tests NULL default value callbacks.
  338. *
  339. * @covers ::setDefaultValueCallback
  340. */
  341. public function testNullDefaultValueCallback() {
  342. $definition = BaseFieldDefinition::create($this->fieldType);
  343. // setDefaultValueCallback returns $this.
  344. $this->assertSame($definition, $definition->setDefaultValueCallback(NULL));
  345. }
  346. /**
  347. * Provides a Mock base field default value callback.
  348. *
  349. * @param \Drupal\Core\Entity\EntityInterface $entity
  350. * Entity interface.
  351. * @param \Drupal\Core\Field\FieldDefinitionInterface $definition
  352. * Field definition.
  353. *
  354. * @return string
  355. * Default value.
  356. */
  357. public static function mockDefaultValueCallback($entity, $definition) {
  358. return 'a default value';
  359. }
  360. }