. // }}} namespace App\Test\Core; use App\Core\ActorLocalRoles; use App\Core\DB\DB; use App\Core\Form; use App\Entity\Actor; use App\Util\Exception\ServerException; use App\Util\Form\ArrayTransformer; use App\Util\GNUsocialTestCase; use Jchook\AssertThrows\AssertThrows; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\TextareaType; use Symfony\Component\Form\Form as SymfForm; use Symfony\Component\HttpFoundation\Request; class FormTest extends GNUsocialTestCase { use AssertThrows; public function testCreate() { parent::bootKernel(); $form = Form::create($form_array = [ ['content', TextareaType::class, ['label' => ' ', 'data' => '', 'attr' => ['placeholder' => 'placeholder']]], ['array_trans', TextareaType::class, ['data' => ['foo', 'bar'], 'transformer' => ArrayTransformer::class]], ['testpost', SubmitType::class, ['label' => 'Post']], ]); static::assertSame(\get_class($form), 'Symfony\\Component\\Form\\Form'); foreach ($form as $name => $f) { if ($name == 'testpost') { static::assertSame(\get_class($f), 'Symfony\Component\Form\SubmitButton'); } else { static::assertSame(\get_class($f), 'Symfony\Component\Form\Form'); } $config = $f->getConfig(); $form_options = $config->getOptions(); $form_class = $config->getType()->getInnerType(); $found = false; foreach ($form_array as [$array_name, $array_class, $options]) { if ($name === $array_name) { $found = true; static::assertSame(\get_class($form_class), $array_class); foreach (['label', 'attr', 'data'] as $field) { if (isset($options[$field])) { static::assertSame($form_options[$field], $options[$field]); } } break; } } static::assertTrue($found); static::assertSame(\get_class($f->getParent()), 'Symfony\\Component\\Form\\Form'); } static::assertTrue(Form::isRequired($form_array, 'content')); } /** * Using 'save' or 'submit' as a form name is not allowed, becuase then they're likely to * collide with other forms in the same page */ public function testDisallowedGenericFormName() { static::assertThrows(ServerException::class, fn () => Form::create([['save', SubmitType::class, []]])); } /** * Test creating a form with default values pulled from an existing object. Can be used in conjunction with `Form::hanlde` to update said object */ public function testCreateUpdateObject() { $nick = 'form_testing_new_user'; $actor = Actor::create(['nickname' => $nick, 'fullname' => $nick]); $form = Form::create([ ['nickname', TextareaType::class, []], ['fullname', TextareaType::class, []], ['testpost', SubmitType::class, []], ], target: $actor); $options = $form['nickname']->getConfig()->getOptions(); static::assertSame($nick, $options['data']); } public function testHandle() { parent::bootKernel(); $data = ['fullname' => 'Full Name', 'homepage' => 'gnu.org']; $mock_request = static::createMock(Request::class); $mock_request->method('getMethod')->willReturn('POST'); $mock_form = static::createMock(SymfForm::class); $mock_form->method('handleRequest'); $mock_form->method('isSubmitted')->willReturn(true); $mock_form->method('isValid')->willReturn(true); $mock_form->method('getData')->willReturn($data); $ret = Form::handle(form_definition: [/* not normal usage */], request: $mock_request, target: null, extra_args: [], before_step: null, after_step: null, create_args: [], testing_only_form: $mock_form); static::assertSame($data, $ret); $actor = Actor::create(['nickname' => 'form_testing_new_user', 'is_local' => false, 'roles' => ActorLocalRoles::PARTICIPANT | ActorLocalRoles::VISITOR, 'type' => Actor::PERSON]); DB::persist($actor); $ret = Form::handle(form_definition: [/* not normal usage */], request: $mock_request, target: $actor, extra_args: [], before_step: null, after_step: null, create_args: [], testing_only_form: $mock_form); static::assertSame($mock_form, $ret); static::assertSame($data['fullname'], $actor->getFullname()); static::assertSame($data['homepage'], $actor->getHomepage()); } }