class FormSubmitterTest

Same name in other branches
  1. 9 core/tests/Drupal/Tests/Core/Form/FormSubmitterTest.php \Drupal\Tests\Core\Form\FormSubmitterTest
  2. 8.9.x core/tests/Drupal/Tests/Core/Form/FormSubmitterTest.php \Drupal\Tests\Core\Form\FormSubmitterTest
  3. 10 core/tests/Drupal/Tests/Core/Form/FormSubmitterTest.php \Drupal\Tests\Core\Form\FormSubmitterTest

@coversDefaultClass \Drupal\Core\Form\FormSubmitter @group Form

Hierarchy

Expanded class hierarchy of FormSubmitterTest

File

core/tests/Drupal/Tests/Core/Form/FormSubmitterTest.php, line 25

Namespace

Drupal\Tests\Core\Form
View source
class FormSubmitterTest extends UnitTestCase {
    
    /**
     * The mocked URL generator.
     *
     * @var \PHPUnit\Framework\MockObject\MockObject|\Drupal\Core\Routing\UrlGeneratorInterface
     */
    protected $urlGenerator;
    
    /**
     * The mocked unrouted URL assembler.
     *
     * @var \PHPUnit\Framework\MockObject\MockObject|\Drupal\Core\Utility\UnroutedUrlAssemblerInterface
     */
    protected $unroutedUrlAssembler;
    
    /**
     * @var \PHPUnit\Framework\MockObject\MockObject|\Drupal\Core\EventSubscriber\RedirectResponseSubscriber
     */
    protected $redirectResponseSubscriber;
    
    /**
     * {@inheritdoc}
     */
    protected function setUp() : void {
        parent::setUp();
        $this->urlGenerator = $this->createMock(UrlGeneratorInterface::class);
        $this->unroutedUrlAssembler = $this->createMock(UnroutedUrlAssemblerInterface::class);
        $this->redirectResponseSubscriber = $this->createMock(RedirectResponseSubscriber::class);
    }
    
    /**
     * @covers ::doSubmitForm
     */
    public function testHandleFormSubmissionNotSubmitted() : void {
        $form_submitter = $this->getFormSubmitter();
        $form = [];
        $form_state = new FormState();
        $return = $form_submitter->doSubmitForm($form, $form_state);
        $this->assertFalse($form_state->isExecuted());
        $this->assertNull($return);
    }
    
    /**
     * @covers ::doSubmitForm
     */
    public function testHandleFormSubmissionNoRedirect() : void {
        $form_submitter = $this->getFormSubmitter();
        $form = [];
        $form_state = (new FormState())->setSubmitted()
            ->disableRedirect();
        $return = $form_submitter->doSubmitForm($form, $form_state);
        $this->assertTrue($form_state->isExecuted());
        $this->assertNull($return);
    }
    
    /**
     * @covers ::doSubmitForm
     *
     * @dataProvider providerTestHandleFormSubmissionWithResponses
     */
    public function testHandleFormSubmissionWithResponses($class, $form_state_key) : void {
        $response = $this->getMockBuilder($class)
            ->disableOriginalConstructor()
            ->getMock();
        $response->expects($this->any())
            ->method('prepare')
            ->willReturn($response);
        $form_state = (new FormState())->setSubmitted()
            ->setFormState([
            $form_state_key => $response,
        ]);
        $form_submitter = $this->getFormSubmitter();
        $form = [];
        $return = $form_submitter->doSubmitForm($form, $form_state);
        $this->assertInstanceOf('Symfony\\Component\\HttpFoundation\\Response', $return);
    }
    public static function providerTestHandleFormSubmissionWithResponses() {
        return [
            [
                'Symfony\\Component\\HttpFoundation\\Response',
                'response',
            ],
            [
                'Symfony\\Component\\HttpFoundation\\RedirectResponse',
                'redirect',
            ],
        ];
    }
    
