PageRenderTime 49ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/core/modules/number/lib/Drupal/number/Tests/NumberFieldTest.php

https://bitbucket.org/aswinvk28/smartpan-stock-drupal
PHP | 328 lines | 256 code | 25 blank | 47 comment | 0 complexity | 212567031df571b41753314fec5fb031 MD5 | raw file
Possible License(s): LGPL-2.1
  1. <?php
  2. /**
  3. * @file
  4. * Definition of Drupal\number\NumberFieldTest.
  5. */
  6. namespace Drupal\number\Tests;
  7. use Drupal\simpletest\WebTestBase;
  8. /**
  9. * Tests for number field types.
  10. */
  11. class NumberFieldTest extends WebTestBase {
  12. /**
  13. * Modules to enable.
  14. *
  15. * @var array
  16. */
  17. public static $modules = array('node', 'entity_test', 'number', 'field_ui');
  18. /**
  19. * A field to use in this class.
  20. *
  21. * @var \Drupal\field\Entity\Field
  22. */
  23. protected $field;
  24. /**
  25. * A field instance to use in this test class.
  26. *
  27. * @var \Drupal\field\Entity\FieldInstance
  28. */
  29. protected $instance;
  30. /**
  31. * A user with permission to view and manage entities and content types.
  32. *
  33. * @var \Drupal\user\UserInterface
  34. */
  35. protected $web_user;
  36. public static function getInfo() {
  37. return array(
  38. 'name' => 'Number field',
  39. 'description' => 'Test the creation of number fields.',
  40. 'group' => 'Field types'
  41. );
  42. }
  43. function setUp() {
  44. parent::setUp();
  45. $this->web_user = $this->drupalCreateUser(array('view test entity', 'administer entity_test content', 'administer content types', 'administer node fields', 'administer node display', 'bypass node access'));
  46. $this->drupalLogin($this->web_user);
  47. }
  48. /**
  49. * Test number_decimal field.
  50. */
  51. function testNumberDecimalField() {
  52. // Create a field with settings to validate.
  53. $field_name = drupal_strtolower($this->randomName());
  54. entity_create('field_entity', array(
  55. 'name' => $field_name,
  56. 'entity_type' => 'entity_test',
  57. 'type' => 'number_decimal',
  58. 'settings' => array(
  59. 'precision' => 8, 'scale' => 4, 'decimal_separator' => '.',
  60. )
  61. ))->save();
  62. entity_create('field_instance', array(
  63. 'field_name' => $field_name,
  64. 'entity_type' => 'entity_test',
  65. 'bundle' => 'entity_test',
  66. ))->save();
  67. entity_get_form_display('entity_test', 'entity_test', 'default')
  68. ->setComponent($field_name, array(
  69. 'type' => 'number',
  70. 'settings' => array(
  71. 'placeholder' => '0.00'
  72. ),
  73. ))
  74. ->save();
  75. entity_get_display('entity_test', 'entity_test', 'default')
  76. ->setComponent($field_name, array(
  77. 'type' => 'number_decimal',
  78. ))
  79. ->save();
  80. // Display creation form.
  81. $this->drupalGet('entity_test/add');
  82. $this->assertFieldByName("{$field_name}[0][value]", '', 'Widget is displayed');
  83. $this->assertRaw('placeholder="0.00"');
  84. // Submit a signed decimal value within the allowed precision and scale.
  85. $value = '-1234.5678';
  86. $edit = array(
  87. 'user_id' => 1,
  88. 'name' => $this->randomName(),
  89. "{$field_name}[0][value]" => $value,
  90. );
  91. $this->drupalPostForm(NULL, $edit, t('Save'));
  92. preg_match('|entity_test/manage/(\d+)|', $this->url, $match);
  93. $id = $match[1];
  94. $this->assertText(t('entity_test @id has been created.', array('@id' => $id)), 'Entity was created');
  95. $this->assertRaw(round($value, 2), 'Value is displayed.');
  96. // Try to create entries with more than one decimal separator; assert fail.
  97. $wrong_entries = array(
  98. '3.14.159',
  99. '0..45469',
  100. '..4589',
  101. '6.459.52',
  102. '6.3..25',
  103. );
  104. foreach ($wrong_entries as $wrong_entry) {
  105. $this->drupalGet('entity_test/add');
  106. $edit = array(
  107. "{$field_name}[0][value]" => $wrong_entry,
  108. );
  109. $this->drupalPostForm(NULL, $edit, t('Save'));
  110. $this->assertRaw(t('%name must be a number.', array('%name' => $field_name)), 'Correctly failed to save decimal value with more than one decimal point.');
  111. }
  112. // Try to create entries with minus sign not in the first position.
  113. $wrong_entries = array(
  114. '3-3',
  115. '4-',
  116. '1.3-',
  117. '1.2-4',
  118. '-10-10',
  119. );
  120. foreach ($wrong_entries as $wrong_entry) {
  121. $this->drupalGet('entity_test/add');
  122. $edit = array(
  123. "{$field_name}[0][value]" => $wrong_entry,
  124. );
  125. $this->drupalPostForm(NULL, $edit, t('Save'));
  126. $this->assertRaw(t('%name must be a number.', array('%name' => $field_name)), 'Correctly failed to save decimal value with minus sign in the wrong position.');
  127. }
  128. }
  129. /**
  130. * Test number_integer field.
  131. */
  132. function testNumberIntegerField() {
  133. // Display the "Add content type" form.
  134. $this->drupalGet('admin/structure/types/add');
  135. // Add a content type.
  136. $name = $this->randomName();
  137. $type = drupal_strtolower($name);
  138. $edit = array('name' => $name, 'type' => $type);
  139. $this->drupalPostForm(NULL, $edit, t('Save and manage fields'));
  140. // Add an integer field to the newly-created type.
  141. $label = $this->randomName();
  142. $field_name = drupal_strtolower($label);
  143. $edit = array(
  144. 'fields[_add_new_field][label]'=> $label,
  145. 'fields[_add_new_field][field_name]' => $field_name,
  146. 'fields[_add_new_field][type]' => 'number_integer',
  147. );
  148. $this->drupalPostForm(NULL, $edit, t('Save'));
  149. // Add prefix and suffix for the newly-created field.
  150. $prefix = $this->randomName();
  151. $suffix = $this->randomName();
  152. $edit = array(
  153. 'instance[settings][prefix]' => $prefix,
  154. 'instance[settings][suffix]' => $suffix,
  155. );
  156. $this->drupalPostForm("admin/structure/types/manage/$type/fields/node.$type.field_$field_name", $edit, t('Save settings'));
  157. // Set the formatter to "unformatted" and to "number_integer", and just
  158. // check that the settings summary does not generate warnings.
  159. $this->drupalGet("admin/structure/types/manage/$type/display");
  160. $edit = array(
  161. "fields[field_$field_name][type]" => 'number_unformatted',
  162. );
  163. $this->drupalPostForm(NULL, $edit, t('Save'));
  164. $edit = array(
  165. "fields[field_$field_name][type]" => 'number_integer',
  166. );
  167. $this->drupalPostForm(NULL, $edit, t('Save'));
  168. }
  169. /**
  170. * Test default formatter behavior
  171. */
  172. function testNumberFormatter() {
  173. $type = drupal_strtolower($this->randomName());
  174. $float_field = drupal_strtolower($this->randomName());
  175. $integer_field = drupal_strtolower($this->randomName());
  176. $thousand_separators = array('', '.', ',', ' ', chr(8201), "'");
  177. $decimal_separators = array('.', ',');
  178. $prefix = $this->randomName();
  179. $suffix = $this->randomName();
  180. $random_float = rand(0,pow(10,6));
  181. $random_integer = rand(0, pow(10,6));
  182. // Create a content type containing float and integer fields.
  183. $this->drupalCreateContentType(array('type' => $type));
  184. entity_create('field_entity', array(
  185. 'name' => $float_field,
  186. 'entity_type' => 'node',
  187. 'type' => 'number_float',
  188. ))->save();
  189. entity_create('field_entity', array(
  190. 'name' => $integer_field,
  191. 'entity_type' => 'node',
  192. 'type' => 'number_integer',
  193. ))->save();
  194. entity_create('field_instance', array(
  195. 'field_name' => $float_field,
  196. 'entity_type' => 'node',
  197. 'bundle' => $type,
  198. 'settings' => array(
  199. 'prefix' => $prefix,
  200. 'suffix' => $suffix
  201. ),
  202. ))->save();
  203. entity_create('field_instance', array(
  204. 'field_name' => $integer_field,
  205. 'entity_type' => 'node',
  206. 'bundle' => $type,
  207. 'settings' => array(
  208. 'prefix' => $prefix,
  209. 'suffix' => $suffix
  210. ),
  211. ))->save();
  212. entity_get_form_display('node', $type, 'default')
  213. ->setComponent($float_field, array(
  214. 'type' => 'number',
  215. 'settings' => array(
  216. 'placeholder' => '0.00'
  217. ),
  218. ))
  219. ->setComponent($integer_field, array(
  220. 'type' => 'number',
  221. 'settings' => array(
  222. 'placeholder' => '0.00'
  223. ),
  224. ))
  225. ->save();
  226. entity_get_display('node', $type, 'default')
  227. ->setComponent($float_field, array(
  228. 'type' => 'number_decimal',
  229. ))
  230. ->setComponent($integer_field, array(
  231. 'type' => 'number_unformatted',
  232. ))
  233. ->save();
  234. // Create a node to test formatters.
  235. $node = entity_create('node', array(
  236. 'type' => $type,
  237. 'title' => $this->randomName(),
  238. $float_field => array(
  239. 'value' => $random_float,
  240. ),
  241. $integer_field => array(
  242. 'value' => $random_integer,
  243. ),
  244. ));
  245. $node->save();
  246. // Go to manage display page.
  247. $this->drupalGet("admin/structure/types/manage/$type/display");
  248. // Configure number_decimal formatter for number_float_field
  249. $thousand_separator = $thousand_separators[array_rand($thousand_separators)];
  250. $decimal_separator = $decimal_separators[array_rand($decimal_separators)];
  251. $scale = rand(0, 10);
  252. $this->drupalPostAjaxForm(NULL, array(), "${float_field}_settings_edit");
  253. $edit = array(
  254. "fields[${float_field}][settings_edit_form][settings][prefix_suffix]" => TRUE,
  255. "fields[${float_field}][settings_edit_form][settings][scale]" => $scale,
  256. "fields[${float_field}][settings_edit_form][settings][decimal_separator]" => $decimal_separator,
  257. "fields[${float_field}][settings_edit_form][settings][thousand_separator]" => $thousand_separator,
  258. );
  259. $this->drupalPostAjaxForm(NULL, $edit, "${float_field}_plugin_settings_update");
  260. $this->drupalPostForm(NULL, array(), t('Save'));
  261. // Check number_decimal and number_unformatted formatters behavior.
  262. $this->drupalGet('node/' . $node->id());
  263. $float_formatted = number_format($random_float, $scale, $decimal_separator, $thousand_separator);
  264. $this->assertRaw("$prefix$float_formatted$suffix", 'Prefix and suffix added');
  265. $this->assertRaw((string) $random_integer);
  266. // Configure the number_decimal formatter.
  267. entity_get_display('node', $type, 'default')
  268. ->setComponent($integer_field, array(
  269. 'type' => 'number_integer',
  270. ))
  271. ->save();
  272. $this->drupalGet("admin/structure/types/manage/$type/display");
  273. $thousand_separator = $thousand_separators[array_rand($thousand_separators)];
  274. $this->drupalPostAjaxForm(NULL, array(), "${integer_field}_settings_edit");
  275. $edit = array(
  276. "fields[${integer_field}][settings_edit_form][settings][prefix_suffix]" => FALSE,
  277. "fields[${integer_field}][settings_edit_form][settings][thousand_separator]" => $thousand_separator,
  278. );
  279. $this->drupalPostAjaxForm(NULL, $edit, "${integer_field}_plugin_settings_update");
  280. $this->drupalPostForm(NULL, array(), t('Save'));
  281. // Check number_integer formatter behavior.
  282. $this->drupalGet('node/' . $node->id());
  283. $integer_formatted = number_format($random_integer, 0, '', $thousand_separator);
  284. $this->assertRaw($integer_formatted, 'Random integer formatted');
  285. }
  286. }