function NumberFieldTest::testNumberFormatter

Same name in other branches
  1. 9 core/modules/field/tests/src/FunctionalJavascript/Number/NumberFieldTest.php \Drupal\Tests\field\FunctionalJavascript\Number\NumberFieldTest::testNumberFormatter()
  2. 8.9.x core/modules/field/tests/src/FunctionalJavascript/Number/NumberFieldTest.php \Drupal\Tests\field\FunctionalJavascript\Number\NumberFieldTest::testNumberFormatter()
  3. 10 core/modules/field/tests/src/FunctionalJavascript/Number/NumberFieldTest.php \Drupal\Tests\field\FunctionalJavascript\Number\NumberFieldTest::testNumberFormatter()

Tests default formatter behavior.

File

core/modules/field/tests/src/FunctionalJavascript/Number/NumberFieldTest.php, line 49

Class

NumberFieldTest
Tests the numeric field widget.

Namespace

Drupal\Tests\field\FunctionalJavascript\Number

Code

public function testNumberFormatter() : void {
    $type = $this->randomMachineName();
    $float_field = $this->randomMachineName();
    $integer_field = $this->randomMachineName();
    $thousand_separators = [
        '',
        '.',
        ',',
        ' ',
        chr(8201),
        "'",
    ];
    $decimal_separators = [
        '.',
        ',',
    ];
    $prefix = $this->randomMachineName();
    $suffix = $this->randomMachineName();
    $random_float = rand(0, pow(10, 6));
    $random_integer = rand(0, pow(10, 6));
    $assert_session = $this->assertSession();
    // Create a content type containing float and integer fields.
    $this->drupalCreateContentType([
        'type' => $type,
    ]);
    FieldStorageConfig::create([
        'field_name' => $float_field,
        'entity_type' => 'node',
        'type' => 'float',
    ])->save();
    FieldStorageConfig::create([
        'field_name' => $integer_field,
        'entity_type' => 'node',
        'type' => 'integer',
    ])->save();
    FieldConfig::create([
        'field_name' => $float_field,
        'entity_type' => 'node',
        'bundle' => $type,
        'settings' => [
            'prefix' => $prefix,
            'suffix' => $suffix,
        ],
    ])->save();
    FieldConfig::create([
        'field_name' => $integer_field,
        'entity_type' => 'node',
        'bundle' => $type,
        'settings' => [
            'prefix' => $prefix,
            'suffix' => $suffix,
        ],
    ])->save();
    \Drupal::service('entity_display.repository')->getFormDisplay('node', $type, 'default')
        ->setComponent($float_field, [
        'type' => 'number',
        'settings' => [
            'placeholder' => '0.00',
        ],
    ])
        ->setComponent($integer_field, [
        'type' => 'number',
        'settings' => [
            'placeholder' => '0.00',
        ],
    ])
        ->save();
    \Drupal::service('entity_display.repository')->getViewDisplay('node', $type)
        ->setComponent($float_field, [
        'type' => 'number_decimal',
    ])
        ->setComponent($integer_field, [
        'type' => 'number_unformatted',
    ])
        ->save();
    // Create a node to test formatters.
    $node = Node::create([
        'type' => $type,
        'title' => $this->randomMachineName(),
        $float_field => [
            'value' => $random_float,
        ],
        $integer_field => [
            'value' => $random_integer,
        ],
    ]);
    $node->save();
    // Go to manage display page.
    $this->drupalGet("admin/structure/types/manage/{$type}/display");
    // Configure number_decimal formatter for the 'float' field type.
    $thousand_separator = $thousand_separators[array_rand($thousand_separators)];
    $decimal_separator = $decimal_separators[array_rand($decimal_separators)];
    $scale = rand(0, 10);
    $page = $this->getSession()
        ->getPage();
    $page->pressButton("{$float_field}_settings_edit");
    $assert_session->waitForElement('css', '.ajax-new-content');
    $edit = [
        "fields[{$float_field}][settings_edit_form][settings][prefix_suffix]" => TRUE,
        "fields[{$float_field}][settings_edit_form][settings][scale]" => $scale,
        "fields[{$float_field}][settings_edit_form][settings][decimal_separator]" => $decimal_separator,
        "fields[{$float_field}][settings_edit_form][settings][thousand_separator]" => $thousand_separator,
    ];
    foreach ($edit as $name => $value) {
        $page->fillField($name, $value);
    }
    $page->pressButton("{$float_field}_plugin_settings_update");
    $assert_session->waitForElement('css', '.field-plugin-summary-cell > .ajax-new-content');
    $this->submitForm([], 'Save');
    // Check number_decimal and number_unformatted formatters behavior.
    $this->drupalGet('node/' . $node->id());
    $float_formatted = number_format($random_float, $scale, $decimal_separator, $thousand_separator);
    $this->assertSession()
        ->responseContains("{$prefix}{$float_formatted}{$suffix}");
    $this->assertSession()
        ->responseContains((string) $random_integer);
    // Configure the number_decimal formatter.
    \Drupal::service('entity_display.repository')->getViewDisplay('node', $type)
        ->setComponent($integer_field, [
        'type' => 'number_integer',
    ])
        ->save();
    $this->drupalGet("admin/structure/types/manage/{$type}/display");
    $thousand_separator = $thousand_separators[array_rand($thousand_separators)];
    $page = $this->getSession()
        ->getPage();
    $page->pressButton("{$integer_field}_settings_edit");
    $assert_session->waitForElement('css', '.ajax-new-content');
    $edit = [
        "fields[{$integer_field}][settings_edit_form][settings][prefix_suffix]" => FALSE,
        "fields[{$integer_field}][settings_edit_form][settings][thousand_separator]" => $thousand_separator,
    ];
    foreach ($edit as $name => $value) {
        $page->fillField($name, $value);
    }
    $page->pressButton("{$integer_field}_plugin_settings_update");
    $assert_session->waitForElement('css', '.field-plugin-summary-cell > .ajax-new-content');
    $this->submitForm([], 'Save');
    // Check number_integer formatter behavior.
    $this->drupalGet('node/' . $node->id());
    $integer_formatted = number_format($random_integer, 0, '', $thousand_separator);
    $this->assertSession()
        ->responseContains($integer_formatted);
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.