Вход Регистрация
Файл: symfony-2.7/src/Symfony/Component/Form/Tests/Extension/DataCollector/FormDataCollectorTest.php
Строк: 275
<?php
/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyComponentFormTestsExtensionDataCollector;

use 
SymfonyComponentFormExtensionDataCollectorFormDataCollector;
use 
SymfonyComponentFormForm;
use 
SymfonyComponentFormFormBuilder;
use 
SymfonyComponentFormFormView;

class 
FormDataCollectorTest extends PHPUnit_Framework_TestCase
{
    
/**
     * @var PHPUnit_Framework_MockObject_MockObject
     */
    
private $dataExtractor;

    
/**
     * @var FormDataCollector
     */
    
private $dataCollector;

    
/**
     * @var PHPUnit_Framework_MockObject_MockObject
     */
    
private $dispatcher;

    
/**
     * @var PHPUnit_Framework_MockObject_MockObject
     */
    
private $factory;

    
/**
     * @var PHPUnit_Framework_MockObject_MockObject
     */
    
private $dataMapper;

    
/**
     * @var Form
     */
    
private $form;

    
/**
     * @var Form
     */
    
private $childForm;

    
/**
     * @var FormView
     */
    
private $view;

    
/**
     * @var FormView
     */
    
private $childView;

    protected function 
setUp()
    {
        
$this->dataExtractor $this->getMock('SymfonyComponentFormExtensionDataCollectorFormDataExtractorInterface');
        
$this->dataCollector = new FormDataCollector($this->dataExtractor);
        
$this->dispatcher $this->getMock('SymfonyComponentEventDispatcherEventDispatcherInterface');
        
$this->factory $this->getMock('SymfonyComponentFormFormFactoryInterface');
        
$this->dataMapper $this->getMock('SymfonyComponentFormDataMapperInterface');
        
$this->form $this->createForm('name');
        
$this->childForm $this->createForm('child');
        
$this->view = new FormView();
        
$this->childView = new FormView();
    }

    public function 
testBuildPreliminaryFormTree()
    {
        
$this->form->add($this->childForm);

        
$this->dataExtractor->expects($this->at(0))
            ->
method('extractConfiguration')
            ->
with($this->form)
            ->
will($this->returnValue(array('config' => 'foo')));
        
$this->dataExtractor->expects($this->at(1))
            ->
method('extractConfiguration')
            ->
with($this->childForm)
            ->
will($this->returnValue(array('config' => 'bar')));

        
$this->dataExtractor->expects($this->at(2))
            ->
method('extractDefaultData')
            ->
with($this->form)
            ->
will($this->returnValue(array('default_data' => 'foo')));
        
$this->dataExtractor->expects($this->at(3))
            ->
method('extractDefaultData')
            ->
with($this->childForm)
            ->
will($this->returnValue(array('default_data' => 'bar')));

        
$this->dataExtractor->expects($this->at(4))
            ->
method('extractSubmittedData')
            ->
with($this->form)
            ->
will($this->returnValue(array('submitted_data' => 'foo')));
        
$this->dataExtractor->expects($this->at(5))
            ->
method('extractSubmittedData')
            ->
with($this->childForm)
            ->
will($this->returnValue(array('submitted_data' => 'bar')));

        
$this->dataCollector->collectConfiguration($this->form);
        
$this->dataCollector->collectDefaultData($this->form);
        
$this->dataCollector->collectSubmittedData($this->form);
        
$this->dataCollector->buildPreliminaryFormTree($this->form);

        
$childFormData = array(
             
'config' => 'bar',
             
'default_data' => 'bar',
             
'submitted_data' => 'bar',
             
'children' => array(),
         );

        
$formData = array(
             
'config' => 'foo',
             
'default_data' => 'foo',
             
'submitted_data' => 'foo',
             
'children' => array(
                 
'child' => $childFormData,
             ),
         );

        
$this->assertSame(array(
            
'forms' => array(
                
'name' => $formData,
            ),
            
'forms_by_hash' => array(
                
spl_object_hash($this->form) => $formData,
                
spl_object_hash($this->childForm) => $childFormData,
            ),
            
'nb_errors' => 0,
         ), 
$this->dataCollector->getData());
    }

    public function 
testBuildMultiplePreliminaryFormTrees()
    {
        
$form1 $this->createForm('form1');
        
$form2 $this->createForm('form2');

        
$this->dataExtractor->expects($this->at(0))
            ->
method('extractConfiguration')
            ->
with($form1)
            ->
will($this->returnValue(array('config' => 'foo')));
        
$this->dataExtractor->expects($this->at(1))
            ->
method('extractConfiguration')
            ->
with($form2)
            ->
will($this->returnValue(array('config' => 'bar')));

        
$this->dataCollector->collectConfiguration($form1);
        
$this->dataCollector->collectConfiguration($form2);
        
$this->dataCollector->buildPreliminaryFormTree($form1);

        
$form1Data = array(
            
'config' => 'foo',
            
'children' => array(),
        );

        
$this->assertSame(array(
            
'forms' => array(
                
'form1' => $form1Data,
            ),
            
'forms_by_hash' => array(
                
spl_object_hash($form1) => $form1Data,
            ),
            
'nb_errors' => 0,
        ), 
$this->dataCollector->getData());

        
$this->dataCollector->buildPreliminaryFormTree($form2);

        
$form2Data = array(
            
'config' => 'bar',
            
'children' => array(),
        );

        
$this->assertSame(array(
            
'forms' => array(
                
'form1' => $form1Data,
                
'form2' => $form2Data,
            ),
            
'forms_by_hash' => array(
                
spl_object_hash($form1) => $form1Data,
                
spl_object_hash($form2) => $form2Data,
            ),
            
'nb_errors' => 0,
        ), 
$this->dataCollector->getData());
    }

    public function 
testBuildSamePreliminaryFormTreeMultipleTimes()
    {
        
$this->dataExtractor->expects($this->at(0))
            ->
method('extractConfiguration')
            ->
with($this->form)
            ->
will($this->returnValue(array('config' => 'foo')));

        
$this->dataExtractor->expects($this->at(1))
            ->
method('extractDefaultData')
            ->
with($this->form)
            ->
will($this->returnValue(array('default_data' => 'foo')));

        
$this->dataCollector->collectConfiguration($this->form);
        
$this->dataCollector->buildPreliminaryFormTree($this->form);

        
$formData = array(
            
'config' => 'foo',
            
'children' => array(),
        );

        
$this->assertSame(array(
            
'forms' => array(
                
'name' => $formData,
            ),
            
'forms_by_hash' => array(
                
spl_object_hash($this->form) => $formData,
            ),
            
'nb_errors' => 0,
        ), 
$this->dataCollector->getData());

        
$this->dataCollector->collectDefaultData($this->form);
        
$this->dataCollector->buildPreliminaryFormTree($this->form);

        
$formData = array(
            
'config' => 'foo',
            
'default_data' => 'foo',
            
'children' => array(),
        );

        
$this->assertSame(array(
            
'forms' => array(
                
'name' => $formData,
            ),
            
'forms_by_hash' => array(
                
spl_object_hash($this->form) => $formData,
            ),
            
'nb_errors' => 0,
        ), 
$this->dataCollector->getData());
    }

    public function 
testBuildPreliminaryFormTreeWithoutCollectingAnyData()
    {
        
$this->dataCollector->buildPreliminaryFormTree($this->form);

        
$formData = array(
            
'children' => array(),
        );

        
$this->assertSame(array(
            
'forms' => array(
                
'name' => $formData,
            ),
            
'forms_by_hash' => array(
                
spl_object_hash($this->form) => $formData,
            ),
            
'nb_errors' => 0,
        ), 
$this->dataCollector->getData());
    }

    public function 
testBuildFinalFormTree()
    {
        
$this->form->add($this->childForm);
        
$this->view->children['child'] = $this->childView;

        
$this->dataExtractor->expects($this->at(0))
            ->
method('extractConfiguration')
            ->
with($this->form)
            ->
will($this->returnValue(array('config' => 'foo')));
        
$this->dataExtractor->expects($this->at(1))
            ->
method('extractConfiguration')
            ->
with($this->childForm)
            ->
will($this->returnValue(array('config' => 'bar')));

        
$this->dataExtractor->expects($this->at(2))
            ->
method('extractDefaultData')
            ->
with($this->form)
            ->
will($this->returnValue(array('default_data' => 'foo')));
        
$this->dataExtractor->expects($this->at(3))
            ->
method('extractDefaultData')
            ->
with($this->childForm)
            ->
will($this->returnValue(array('default_data' => 'bar')));

        
$this->dataExtractor->expects($this->at(4))
            ->
method('extractSubmittedData')
            ->
with($this->form)
            ->
will($this->returnValue(array('submitted_data' => 'foo')));
        
$this->dataExtractor->expects($this->at(5))
            ->
method('extractSubmittedData')
            ->
with($this->childForm)
            ->
will($this->returnValue(array('submitted_data' => 'bar')));

        
$this->dataExtractor->expects($this->at(6))
            ->
method('extractViewVariables')
            ->
with($this->view)
            ->
will($this->returnValue(array('view_vars' => 'foo')));

        
$this->dataExtractor->expects($this->at(7))
            ->
method('extractViewVariables')
            ->
with($this->childView)
            ->
will($this->returnValue(array('view_vars' => 'bar')));

        
$this->dataCollector->collectConfiguration($this->form);
        
$this->dataCollector->collectDefaultData($this->form);
        
$this->dataCollector->collectSubmittedData($this->form);
        
$this->dataCollector->collectViewVariables($this->view);
        
$this->dataCollector->buildFinalFormTree($this->form$this->view);

        
$childFormData = array(
            
'view_vars' => 'bar',
            
'config' => 'bar',
            
'default_data' => 'bar',
            
'submitted_data' => 'bar',
            
'children' => array(),
        );

        
$formData = array(
            
'view_vars' => 'foo',
            
'config' => 'foo',
            
'default_data' => 'foo',
            
'submitted_data' => 'foo',
            
'children' => array(
                
'child' => $childFormData,
            ),
        );

        
$this->assertSame(array(
            
'forms' => array(
                
'name' => $formData,
            ),
            
'forms_by_hash' => array(
                
spl_object_hash($this->form) => $formData,
                
spl_object_hash($this->childForm) => $childFormData,
            ),
            
'nb_errors' => 0,
        ), 
$this->dataCollector->getData());
    }

    public function 
testFinalFormReliesOnFormViewStructure()
    {
        
$this->form->add($child1 $this->createForm('first'));
        
$this->form->add($child2 $this->createForm('second'));

        
$this->view->children['second'] = $this->childView;

        
$this->dataCollector->buildPreliminaryFormTree($this->form);

        
$child1Data = array(
            
'children' => array(),
        );

        
$child2Data = array(
            
'children' => array(),
        );

        
$formData = array(
            
'children' => array(
                
'first' => $child1Data,
                
'second' => $child2Data,
            ),
        );

        
$this->assertSame(array(
            
'forms' => array(
                
'name' => $formData,
            ),
            
'forms_by_hash' => array(
                
spl_object_hash($this->form) => $formData,
                
spl_object_hash($child1) => $child1Data,
                
spl_object_hash($child2) => $child2Data,
            ),
            
'nb_errors' => 0,
        ), 
$this->dataCollector->getData());

        
$this->dataCollector->buildFinalFormTree($this->form$this->view);

        
$formData = array(
            
'children' => array(
                
// "first" not present in FormView
                
'second' => $child2Data,
            ),
        );

        
$this->assertSame(array(
            
'forms' => array(
                
'name' => $formData,
            ),
            
'forms_by_hash' => array(
                
spl_object_hash($this->form) => $formData,
                
spl_object_hash($child1) => $child1Data,
                
spl_object_hash($child2) => $child2Data,
            ),
            
'nb_errors' => 0,
        ), 
$this->dataCollector->getData());
    }

    public function 
testChildViewsCanBeWithoutCorrespondingChildForms()
    {
        
// don't add $this->childForm to $this->form!

        
$this->view->children['child'] = $this->childView;

        
$this->dataExtractor->expects($this->at(0))
            ->
method('extractConfiguration')
            ->
with($this->form)
            ->
will($this->returnValue(array('config' => 'foo')));
        
$this->dataExtractor->expects($this->at(1))
            ->
method('extractConfiguration')
            ->
with($this->childForm)
            ->
will($this->returnValue(array('config' => 'bar')));

        
// explicitly call collectConfiguration(), since $this->childForm is not
        // contained in the form tree
        
$this->dataCollector->collectConfiguration($this->form);
        
$this->dataCollector->collectConfiguration($this->childForm);
        
$this->dataCollector->buildFinalFormTree($this->form$this->view);

        
$childFormData = array(
            
// no "config" key
            
'children' => array(),
        );

        
$formData = array(
            
'config' => 'foo',
            
'children' => array(
                
'child' => $childFormData,
            ),
        );

        
$this->assertSame(array(
            
'forms' => array(
                
'name' => $formData,
            ),
            
'forms_by_hash' => array(
                
spl_object_hash($this->form) => $formData,
                
// no child entry
            
),
            
'nb_errors' => 0,
        ), 
$this->dataCollector->getData());
    }

    public function 
testChildViewsWithoutCorrespondingChildFormsMayBeExplicitlyAssociated()
    {
        
// don't add $this->childForm to $this->form!

        
$this->view->children['child'] = $this->childView;

        
// but associate the two
        
$this->dataCollector->associateFormWithView($this->childForm$this->childView);

        
$this->dataExtractor->expects($this->at(0))
            ->
method('extractConfiguration')
            ->
with($this->form)
            ->
will($this->returnValue(array('config' => 'foo')));
        
$this->dataExtractor->expects($this->at(1))
            ->
method('extractConfiguration')
            ->
with($this->childForm)
            ->
will($this->returnValue(array('config' => 'bar')));

        
// explicitly call collectConfiguration(), since $this->childForm is not
        // contained in the form tree
        
$this->dataCollector->collectConfiguration($this->form);
        
$this->dataCollector->collectConfiguration($this->childForm);
        
$this->dataCollector->buildFinalFormTree($this->form$this->view);

        
$childFormData = array(
            
'config' => 'bar',
            
'children' => array(),
        );

        
$formData = array(
            
'config' => 'foo',
            
'children' => array(
                
'child' => $childFormData,
            ),
        );

        
$this->assertSame(array(
            
'forms' => array(
                
'name' => $formData,
            ),
            
'forms_by_hash' => array(
                
spl_object_hash($this->form) => $formData,
                
spl_object_hash($this->childForm) => $childFormData,
            ),
            
'nb_errors' => 0,
        ), 
$this->dataCollector->getData());
    }

    public function 
testCollectSubmittedDataCountsErrors()
    {
        
$form1 $this->createForm('form1');
        
$childForm1 $this->createForm('child1');
        
$form2 $this->createForm('form2');

        
$form1->add($childForm1);
        
$this->dataExtractor
             
->method('extractConfiguration')
             ->
will($this->returnValue(array()));
        
$this->dataExtractor
             
->method('extractDefaultData')
             ->
will($this->returnValue(array()));
        
$this->dataExtractor->expects($this->at(4))
            ->
method('extractSubmittedData')
            ->
with($form1)
            ->
will($this->returnValue(array('errors' => array('foo'))));
        
$this->dataExtractor->expects($this->at(5))
            ->
method('extractSubmittedData')
            ->
with($childForm1)
            ->
will($this->returnValue(array('errors' => array('bar''bam'))));
        
$this->dataExtractor->expects($this->at(8))
            ->
method('extractSubmittedData')
            ->
with($form2)
            ->
will($this->returnValue(array('errors' => array('baz'))));

        
$this->dataCollector->collectSubmittedData($form1);

        
$data $this->dataCollector->getData();
        
$this->assertSame(3$data['nb_errors']);

        
$this->dataCollector->collectSubmittedData($form2);

        
$data $this->dataCollector->getData();
        
$this->assertSame(4$data['nb_errors']);
    }

    private function 
createForm($name)
    {
        
$builder = new FormBuilder($namenull$this->dispatcher$this->factory);
        
$builder->setCompound(true);
        
$builder->setDataMapper($this->dataMapper);

        return 
$builder->getForm();
    }
}
Онлайн: 0
Реклама