|
14 | 14 | use Symfony\Component\Form\ChoiceList\Loader\CallbackChoiceLoader;
|
15 | 15 | use Symfony\Component\Form\ChoiceList\View\ChoiceGroupView;
|
16 | 16 | use Symfony\Component\Form\ChoiceList\View\ChoiceView;
|
| 17 | +use Symfony\Component\Form\Exception\LogicException; |
17 | 18 | use Symfony\Component\Form\Exception\TransformationFailedException;
|
18 | 19 | use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
19 | 20 | use Symfony\Component\Form\FormInterface;
|
@@ -2277,4 +2278,111 @@ public function testWithSameLoaderAndDifferentChoiceValueCallbacks()
|
2277 | 2278 | $this->assertSame('20', $view['choice_two']->vars['choices'][1]->value);
|
2278 | 2279 | $this->assertSame('30', $view['choice_two']->vars['choices'][2]->value);
|
2279 | 2280 | }
|
| 2281 | + |
| 2282 | + public function testChoiceLazyThrowsWhenChoiceLoaderIsNotSet() |
| 2283 | + { |
| 2284 | + $this->expectException(LogicException::class); |
| 2285 | + $this->expectExceptionMessage('The "choice_lazy" option can only be used if the "choice_loader" option is set.'); |
| 2286 | + |
| 2287 | + $this->factory->create(static::TESTED_TYPE, null, [ |
| 2288 | + 'choice_lazy' => true, |
| 2289 | + ]); |
| 2290 | + } |
| 2291 | + |
| 2292 | + public function testChoiceLazyLoadsAndRendersNothingWhenNoDataSet() |
| 2293 | + { |
| 2294 | + $form = $this->factory->create(static::TESTED_TYPE, null, [ |
| 2295 | + 'choice_loader' => new CallbackChoiceLoader(fn () => ['a' => 'A', 'b' => 'B']), |
| 2296 | + 'choice_lazy' => true, |
| 2297 | + ]); |
| 2298 | + |
| 2299 | + $this->assertNull($form->getData()); |
| 2300 | + |
| 2301 | + $view = $form->createView(); |
| 2302 | + $this->assertArrayHasKey('choices', $view->vars); |
| 2303 | + $this->assertSame([], $view->vars['choices']); |
| 2304 | + } |
| 2305 | + |
| 2306 | + public function testChoiceLazyLoadsAndRendersOnlyDataSetViaDefault() |
| 2307 | + { |
| 2308 | + $form = $this->factory->create(static::TESTED_TYPE, 'A', [ |
| 2309 | + 'choice_loader' => new CallbackChoiceLoader(fn () => ['a' => 'A', 'b' => 'B']), |
| 2310 | + 'choice_lazy' => true, |
| 2311 | + ]); |
| 2312 | + |
| 2313 | + $this->assertSame('A', $form->getData()); |
| 2314 | + |
| 2315 | + $view = $form->createView(); |
| 2316 | + $this->assertArrayHasKey('choices', $view->vars); |
| 2317 | + $this->assertCount(1, $view->vars['choices']); |
| 2318 | + $this->assertSame('A', $view->vars['choices'][0]->value); |
| 2319 | + } |
| 2320 | + |
| 2321 | + public function testChoiceLazyLoadsAndRendersOnlyDataSetViaSubmit() |
| 2322 | + { |
| 2323 | + $form = $this->factory->create(static::TESTED_TYPE, null, [ |
| 2324 | + 'choice_loader' => new CallbackChoiceLoader(fn () => ['a' => 'A', 'b' => 'B']), |
| 2325 | + 'choice_lazy' => true, |
| 2326 | + ]); |
| 2327 | + |
| 2328 | + $form->submit('B'); |
| 2329 | + $this->assertSame('B', $form->getData()); |
| 2330 | + |
| 2331 | + $view = $form->createView(); |
| 2332 | + $this->assertArrayHasKey('choices', $view->vars); |
| 2333 | + $this->assertCount(1, $view->vars['choices']); |
| 2334 | + $this->assertSame('B', $view->vars['choices'][0]->value); |
| 2335 | + } |
| 2336 | + |
| 2337 | + public function testChoiceLazyErrorWhenInvalidSubmitData() |
| 2338 | + { |
| 2339 | + $form = $this->factory->create(static::TESTED_TYPE, null, [ |
| 2340 | + 'choice_loader' => new CallbackChoiceLoader(fn () => ['a' => 'A', 'b' => 'B']), |
| 2341 | + 'choice_lazy' => true, |
| 2342 | + ]); |
| 2343 | + |
| 2344 | + $form->submit('invalid'); |
| 2345 | + $this->assertNull($form->getData()); |
| 2346 | + |
| 2347 | + $view = $form->createView(); |
| 2348 | + $this->assertArrayHasKey('choices', $view->vars); |
| 2349 | + $this->assertCount(0, $view->vars['choices']); |
| 2350 | + $this->assertCount(1, $form->getErrors()); |
| 2351 | + $this->assertSame('ERROR: The selected choice is invalid.', trim((string) $form->getErrors())); |
| 2352 | + } |
| 2353 | + |
| 2354 | + public function testChoiceLazyMultipleWithDefaultData() |
| 2355 | + { |
| 2356 | + $form = $this->factory->create(static::TESTED_TYPE, ['A', 'B'], [ |
| 2357 | + 'choice_loader' => new CallbackChoiceLoader(fn () => ['a' => 'A', 'b' => 'B', 'c' => 'C']), |
| 2358 | + 'choice_lazy' => true, |
| 2359 | + 'multiple' => true, |
| 2360 | + ]); |
| 2361 | + |
| 2362 | + $this->assertSame(['A', 'B'], $form->getData()); |
| 2363 | + |
| 2364 | + $view = $form->createView(); |
| 2365 | + $this->assertArrayHasKey('choices', $view->vars); |
| 2366 | + $this->assertCount(2, $view->vars['choices']); |
| 2367 | + $this->assertSame('A', $view->vars['choices'][0]->value); |
| 2368 | + $this->assertSame('B', $view->vars['choices'][1]->value); |
| 2369 | + } |
| 2370 | + |
| 2371 | + public function testChoiceLazyMultipleWithSubmittedData() |
| 2372 | + { |
| 2373 | + $form = $this->factory->create(static::TESTED_TYPE, null, [ |
| 2374 | + 'choice_loader' => new CallbackChoiceLoader(fn () => ['a' => 'A', 'b' => 'B', 'c' => 'C']), |
| 2375 | + 'choice_lazy' => true, |
| 2376 | + 'multiple' => true, |
| 2377 | + ]); |
| 2378 | + |
| 2379 | + $form->submit(['B', 'C']); |
| 2380 | + $this->assertSame(['B', 'C'], $form->getData()); |
| 2381 | + |
| 2382 | + $view = $form->createView(); |
| 2383 | + $this->assertArrayHasKey('choices', $view->vars); |
| 2384 | + $this->assertCount(2, $view->vars['choices']); |
| 2385 | + $this->assertSame('B', $view->vars['choices'][0]->value); |
| 2386 | + $this->assertSame('C', $view->vars['choices'][1]->value); |
| 2387 | + } |
2280 | 2388 | }
|
0 commit comments