    /**
     * Tests the redirectForm() method when the redirect is NULL.
     *
     * @covers ::redirectForm
     */
    public function testRedirectWithNull() : void {
        $form_submitter = $this->getFormSubmitter();
        $form_state = $this->createMock('Drupal\\Core\\Form\\FormStateInterface');
        $form_state->expects($this->once())
            ->method('getRedirect')
            ->willReturn(NULL);
        $this->urlGenerator
            ->expects($this->once())
            ->method('generateFromRoute')
            ->with('<current>', [], [
            'query' => [],
            'absolute' => TRUE,
        ])
            ->willReturn('http://localhost/test-path');
        $redirect = $form_submitter->redirectForm($form_state);
        // If we have no redirect, we redirect to the current URL.
        $this->assertSame('http://localhost/test-path', $redirect->getTargetUrl());
        $this->assertSame(303, $redirect->getStatusCode());
    }
    
    /**
     * Tests redirectForm() when a redirect is a Url object.
     *
     * @covers ::redirectForm
     *
     * @dataProvider providerTestRedirectWithUrl
     */
    public function testRedirectWithUrl(Url $redirect_value, $result, $status = 303) : void {
        $container = new ContainerBuilder();
        $container->set('url_generator', $this->urlGenerator);
        \Drupal::setContainer($container);
        $form_submitter = $this->getFormSubmitter();
        $this->urlGenerator
            ->expects($this->once())
            ->method('generateFromRoute')
            ->willReturnMap([
            [
                'test_route_a',
                [],
                [
                    'absolute' => TRUE,
                ],
                FALSE,
                'test-route',
            ],
            [
                'test_route_b',
                [
                    'key' => 'value',
                ],
                [
                    'absolute' => TRUE,
                ],
                FALSE,
                'test-route/value',
            ],
        ]);
        $form_state = $this->createMock('Drupal\\Core\\Form\\FormStateInterface');
        $form_state->expects($this->once())
            ->method('getRedirect')
            ->willReturn($redirect_value);
        $redirect = $form_submitter->redirectForm($form_state);
        $this->assertSame($result, $redirect->getTargetUrl());
        $this->assertSame($status, $redirect->getStatusCode());
    }
    
    /**
     * Provides test data for testing the redirectForm() method with a route name.
     *
     * @return array
     *   Returns some test data.
     */
    public static function providerTestRedirectWithUrl() {
        return [
            [
                new Url('test_route_a', [], [
                    'absolute' => TRUE,
                ]),
                'test-route',
            ],
            [
                new Url('test_route_b', [
                    'key' => 'value',
                ], [
                    'absolute' => TRUE,
                ]),
                'test-route/value',
            ],
        ];
    }
    
    /**
     * Tests the redirectForm() method with a response object.
     *
     * @covers ::redirectForm
     */
    public function testRedirectWithResponseObject() : void {
        $form_submitter = $this->getFormSubmitter();
        $redirect = new RedirectResponse('/example');
        $form_state = $this->createMock('Drupal\\Core\\Form\\FormStateInterface');
        $form_state->expects($this->once())
            ->method('getRedirect')
            ->willReturn($redirect);
        $result_redirect = $form_submitter->redirectForm($form_state);
        $this->assertSame($redirect, $result_redirect);
    }
    
    /**
     * Tests the redirectForm() method when no redirect is expected.
     *
     * @covers ::redirectForm
     */
    public function testRedirectWithoutResult() : void {
        $form_submitter = $this->getFormSubmitter();
        $this->urlGenerator
            ->expects($this->never())
            ->method('generateFromRoute');
        $this->unroutedUrlAssembler
            ->expects($this->never())
            ->method('assemble');
        $container = new ContainerBuilder();
        $container->set('url_generator', $this->urlGenerator);
        $container->set('unrouted_url_assembler', $this->unroutedUrlAssembler);
        \Drupal::setContainer($container);
        $form_state = $this->createMock('Drupal\\Core\\Form\\FormStateInterface');
        $form_state->expects($this->once())
            ->method('getRedirect')
            ->willReturn(FALSE);
        $redirect = $form_submitter->redirectForm($form_state);
        $this->assertNull($redirect);
    }
    
