Chris@17: page = $this->getSession()->getPage(); Chris@17: $this->webAssert = $this->assertSession(); Chris@17: } Chris@17: Chris@17: /** Chris@17: * Tests Field API fields on user registration forms. Chris@17: */ Chris@17: public function testRegistrationWithUserFields() { Chris@17: // Create a field on 'user' entity type. Chris@17: $field_storage = FieldStorageConfig::create([ Chris@17: 'field_name' => 'test_user_field', Chris@17: 'entity_type' => 'user', Chris@17: 'type' => 'test_field', Chris@17: 'cardinality' => 1, Chris@17: ]); Chris@17: $field_storage->save(); Chris@17: $field = FieldConfig::create([ Chris@17: 'field_storage' => $field_storage, Chris@17: 'label' => 'Some user field', Chris@17: 'bundle' => 'user', Chris@17: 'required' => TRUE, Chris@17: ]); Chris@17: $field->save(); Chris@17: Chris@17: entity_get_form_display('user', 'user', 'default') Chris@17: ->setComponent('test_user_field', ['type' => 'test_field_widget']) Chris@17: ->save(); Chris@17: $user_registration_form = entity_get_form_display('user', 'user', 'register'); Chris@17: $user_registration_form->save(); Chris@17: Chris@17: // Check that the field does not appear on the registration form. Chris@17: $this->drupalGet('user/register'); Chris@17: $this->webAssert->pageTextNotContains($field->label()); Chris@17: Chris@17: // Have the field appear on the registration form. Chris@17: $user_registration_form->setComponent('test_user_field', ['type' => 'test_field_widget'])->save(); Chris@17: Chris@17: $this->drupalGet('user/register'); Chris@17: $this->webAssert->pageTextContains($field->label()); Chris@17: Chris@17: // In order to check the server side validation the native browser Chris@17: // validation for required fields needs to be circumvented. Chris@17: $session = $this->getSession(); Chris@17: $session->executeScript("jQuery('#edit-test-user-field-0-value').prop('required', false);"); Chris@17: Chris@17: // Check that validation errors are correctly reported. Chris@17: $name = $this->randomMachineName(); Chris@17: $this->page->fillField('edit-name', $name); Chris@17: $this->page->fillField('edit-mail', $name . '@example.com'); Chris@17: Chris@17: $this->page->pressButton('edit-submit'); Chris@17: $this->webAssert->pageTextContains(t('@name field is required.', ['@name' => $field->label()])); Chris@17: Chris@17: // Invalid input. Chris@17: $this->page->fillField('edit-test-user-field-0-value', '-1'); Chris@17: $this->page->pressButton('edit-submit'); Chris@17: $this->webAssert->pageTextContains($field->label() . ' does not accept the value -1.'); Chris@17: Chris@17: // Submit with valid data. Chris@17: $value = (string) mt_rand(1, 255); Chris@17: $this->page->fillField('edit-test-user-field-0-value', $value); Chris@17: $this->page->pressButton('edit-submit'); Chris@17: // Check user fields. Chris@17: $accounts = $this->container->get('entity_type.manager')->getStorage('user') Chris@17: ->loadByProperties(['name' => $name, 'mail' => $name . '@example.com']); Chris@17: $new_user = reset($accounts); Chris@17: $this->assertEquals($value, $new_user->test_user_field->value, 'The field value was correctly saved.'); Chris@17: Chris@17: // Check that the 'add more' button works. Chris@17: $field_storage->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED); Chris@17: $field_storage->save(); Chris@17: $name = $this->randomMachineName(); Chris@17: $this->drupalGet('user/register'); Chris@17: $this->page->fillField('edit-name', $name); Chris@17: $this->page->fillField('edit-mail', $name . '@example.com'); Chris@17: $this->page->fillField('test_user_field[0][value]', $value); Chris@17: // Add two inputs. Chris@17: $this->page->pressButton('test_user_field_add_more'); Chris@17: $this->webAssert->waitForElement('css', 'input[name="test_user_field[1][value]"]'); Chris@17: $this->page->fillField('test_user_field[1][value]', $value . '1'); Chris@17: $this->page->pressButton('test_user_field_add_more'); Chris@17: $this->webAssert->waitForElement('css', 'input[name="test_user_field[2][value]"]'); Chris@17: $this->page->fillField('test_user_field[2][value]', $value . '2'); Chris@17: Chris@17: // Submit with three values. Chris@17: $this->page->pressButton('edit-submit'); Chris@17: Chris@17: // Check user fields. Chris@17: $accounts = $this->container->get('entity_type.manager') Chris@17: ->getStorage('user') Chris@17: ->loadByProperties(['name' => $name, 'mail' => $name . '@example.com']); Chris@17: $new_user = reset($accounts); Chris@17: $this->assertEquals($value, $new_user->test_user_field[0]->value, t('The field value was correctly saved.')); Chris@17: $this->assertEquals($value . '1', $new_user->test_user_field[1]->value, t('The field value was correctly saved.')); Chris@17: $this->assertEquals($value . '2', $new_user->test_user_field[2]->value, t('The field value was correctly saved.')); Chris@17: } Chris@17: Chris@17: }