29306cd4d168f5ae348bc559cd3d60024981919e
[yaffs-website] / web / core / modules / user / tests / src / FunctionalJavascript / RegistrationWithUserFieldsTest.php
1 <?php
2
3 namespace Drupal\Tests\user\FunctionalJavascript;
4
5 use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
6 use Drupal\Core\Field\FieldStorageDefinitionInterface;
7 use Drupal\field\Entity\FieldConfig;
8 use Drupal\field\Entity\FieldStorageConfig;
9
10 /**
11  * Tests user registration forms with additional fields.
12  *
13  * @group user
14  */
15 class RegistrationWithUserFieldsTest extends WebDriverTestBase {
16
17   /**
18    * WebAssert object.
19    *
20    * @var \Drupal\Tests\WebAssert
21    */
22   protected $webAssert;
23
24   /**
25    * DocumentElement object.
26    *
27    * @var \Behat\Mink\Element\DocumentElement
28    */
29   protected $page;
30
31   /**
32    * {@inheritdoc}
33    */
34   public static $modules = ['field_test'];
35
36   /**
37    * {@inheritdoc}
38    */
39   protected function setUp() {
40     parent::setUp();
41     $this->page = $this->getSession()->getPage();
42     $this->webAssert = $this->assertSession();
43   }
44
45   /**
46    * Tests Field API fields on user registration forms.
47    */
48   public function testRegistrationWithUserFields() {
49     // Create a field on 'user' entity type.
50     $field_storage = FieldStorageConfig::create([
51       'field_name' => 'test_user_field',
52       'entity_type' => 'user',
53       'type' => 'test_field',
54       'cardinality' => 1,
55     ]);
56     $field_storage->save();
57     $field = FieldConfig::create([
58       'field_storage' => $field_storage,
59       'label' => 'Some user field',
60       'bundle' => 'user',
61       'required' => TRUE,
62     ]);
63     $field->save();
64
65     entity_get_form_display('user', 'user', 'default')
66       ->setComponent('test_user_field', ['type' => 'test_field_widget'])
67       ->save();
68     $user_registration_form = entity_get_form_display('user', 'user', 'register');
69     $user_registration_form->save();
70
71     // Check that the field does not appear on the registration form.
72     $this->drupalGet('user/register');
73     $this->webAssert->pageTextNotContains($field->label());
74
75     // Have the field appear on the registration form.
76     $user_registration_form->setComponent('test_user_field', ['type' => 'test_field_widget'])->save();
77
78     $this->drupalGet('user/register');
79     $this->webAssert->pageTextContains($field->label());
80
81     // In order to check the server side validation the native browser
82     // validation for required fields needs to be circumvented.
83     $session = $this->getSession();
84     $session->executeScript("jQuery('#edit-test-user-field-0-value').prop('required', false);");
85
86     // Check that validation errors are correctly reported.
87     $name = $this->randomMachineName();
88     $this->page->fillField('edit-name', $name);
89     $this->page->fillField('edit-mail', $name . '@example.com');
90
91     $this->page->pressButton('edit-submit');
92     $this->webAssert->pageTextContains(t('@name field is required.', ['@name' => $field->label()]));
93
94     // Invalid input.
95     $this->page->fillField('edit-test-user-field-0-value', '-1');
96     $this->page->pressButton('edit-submit');
97     $this->webAssert->pageTextContains($field->label() . ' does not accept the value -1.');
98
99     // Submit with valid data.
100     $value = (string) mt_rand(1, 255);
101     $this->page->fillField('edit-test-user-field-0-value', $value);
102     $this->page->pressButton('edit-submit');
103     // Check user fields.
104     $accounts = $this->container->get('entity_type.manager')->getStorage('user')
105       ->loadByProperties(['name' => $name, 'mail' => $name . '@example.com']);
106     $new_user = reset($accounts);
107     $this->assertEquals($value, $new_user->test_user_field->value, 'The field value was correctly saved.');
108
109     // Check that the 'add more' button works.
110     $field_storage->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED);
111     $field_storage->save();
112     $name = $this->randomMachineName();
113     $this->drupalGet('user/register');
114     $this->page->fillField('edit-name', $name);
115     $this->page->fillField('edit-mail', $name . '@example.com');
116     $this->page->fillField('test_user_field[0][value]', $value);
117     // Add two inputs.
118     $this->page->pressButton('test_user_field_add_more');
119     $this->webAssert->waitForElement('css', 'input[name="test_user_field[1][value]"]');
120     $this->page->fillField('test_user_field[1][value]', $value . '1');
121     $this->page->pressButton('test_user_field_add_more');
122     $this->webAssert->waitForElement('css', 'input[name="test_user_field[2][value]"]');
123     $this->page->fillField('test_user_field[2][value]', $value . '2');
124
125     // Submit with three values.
126     $this->page->pressButton('edit-submit');
127
128     // Check user fields.
129     $accounts = $this->container->get('entity_type.manager')
130       ->getStorage('user')
131       ->loadByProperties(['name' => $name, 'mail' => $name . '@example.com']);
132     $new_user = reset($accounts);
133     $this->assertEquals($value, $new_user->test_user_field[0]->value, t('The field value was correctly saved.'));
134     $this->assertEquals($value . '1', $new_user->test_user_field[1]->value, t('The field value was correctly saved.'));
135     $this->assertEquals($value . '2', $new_user->test_user_field[2]->value, t('The field value was correctly saved.'));
136   }
137
138 }