3 namespace Drupal\Tests\Core\Form;
5 use Drupal\Core\Form\FormState;
6 use Drupal\Core\Messenger\MessengerInterface;
7 use Drupal\Tests\UnitTestCase;
10 * @coversDefaultClass \Drupal\Core\Form\FormErrorHandler
13 class FormErrorHandlerTest extends UnitTestCase {
16 * The form error handler.
18 * @var \Drupal\Core\Form\FormErrorHandler|\PHPUnit_Framework_MockObject_MockObject
20 protected $formErrorHandler;
25 * @var \Drupal\Core\Messenger\MessengerInterface|\PHPUnit_Framework_MockObject_MockObject
32 protected function setUp() {
35 $this->messenger = $this->createMock(MessengerInterface::class);
37 $this->formErrorHandler = $this->getMockBuilder('Drupal\Core\Form\FormErrorHandler')
38 ->setMethods(['messenger'])
41 $this->formErrorHandler->expects($this->atLeastOnce())
43 ->willReturn($this->messenger);
47 * @covers ::handleFormErrors
48 * @covers ::displayErrorMessages
50 public function testDisplayErrorMessages() {
51 $this->messenger->expects($this->at(0))
52 ->method('addMessage')
53 ->with('invalid', 'error');
54 $this->messenger->expects($this->at(1))
55 ->method('addMessage')
56 ->with('invalid', 'error');
57 $this->messenger->expects($this->at(2))
58 ->method('addMessage')
59 ->with('invalid', 'error');
60 $this->messenger->expects($this->at(3))
61 ->method('addMessage')
62 ->with('no title given', 'error');
63 $this->messenger->expects($this->at(4))
64 ->method('addMessage')
65 ->with('element is invisible', 'error');
66 $this->messenger->expects($this->at(5))
67 ->method('addMessage')
68 ->with('this missing element is invalid', 'error');
72 '#array_parents' => [],
75 '#type' => 'textfield',
77 '#parents' => ['test1'],
78 '#array_parents' => ['test1'],
79 '#id' => 'edit-test1',
82 '#type' => 'textfield',
83 '#title' => 'Test 2 & a half',
84 '#parents' => ['test2'],
85 '#array_parents' => ['test2'],
86 '#id' => 'edit-test2',
89 '#parents' => ['fieldset'],
90 '#array_parents' => ['fieldset'],
92 '#type' => 'textfield',
94 '#parents' => ['fieldset', 'test3'],
95 '#array_parents' => ['fieldset', 'test3'],
96 '#id' => 'edit-test3',
100 '#type' => 'textfield',
101 '#parents' => ['test5'],
102 '#array_parents' => ['test5'],
103 '#id' => 'edit-test5',
107 '#title' => 'Test 6',
108 '#parents' => ['test6'],
109 '#array_parents' => ['test6'],
110 '#id' => 'edit-test6',
112 $form_state = new FormState();
113 $form_state->setErrorByName('test1', 'invalid');
114 $form_state->setErrorByName('test2', 'invalid');
115 $form_state->setErrorByName('fieldset][test3', 'invalid');
116 $form_state->setErrorByName('test5', 'no title given');
117 $form_state->setErrorByName('test6', 'element is invisible');
118 $form_state->setErrorByName('missing_element', 'this missing element is invalid');
119 $this->formErrorHandler->handleFormErrors($form, $form_state);
120 $this->assertSame('invalid', $form['test1']['#errors']);
124 * @covers ::handleFormErrors
125 * @covers ::setElementErrorsFromFormState
127 public function testSetElementErrorsFromFormState() {
130 '#array_parents' => [],
133 '#type' => 'textfield',
135 '#parents' => ['test'],
136 '#array_parents' => ['test'],
137 '#id' => 'edit-test',
140 '#type' => 'details',
141 '#title' => 'Details grouping test',
142 '#parents' => ['details'],
143 '#array_parents' => ['details'],
144 '#id' => 'edit-details',
146 $form['grouping_test'] = [
147 '#type' => 'textfield',
148 '#title' => 'Grouping test',
149 '#parents' => ['grouping_test'],
150 '#array_parents' => ['grouping_test'],
151 '#id' => 'edit-grouping-test',
152 '#group' => 'details',
154 $form['grouping_test2'] = [
155 '#type' => 'textfield',
156 '#title' => 'Grouping test 2',
157 '#parents' => ['grouping_test2'],
158 '#array_parents' => ['grouping_test2'],
159 '#id' => 'edit-grouping-test2',
160 '#group' => 'details',
162 $form['details2'] = [
163 '#type' => 'details',
164 '#title' => 'Details grouping test 2',
165 '#parents' => ['details2'],
166 '#array_parents' => ['details2'],
167 '#id' => 'edit-details2',
169 $form['grouping_test3'] = [
170 '#type' => 'textfield',
171 '#title' => 'Grouping test 3',
172 '#parents' => ['grouping_test3'],
173 '#array_parents' => ['grouping_test3'],
174 '#id' => 'edit-grouping-test3',
175 '#group' => 'details2',
177 $form['fieldset'] = [
178 '#type' => 'fieldset',
179 '#parents' => ['fieldset'],
180 '#array_parents' => ['fieldset'],
181 '#id' => 'edit-fieldset',
183 '#type' => 'textfield',
184 '#title' => 'Nested test',
185 '#parents' => ['fieldset', 'nested_test'],
186 '#array_parents' => ['fieldset', 'nested_test'],
187 '#id' => 'edit-nested_test',
190 '#type' => 'textfield',
191 '#title' => 'Nested test2',
192 '#parents' => ['fieldset', 'nested_test2'],
193 '#array_parents' => ['fieldset', 'nested_test2'],
194 '#id' => 'edit-nested_test2',
197 $form_state = new FormState();
198 $form_state->setErrorByName('test', 'invalid');
199 $form_state->setErrorByName('grouping_test', 'invalid');
200 $form_state->setErrorByName('grouping_test2', 'invalid');
201 $form_state->setErrorByName('fieldset][nested_test', 'invalid');
202 $form_state->setErrorByName('fieldset][nested_test2', 'invalid2');
203 $this->formErrorHandler->handleFormErrors($form, $form_state);
204 $this->assertSame('invalid', $form['test']['#errors']);
206 'grouping_test' => 'invalid',
207 'grouping_test2' => 'invalid',
208 ], $form['details']['#children_errors']);
210 'fieldset][nested_test' => 'invalid',
211 'fieldset][nested_test2' => 'invalid2',
212 ], $form['fieldset']['#children_errors']);
213 $this->assertEmpty($form['details2']['#children_errors'], 'Children errors are empty for grouping element.');
214 $this->assertCount(5, $form['#children_errors']);