function ManageFieldsTest::testAddField
Same name in this branch
- main core/modules/field_ui/tests/src/Functional/ManageFieldsTest.php \Drupal\Tests\field_ui\Functional\ManageFieldsTest::testAddField()
Same name and namespace in other branches
- 11.x core/modules/field_ui/tests/src/FunctionalJavascript/ManageFieldsTest.php \Drupal\Tests\field_ui\FunctionalJavascript\ManageFieldsTest::testAddField()
- 11.x core/modules/field_ui/tests/src/Functional/ManageFieldsTest.php \Drupal\Tests\field_ui\Functional\ManageFieldsTest::testAddField()
- 10 core/modules/field_ui/tests/src/FunctionalJavascript/ManageFieldsTest.php \Drupal\Tests\field_ui\FunctionalJavascript\ManageFieldsTest::testAddField()
- 10 core/modules/field_ui/tests/src/Functional/ManageFieldsTest.php \Drupal\Tests\field_ui\Functional\ManageFieldsTest::testAddField()
Tests field add.
File
-
core/
modules/ field_ui/ tests/ src/ FunctionalJavascript/ ManageFieldsTest.php, line 161
Class
- ManageFieldsTest
- Tests the Field UI "Manage Fields" screens.
Namespace
Drupal\Tests\field_ui\FunctionalJavascriptCode
public function testAddField() : void {
$page = $this->getSession()
->getPage();
$assert_session = $this->assertSession();
$this->drupalGet('admin/structure/types/manage/article/fields');
$this->clickLink('Create a new field');
$field_name = 'test_field_1';
$this->assertSession()
->assertWaitOnAjaxRequest();
$this->clickLink('Number');
$assert_session->assertWaitOnAjaxRequest();
$assert_session->waitForText('Add field: Number');
$buttons = $this->assertSession()
->elementExists('css', '.ui-dialog-buttonpane');
// Test validation.
$buttons->pressButton('Continue');
$assert_session->assertWaitOnAjaxRequest();
$assert_session->pageTextContains('Label field is required.');
$assert_session->pageTextContains('You need to select a field type.');
$assert_session->elementExists('css', '[name="label"].error');
$assert_session->elementExists('css', '[name="field_options_wrapper"].error');
$page->fillField('label', $field_name);
$buttons = $this->assertSession()
->elementExists('css', '.ui-dialog-buttonpane');
$buttons->pressButton('Continue');
$assert_session->assertWaitOnAjaxRequest();
$assert_session->pageTextContains('You need to select a field type.');
$assert_session->elementNotExists('css', '[name="label"].error');
$assert_session->elementExists('css', '[name="field_options_wrapper"].error');
$buttons = $this->assertSession()
->elementExists('css', '.ui-dialog-buttonpane');
$buttons->pressButton('Change field type');
$this->assertSession()
->assertWaitOnAjaxRequest();
// Try adding a field using a grouped field type.
$this->clickLink('Email');
$assert_session->assertWaitOnAjaxRequest();
$assert_session->pageTextNotContains('Choose a field type');
$assert_session->elementExists('css', '[name="label"]');
$buttons = $this->assertSession()
->elementExists('css', '.ui-dialog-buttonpane');
$buttons->pressButton('Change field type');
$this->assertSession()
->assertWaitOnAjaxRequest();
$this->clickLink('Plain text');
$assert_session->assertWaitOnAjaxRequest();
$assert_session->pageTextContains('Choose a field type');
$assert_session->elementExists('css', '[name="label"]');
$page->fillField('label', $field_name);
$this->assertNotEmpty($text_plain = $page->find('xpath', '//*[text() = "Short text"]')
->getParent());
$text_plain->click();
$this->assertTrue($assert_session->elementExists('css', '[name="field_options_wrapper"][value="string"]')
->isSelected());
$buttons = $this->assertSession()
->elementExists('css', '.ui-dialog-buttonpane');
$buttons->pressButton('Continue');
$this->assertSession()
->assertWaitOnAjaxRequest();
// Ensure the default value is reloaded when the field storage settings
// are changed.
$default_input_1_name = 'default_value_input[field_test_field_1][0][value]';
$default_input_1 = $assert_session->fieldExists($default_input_1_name);
$this->assertFalse($default_input_1->isVisible());
$default_value = $assert_session->fieldExists('set_default_value');
$default_value->check();
$assert_session->waitForElementVisible('xpath', $default_value->getXpath());
$default_input_1->setValue('There can be only one!');
$default_input_2_name = 'default_value_input[field_test_field_1][1][value]';
$assert_session->fieldNotExists($default_input_2_name);
$cardinality = $assert_session->fieldExists('field_storage[subform][cardinality_number]');
$cardinality->setValue(2);
$default_input_2 = $assert_session->waitForField($default_input_2_name);
// Ensure the default value for first input is retained.
$assert_session->fieldValueEquals($default_input_1_name, 'There can be only one!');
$page->findField($default_input_2_name)
->setValue('But maybe also two?');
$cardinality->setValue('1');
$assert_session->assertWaitOnAjaxRequest();
$assert_session->waitForElementRemoved('xpath', $default_input_2->getXpath());
// Ensure the first input retains its value.
$assert_session->fieldValueEquals($default_input_1_name, 'There can be only one!');
$cardinality->setValue(2);
$assert_session->waitForField($default_input_2_name);
// Ensure when the second input is added again it does not retain its value.
$assert_session->fieldValueEquals($default_input_2_name, '');
// Ensure changing the max length input will also reload the form.
$max_length_input = $assert_session->fieldExists('field_storage[subform][settings][max_length]');
$this->assertSame('255', $max_length_input->getValue());
$this->assertSame('255', $default_input_1->getAttribute('maxlength'));
$max_length_input->setValue('5');
$page->waitFor(5, function () use ($default_input_1) {
return $default_input_1->getAttribute('maxlength') === '5';
});
$this->assertSame('5', $default_input_1->getAttribute('maxlength'));
// Set a default value that is under the new limit.
$default_input_1->setValue('Five!');
$buttons = $this->assertSession()
->elementExists('css', '.ui-dialog-buttonpane');
$buttons->pressButton('Save');
$this->assertTrue($assert_session->waitForText('Saved ' . $field_name . ' configuration.'));
$this->assertNotNull($field_storage = FieldStorageConfig::loadByName('node', "field_{$field_name}"));
$this->assertEquals('string', $field_storage->getType());
// Try adding a field using a non-grouped field type.
$this->drupalGet('admin/structure/types/manage/article/fields');
$this->clickLink('Create a new field');
$this->assertSession()
->assertWaitOnAjaxRequest();
$this->assertNotEmpty($number_field = $page->find('xpath', '//*[text() = "Number"]')
->getParent());
$number_field->click();
$assert_session->assertWaitOnAjaxRequest();
$assert_session->pageTextContains('Choose a field type');
$this->assertNotEmpty($number_integer = $page->find('xpath', '//*[text() = "Integer"]')
->getParent());
$number_integer->click();
$this->assertTrue($assert_session->elementExists('css', '[name="field_options_wrapper"][value="integer"]')
->isSelected());
$buttons = $this->assertSession()
->elementExists('css', '.ui-dialog-buttonpane');
$buttons->pressButton('Change field type');
$this->assertSession()
->assertWaitOnAjaxRequest();
$this->assertNotEmpty($test_field = $page->find('xpath', '//*[text() = "Test field"]')
->getParent());
$test_field->click();
$assert_session->assertWaitOnAjaxRequest();
$field_name = 'test_field_2';
$page->fillField('label', $field_name);
$assert_session->pageTextNotContains('Choose a field type');
$buttons = $this->assertSession()
->elementExists('css', '.ui-dialog-buttonpane');
$buttons->pressButton('Continue');
$this->assertSession()
->assertWaitOnAjaxRequest();
$buttons = $this->assertSession()
->elementExists('css', '.ui-dialog-buttonpane');
$buttons->pressButton('Save');
$this->assertTrue($assert_session->waitForText('Saved ' . $field_name . ' configuration.'));
$this->assertNotNull($field_storage = FieldStorageConfig::loadByName('node', "field_{$field_name}"));
$this->assertEquals('test_field', $field_storage->getType());
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.