    /**
     * @covers ::executeSubmitHandlers
     */
    public function testExecuteSubmitHandlers() : void {
        $form_submitter = $this->getFormSubmitter();
        $mock = $this->prophesize(MockFormBase::class);
        $mock->hash_submit(Argument::type('array'), Argument::type(FormStateInterface::class))
            ->shouldBeCalledOnce();
        $mock->submit_handler(Argument::type('array'), Argument::type(FormStateInterface::class))
            ->shouldBeCalledOnce();
        $mock->simple_string_submit(Argument::type('array'), Argument::type(FormStateInterface::class))
            ->shouldBeCalledOnce();
        $form = [];
        $form_state = new FormState();
        $form_submitter->executeSubmitHandlers($form, $form_state);
        $form['#submit'][] = [
            $mock->reveal(),
            'hash_submit',
        ];
        $form_submitter->executeSubmitHandlers($form, $form_state);
        // $form_state submit handlers will supersede $form handlers.
        $form_state->setSubmitHandlers([
            [
                $mock->reveal(),
                'submit_handler',
            ],
        ]);
        $form_submitter->executeSubmitHandlers($form, $form_state);
        // Methods directly on the form object can be specified as a string.
        $form_state = (new FormState())->setFormObject($mock->reveal())
            ->setSubmitHandlers([
            '::simple_string_submit',
        ]);
        $form_submitter->executeSubmitHandlers($form, $form_state);
    }
    
    /**
     * @return \Drupal\Core\Form\FormSubmitterInterface
     */
    protected function getFormSubmitter() {
        $request_stack = new RequestStack();
        $request_stack->push(Request::create('/test-path'));
        return $this->getMockBuilder('Drupal\\Core\\Form\\FormSubmitter')
            ->setConstructorArgs([
            $request_stack,
            $this->urlGenerator,
            $this->redirectResponseSubscriber,
        ])
            ->onlyMethods([
            'batchGet',
        ])
            ->getMock();
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title
ExpectDeprecationTrait::expectDeprecation public function Adds an expected deprecation.
ExpectDeprecationTrait::getCallableName private static function Returns a callable as a string suitable for inclusion in a message.
ExpectDeprecationTrait::setUpErrorHandler public function Sets up the test error handler.
ExpectDeprecationTrait::tearDownErrorHandler public function Tears down the test error handler.
FormSubmitterTest::$redirectResponseSubscriber protected property
FormSubmitterTest::$unroutedUrlAssembler protected property The mocked unrouted URL assembler.
FormSubmitterTest::$urlGenerator protected property The mocked URL generator.
FormSubmitterTest::getFormSubmitter protected function
FormSubmitterTest::providerTestHandleFormSubmissionWithResponses public static function
FormSubmitterTest::providerTestRedirectWithUrl public static function Provides test data for testing the redirectForm() method with a route name.
FormSubmitterTest::setUp protected function Overrides UnitTestCase::setUp
FormSubmitterTest::testExecuteSubmitHandlers public function @covers ::executeSubmitHandlers
FormSubmitterTest::testHandleFormSubmissionNoRedirect public function @covers ::doSubmitForm
FormSubmitterTest::testHandleFormSubmissionNotSubmitted public function @covers ::doSubmitForm
FormSubmitterTest::testHandleFormSubmissionWithResponses public function @covers ::doSubmitForm
FormSubmitterTest::testRedirectWithNull public function Tests the redirectForm() method when the redirect is NULL.
FormSubmitterTest::testRedirectWithoutResult public function Tests the redirectForm() method when no redirect is expected.
FormSubmitterTest::testRedirectWithResponseObject public function Tests the redirectForm() method with a response object.
FormSubmitterTest::testRedirectWithUrl public function Tests redirectForm() when a redirect is a Url object.
RandomGeneratorTrait::getRandomGenerator protected function Gets the random generator for the utility methods.
RandomGeneratorTrait::randomMachineName protected function Generates a unique random string containing letters and numbers.
RandomGeneratorTrait::randomObject public function Generates a random PHP object.
RandomGeneratorTrait::randomString public function Generates a pseudo-random string of ASCII characters of codes 32 to 126.
UnitTestCase::$root protected property The app root.
UnitTestCase::getClassResolverStub protected function Returns a stub class resolver.
UnitTestCase::getConfigFactoryStub public function Returns a stub config factory that behaves according to the passed array.
UnitTestCase::getConfigStorageStub public function Returns a stub config storage that returns the supplied configuration.
UnitTestCase::getContainerWithCacheTagsInvalidator protected function Sets up a container with a cache tags invalidator.
UnitTestCase::getStringTranslationStub public function Returns a stub translation manager that just returns the passed string.
UnitTestCase::setUpBeforeClass public static function

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.