diff --git a/core/modules/user/tests/src/FunctionalJavascript/RegistrationWithUserFieldsTest.php b/core/modules/user/tests/src/FunctionalJavascript/RegistrationWithUserFieldsTest.php index e69de29bb2..db316fa322 100644 --- a/core/modules/user/tests/src/FunctionalJavascript/RegistrationWithUserFieldsTest.php +++ b/core/modules/user/tests/src/FunctionalJavascript/RegistrationWithUserFieldsTest.php @@ -0,0 +1,159 @@ +page = $this->getSession()->getPage(); + $this->webAssert = $this->assertSession(); + } + + /** + * Tests Field API fields on user registration forms. + */ + public function testRegistrationWithUserFields() { + // Create a field on 'user' entity type. + $field_storage = FieldStorageConfig::create([ + 'field_name' => 'test_user_field', + 'entity_type' => 'user', + 'type' => 'test_field', + 'cardinality' => 1, + ]); + $field_storage->save(); + $field = FieldConfig::create([ + 'field_storage' => $field_storage, + 'label' => 'Some user field', + 'bundle' => 'user', + 'required' => TRUE, + ]); + $field->save(); + + entity_get_form_display('user', 'user', 'default') + ->setComponent('test_user_field', ['type' => 'test_field_widget']) + ->save(); + entity_get_form_display('user', 'user', 'register') + ->save(); + + // Check that the field does not appear on the registration form. + $this->drupalGet('user/register'); + $this->webAssert->pageTextNotContains($field->label()); + $this->webAssert->responseHeaderContains('X-Drupal-Cache-Tags','config:core.entity_form_display.user.user.register'); + $this->webAssert->responseHeaderContains('X-Drupal-Cache-Tags','config:user.settings'); + + // Have the field appear on the registration form. + entity_get_form_display('user', 'user', 'register') + ->setComponent('test_user_field', ['type' => 'test_field_widget']) + ->save(); + + $this->drupalGet('user/register'); + $this->webAssert->pageTextContains($field->label()); + $this->assertRegistrationFormCacheTagsWithUserFields(); + + // Check that validation errors are correctly reported. + $name = $this->randomMachineName(); + $this->page->fillField('edit-name', $name); + $this->page->fillField('edit-mail', $name . '@example.com'); + + $this->page->pressButton('edit-submit'); + $this->assertRegistrationFormCacheTagsWithUserFields(); + $this->webAssert->pageTextContains(t('@name field is required.', ['@name' => $field->label()])); + + // Invalid input. + $test_user_field = $this->page->fillField('edit-test-user-field-0-value', '-1'); + $this->page->pressButton('edit-submit'); + $this->assertRegistrationFormCacheTagsWithUserFields(); + $this->webAssert->pageTextContains(t('%name does not accept the value -1.', ['%name' => $field->label()])); + + // Submit with valid data. + $value = mt_rand(1, 255); + $test_user_field->setValue($value); + $this->page->pressButton('edit-submit'); + // Check user fields. + $accounts = $this->container->get('entity_type.manager')->getStorage('user') + ->loadByProperties(['name' => $name, 'mail' => $name . '@example.com']); + $new_user = reset($accounts); + $this->assertEquals($value, $new_user->test_user_field->value,'The field value was correctly saved.'); + + // Check that the 'add more' button works. + $field_storage->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED); + $field_storage->save(); + foreach (['js', 'nojs'] as $js) { + $this->drupalGet('user/register'); + $this->assertRegistrationFormCacheTagsWithUserFields(); + + // Add two inputs. + $value = mt_rand(1, 255); + $test_user_field->setValue($value); + if ($js == 'js') { + $field_test_user_add_more = $this->page->find('css', 'edit-test-user-field-add-more'); + $field_test_user_add_more->click(); + $field_test_user_add_more->click(); + } + else { + $this->page->pressButton('edit-test-user-field-add-more'); + $this->page->pressButton('edit-test-user-field-add-more'); + } + + // Submit with three values. + $first_test_user_field = $this->page->findField('edit-test-user-field-0-value'); + $first_test_user_field->setValue($value + 1); + $second_test_user_field = $this->page->findField('edit-test-user-field-1-value'); + $second_test_user_field->setValue($value + 2); + $this->page->fillField('edit-name', $name); + $this->page->fillField('edit-mail', $name . '@example.com'); + $this->page->pressButton('edit-submit'); + + // Check user fields. + $accounts = $this->container->get('entity_type.manager')->getStorage('user') + ->loadByProperties(['name' => $name, 'mail' => $name . '@example.com']); + $new_user = reset($accounts); + $this->assertEquals($value, $new_user->test_user_field[0]->value, t('@js : The field value was correctly saved.', ['@js' => $js])); + $this->assertEquals($value + 1, $new_user->test_user_field[1]->value, t('@js : The field value was correctly saved.', ['@js' => $js])); + $this->assertEquals($value + 2, $new_user->test_user_field[2]->value, t('@js : The field value was correctly saved.', ['@js' => $js])); + } + } + + /** + * Asserts the presence of cache tags on registration form with user fields. + */ + protected function assertRegistrationFormCacheTagsWithUserFields() { + $this->webAssert->responseHeaderContains('X-Drupal-Cache-Tags','config:core.entity_form_display.user.user.register'); + $this->webAssert->responseHeaderContains('X-Drupal-Cache-Tags','config:field.field.user.user.test_user_field'); + $this->webAssert->responseHeaderContains('X-Drupal-Cache-Tags','config:field.storage.user.test_user_field'); + $this->webAssert->responseHeaderContains('X-Drupal-Cache-Tags','config:user.settings'); + } + +}