d9537c3fdbdb5b6f8eb43532a4b898eafcd8caa3
[yaffs-website] / web / core / tests / Drupal / Tests / Core / Form / FormAjaxResponseBuilderTest.php
1 <?php
2
3 namespace Drupal\Tests\Core\Form;
4
5 use Drupal\Core\Ajax\AjaxResponse;
6 use Drupal\Core\Ajax\AlertCommand;
7 use Drupal\Core\Form\FormAjaxResponseBuilder;
8 use Drupal\Core\Form\FormState;
9 use Drupal\Core\Form\FormStateInterface;
10 use Drupal\Tests\UnitTestCase;
11 use Symfony\Component\HttpFoundation\Request;
12 use Symfony\Component\HttpKernel\Exception\HttpException;
13
14 /**
15  * @coversDefaultClass \Drupal\Core\Form\FormAjaxResponseBuilder
16  * @group Form
17  */
18 class FormAjaxResponseBuilderTest extends UnitTestCase {
19
20   /**
21    * @var \Drupal\Core\Render\MainContent\MainContentRendererInterface|\PHPUnit_Framework_MockObject_MockObject
22    */
23   protected $renderer;
24
25   /**
26    * @var \Drupal\Core\Routing\RouteMatchInterface|\PHPUnit_Framework_MockObject_MockObject
27    */
28   protected $routeMatch;
29
30   /**
31    * @var \Drupal\Core\Form\FormAjaxResponseBuilder
32    */
33   protected $formAjaxResponseBuilder;
34
35   /**
36    * {@inheritdoc}
37    */
38   protected function setUp() {
39     parent::setUp();
40     $this->renderer = $this->getMock('Drupal\Core\Render\MainContent\MainContentRendererInterface');
41     $this->routeMatch = $this->getMock('Drupal\Core\Routing\RouteMatchInterface');
42     $this->formAjaxResponseBuilder = new FormAjaxResponseBuilder($this->renderer, $this->routeMatch);
43   }
44
45   /**
46    * @covers ::buildResponse
47    */
48   public function testBuildResponseNoTriggeringElement() {
49     $this->renderer->expects($this->never())
50       ->method('renderResponse');
51
52     $request = new Request();
53     $form = [];
54     $form_state = new FormState();
55     $commands = [];
56
57     $expected = [];
58     $this->setExpectedException(HttpException::class);
59     $this->formAjaxResponseBuilder->buildResponse($request, $form, $form_state, $commands);
60   }
61
62   /**
63    * @covers ::buildResponse
64    */
65   public function testBuildResponseNoCallable() {
66     $this->renderer->expects($this->never())
67       ->method('renderResponse');
68
69     $request = new Request();
70     $form = [];
71     $form_state = new FormState();
72     $triggering_element = [];
73     $form_state->setTriggeringElement($triggering_element);
74     $commands = [];
75
76     $expected = [];
77     $this->setExpectedException(HttpException::class);
78     $this->formAjaxResponseBuilder->buildResponse($request, $form, $form_state, $commands);
79   }
80
81   /**
82    * @covers ::buildResponse
83    */
84   public function testBuildResponseRenderArray() {
85     $triggering_element = [
86       '#ajax' => [
87         'callback' => function (array $form, FormStateInterface $form_state) {
88           return $form['test'];
89         },
90       ],
91     ];
92     $request = new Request();
93     $form = [
94       'test' => [
95         '#type' => 'textfield',
96       ],
97     ];
98     $form_state = new FormState();
99     $form_state->setTriggeringElement($triggering_element);
100     $commands = [];
101
102     $this->renderer->expects($this->once())
103       ->method('renderResponse')
104       ->with($form['test'], $request, $this->routeMatch)
105       ->willReturn(new AjaxResponse([]));
106
107     $result = $this->formAjaxResponseBuilder->buildResponse($request, $form, $form_state, $commands);
108     $this->assertInstanceOf('\Drupal\Core\Ajax\AjaxResponse', $result);
109     $this->assertSame($commands, $result->getCommands());
110   }
111
112   /**
113    * @covers ::buildResponse
114    */
115   public function testBuildResponseResponse() {
116     $triggering_element = [
117       '#ajax' => [
118         'callback' => function (array $form, FormStateInterface $form_state) {
119           return new AjaxResponse([]);
120         },
121       ],
122     ];
123     $request = new Request();
124     $form = [];
125     $form_state = new FormState();
126     $form_state->setTriggeringElement($triggering_element);
127     $commands = [];
128
129     $this->renderer->expects($this->never())
130       ->method('renderResponse');
131
132     $result = $this->formAjaxResponseBuilder->buildResponse($request, $form, $form_state, $commands);
133     $this->assertInstanceOf('\Drupal\Core\Ajax\AjaxResponse', $result);
134     $this->assertSame($commands, $result->getCommands());
135   }
136
137   /**
138    * @covers ::buildResponse
139    */
140   public function testBuildResponseWithCommands() {
141     $triggering_element = [
142       '#ajax' => [
143         'callback' => function (array $form, FormStateInterface $form_state) {
144           return new AjaxResponse([]);
145         },
146       ],
147     ];
148     $request = new Request();
149     $form = [
150       'test' => [
151         '#type' => 'textfield',
152       ],
153     ];
154     $form_state = new FormState();
155     $form_state->setTriggeringElement($triggering_element);
156     $commands = [
157       new AlertCommand('alert!'),
158     ];
159     $commands_expected = [];
160     $commands_expected[] = ['command' => 'alert', 'text' => 'alert!'];
161
162     $this->renderer->expects($this->never())
163       ->method('renderResponse');
164
165     $result = $this->formAjaxResponseBuilder->buildResponse($request, $form, $form_state, $commands);
166     $this->assertInstanceOf('\Drupal\Core\Ajax\AjaxResponse', $result);
167     $this->assertSame($commands_expected, $result->getCommands());
168   }
169
170   /**
171    * @covers ::buildResponse
172    */
173   public function testBuildResponseWithUpdateCommand() {
174     $triggering_element = [
175       '#ajax' => [
176         'callback' => function (array $form, FormStateInterface $form_state) {
177           return new AjaxResponse([]);
178         },
179       ],
180     ];
181     $request = new Request();
182     $form = [
183       '#build_id' => 'the_build_id',
184       '#build_id_old' => 'a_new_build_id',
185       'test' => [
186         '#type' => 'textfield',
187       ],
188     ];
189     $form_state = new FormState();
190     $form_state->setTriggeringElement($triggering_element);
191     $commands = [
192       new AlertCommand('alert!'),
193     ];
194     $commands_expected = [];
195     $commands_expected[] = ['command' => 'update_build_id', 'old' => 'a_new_build_id', 'new' => 'the_build_id'];
196     $commands_expected[] = ['command' => 'alert', 'text' => 'alert!'];
197
198     $this->renderer->expects($this->never())
199       ->method('renderResponse');
200
201     $result = $this->formAjaxResponseBuilder->buildResponse($request, $form, $form_state, $commands);
202     $this->assertInstanceOf('\Drupal\Core\Ajax\AjaxResponse', $result);
203     $this->assertSame($commands_expected, $result->getCommands());
204   }
205
206 }