ba5d5e8f3cd9df8a9a25fc742502ce899b96f430
[yaffs-website] / web / core / tests / Drupal / Tests / Core / Form / FormErrorHandlerTest.php
1 <?php
2
3 namespace Drupal\Tests\Core\Form;
4
5 use Drupal\Core\Form\FormState;
6 use Drupal\Core\Messenger\MessengerInterface;
7 use Drupal\Tests\UnitTestCase;
8
9 /**
10  * @coversDefaultClass \Drupal\Core\Form\FormErrorHandler
11  * @group Form
12  */
13 class FormErrorHandlerTest extends UnitTestCase {
14
15   /**
16    * The form error handler.
17    *
18    * @var \Drupal\Core\Form\FormErrorHandler|\PHPUnit_Framework_MockObject_MockObject
19    */
20   protected $formErrorHandler;
21
22   /**
23    * The messenger.
24    *
25    * @var \Drupal\Core\Messenger\MessengerInterface|\PHPUnit_Framework_MockObject_MockObject
26    */
27   protected $messenger;
28
29   /**
30    * {@inheritdoc}
31    */
32   protected function setUp() {
33     parent::setUp();
34
35     $this->messenger = $this->createMock(MessengerInterface::class);
36
37     $this->formErrorHandler = $this->getMockBuilder('Drupal\Core\Form\FormErrorHandler')
38       ->setMethods(['messenger'])
39       ->getMock();
40
41     $this->formErrorHandler->expects($this->atLeastOnce())
42       ->method('messenger')
43       ->willReturn($this->messenger);
44   }
45
46   /**
47    * @covers ::handleFormErrors
48    * @covers ::displayErrorMessages
49    */
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');
69
70     $form = [
71       '#parents' => [],
72       '#array_parents' => [],
73     ];
74     $form['test1'] = [
75       '#type' => 'textfield',
76       '#title' => 'Test 1',
77       '#parents' => ['test1'],
78       '#array_parents' => ['test1'],
79       '#id' => 'edit-test1',
80     ];
81     $form['test2'] = [
82       '#type' => 'textfield',
83       '#title' => 'Test 2 & a half',
84       '#parents' => ['test2'],
85       '#array_parents' => ['test2'],
86       '#id' => 'edit-test2',
87     ];
88     $form['fieldset'] = [
89       '#parents' => ['fieldset'],
90       '#array_parents' => ['fieldset'],
91       'test3' => [
92         '#type' => 'textfield',
93         '#title' => 'Test 3',
94         '#parents' => ['fieldset', 'test3'],
95         '#array_parents' => ['fieldset', 'test3'],
96         '#id' => 'edit-test3',
97       ],
98     ];
99     $form['test5'] = [
100       '#type' => 'textfield',
101       '#parents' => ['test5'],
102       '#array_parents' => ['test5'],
103       '#id' => 'edit-test5',
104     ];
105     $form['test6'] = [
106       '#type' => 'value',
107       '#title' => 'Test 6',
108       '#parents' => ['test6'],
109       '#array_parents' => ['test6'],
110       '#id' => 'edit-test6',
111     ];
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']);
121   }
122
123   /**
124    * @covers ::handleFormErrors
125    * @covers ::setElementErrorsFromFormState
126    */
127   public function testSetElementErrorsFromFormState() {
128     $form = [
129       '#parents' => [],
130       '#array_parents' => [],
131     ];
132     $form['test'] = [
133       '#type' => 'textfield',
134       '#title' => 'Test',
135       '#parents' => ['test'],
136       '#array_parents' => ['test'],
137       '#id' => 'edit-test',
138     ];
139     $form['details'] = [
140       '#type' => 'details',
141       '#title' => 'Details grouping test',
142       '#parents' => ['details'],
143       '#array_parents' => ['details'],
144       '#id' => 'edit-details',
145     ];
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',
153     ];
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',
161     ];
162     $form['details2'] = [
163       '#type' => 'details',
164       '#title' => 'Details grouping test 2',
165       '#parents' => ['details2'],
166       '#array_parents' => ['details2'],
167       '#id' => 'edit-details2',
168     ];
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',
176     ];
177     $form['fieldset'] = [
178       '#type' => 'fieldset',
179       '#parents' => ['fieldset'],
180       '#array_parents' => ['fieldset'],
181       '#id' => 'edit-fieldset',
182       'nested_test' => [
183         '#type' => 'textfield',
184         '#title' => 'Nested test',
185         '#parents' => ['fieldset', 'nested_test'],
186         '#array_parents' => ['fieldset', 'nested_test'],
187         '#id' => 'edit-nested_test',
188       ],
189       'nested_test2' => [
190         '#type' => 'textfield',
191         '#title' => 'Nested test2',
192         '#parents' => ['fieldset', 'nested_test2'],
193         '#array_parents' => ['fieldset', 'nested_test2'],
194         '#id' => 'edit-nested_test2',
195       ],
196     ];
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']);
205     $this->assertSame([
206       'grouping_test' => 'invalid',
207       'grouping_test2' => 'invalid',
208     ], $form['details']['#children_errors']);
209     $this->assertSame([
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']);
215   }
216
217 }