2021-07-22 21:31:19 +09:00
< ? php
2021-10-10 17:26:18 +09:00
declare ( strict_types = 1 );
2021-07-22 21:31:19 +09:00
// {{{ License
// This file is part of GNU social - https://www.gnu.org/software/social
//
// GNU social is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// GNU social is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with GNU social. If not, see <http://www.gnu.org/licenses/>.
// }}}
namespace App\Tests\Core ;
use App\Core\DB\DB ;
use App\Core\Form ;
2021-09-18 11:22:27 +09:00
use App\Entity\Actor ;
2021-08-20 03:14:37 +09:00
use App\Util\Exception\ServerException ;
2021-07-22 21:31:19 +09:00
use App\Util\Form\ArrayTransformer ;
use App\Util\GNUsocialTestCase ;
2021-08-20 03:14:37 +09:00
use Jchook\AssertThrows\AssertThrows ;
2021-07-22 21:31:19 +09:00
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
{
2021-08-20 03:14:37 +09:00
use AssertThrows ;
2021-07-22 21:31:19 +09:00
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 ]],
2021-08-20 03:14:37 +09:00
[ 'testpost' , SubmitType :: class , [ 'label' => 'Post' ]],
2021-07-22 21:31:19 +09:00
]);
2021-10-10 17:26:18 +09:00
static :: assertSame ( \get_class ( $form ), 'Symfony\\Component\\Form\\Form' );
2021-07-22 21:31:19 +09:00
foreach ( $form as $name => $f ) {
2021-08-19 09:09:42 +09:00
if ( $name == 'testpost' ) {
2021-10-10 17:26:18 +09:00
static :: assertSame ( \get_class ( $f ), 'Symfony\Component\Form\SubmitButton' );
2021-07-22 21:31:19 +09:00
} else {
2021-10-10 17:26:18 +09:00
static :: assertSame ( \get_class ( $f ), 'Symfony\Component\Form\Form' );
2021-07-22 21:31:19 +09:00
}
$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 ;
2021-10-10 17:26:18 +09:00
static :: assertSame ( \get_class ( $form_class ), $array_class );
2021-07-22 21:31:19 +09:00
foreach ([ 'label' , 'attr' , 'data' ] as $field ) {
if ( isset ( $options [ $field ])) {
static :: assertSame ( $form_options [ $field ], $options [ $field ]);
}
}
break ;
}
}
static :: assertTrue ( $found );
2021-10-10 17:26:18 +09:00
static :: assertSame ( \get_class ( $f -> getParent ()), 'Symfony\\Component\\Form\\Form' );
2021-07-22 21:31:19 +09:00
}
static :: assertTrue ( Form :: isRequired ( $form_array , 'content' ));
}
2021-08-20 03:14:37 +09:00
/**
* 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 , []]]));
}
2021-07-22 21:31:19 +09:00
/**
* 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' ;
2021-09-18 11:22:27 +09:00
$user = Actor :: create ([ 'nickname' => $nick , 'normalized_nickname' => $nick ]);
2021-07-22 21:31:19 +09:00
$form = Form :: create ([
[ 'nickname' , TextareaType :: class , []],
[ 'normalized_nickname' , TextareaType :: class , []],
2021-08-19 09:09:42 +09:00
[ 'testpost' , SubmitType :: class , []],
2021-07-22 21:31:19 +09:00
], target : $user );
$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_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 : [], extra_step : null , create_args : [], testing_only_form : $mock_form );
static :: assertSame ( $data , $ret );
2021-09-18 11:22:27 +09:00
$user = Actor :: create ([ 'nickname' => 'form_testing_new_user' , 'normalized_nickname' => 'form_testing_new_user' ]);
2021-07-22 21:31:19 +09:00
DB :: persist ( $user );
$ret = Form :: handle ( form_definition : [ /* not normal usage */ ], request : $mock_request , target : $user , extra_args : [], extra_step : null , create_args : [], testing_only_form : $mock_form );
static :: assertSame ( $mock_form , $ret );
static :: assertSame ( $data [ 'fullname' ], $user -> getFullname ());
static :: assertSame ( $data [ 'homepage' ], $user -> getHomepage ());
}
}