mirror of
				https://github.com/Icinga/icingaweb2.git
				synced 2025-11-04 13:14:41 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			270 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			270 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/* Icinga Web 2 | (c) 2013-2015 Icinga Development Team | GPLv2+ */
 | 
						|
 | 
						|
namespace Tests\Icinga\Web;
 | 
						|
 | 
						|
use Mockery;
 | 
						|
use Icinga\Web\Form;
 | 
						|
use Icinga\Web\Request;
 | 
						|
use Icinga\Test\BaseTestCase;
 | 
						|
 | 
						|
class SuccessfulForm extends Form
 | 
						|
{
 | 
						|
    public function onSuccess()
 | 
						|
    {
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
class FormTest extends BaseTestCase
 | 
						|
{
 | 
						|
    public function tearDown()
 | 
						|
    {
 | 
						|
        Mockery::close(); // Necessary as some tests are running isolated
 | 
						|
    }
 | 
						|
 | 
						|
    public function testWhetherASubmitButtonIsAddedWithASubmitLabelBeingSet()
 | 
						|
    {
 | 
						|
        $form = new Form();
 | 
						|
        $form->setTokenDisabled();
 | 
						|
        $form->setSubmitLabel('test');
 | 
						|
        $form->create();
 | 
						|
 | 
						|
        $this->assertInstanceOf(
 | 
						|
            '\Zend_Form_Element',
 | 
						|
            $form->getElement('btn_submit'),
 | 
						|
            'Form::create() does not add a submit button in case a submit label is set'
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function testWhetherNoSubmitButtonIsAddedWithoutASubmitLabelBeingSet()
 | 
						|
    {
 | 
						|
        $form = new Form();
 | 
						|
        $form->setTokenDisabled();
 | 
						|
        $form->create();
 | 
						|
 | 
						|
        $this->assertNull(
 | 
						|
            $form->getElement('btn_submit'),
 | 
						|
            'Form::create() adds a submit button in case no submit label is set'
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @depends testWhetherASubmitButtonIsAddedWithASubmitLabelBeingSet
 | 
						|
     */
 | 
						|
    public function testWhetherIsSubmittedReturnsTrueWithASubmitLabelBeingSet()
 | 
						|
    {
 | 
						|
        $form = new Form();
 | 
						|
        $form->setTokenDisabled();
 | 
						|
        $form->setSubmitLabel('test');
 | 
						|
        $form->populate(array('btn_submit' => true));
 | 
						|
 | 
						|
        $this->assertTrue(
 | 
						|
            $form->isSubmitted(),
 | 
						|
            'Form::isSubmitted() does not return true in case a submit label is set'
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @depends testWhetherNoSubmitButtonIsAddedWithoutASubmitLabelBeingSet
 | 
						|
     */
 | 
						|
    public function testWhetherIsSubmittedReturnsFalseWithoutASubmitLabelBeingSet()
 | 
						|
    {
 | 
						|
        $form = new Form();
 | 
						|
 | 
						|
        $this->assertFalse(
 | 
						|
            $form->isSubmitted(),
 | 
						|
            'Form::isSubmitted() does not return false in case no submit label is set'
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function testWhetherTheCurrentLocationIsUsedAsDefaultRedirection()
 | 
						|
    {
 | 
						|
        $this->getRequestMock()->shouldReceive('getPathInfo')->andReturn('default/route');
 | 
						|
        $this->getResponseMock()->shouldReceive('redirectAndExit')->atLeast()->once()
 | 
						|
            ->with(Mockery::on(function ($url) { return $url->getRelativeUrl() === 'default/route'; }));
 | 
						|
 | 
						|
        $form = new SuccessfulForm();
 | 
						|
        $form->setTokenDisabled();
 | 
						|
        $form->setUidDisabled();
 | 
						|
        $form->handleRequest();
 | 
						|
    }
 | 
						|
 | 
						|
    public function testWhetherAnExplicitlySetRedirectUrlIsUsedForRedirection()
 | 
						|
    {
 | 
						|
        $this->getResponseMock()->shouldReceive('redirectAndExit')->atLeast()->once()->with('special/route');
 | 
						|
 | 
						|
        $form = new SuccessfulForm();
 | 
						|
        $form->setTokenDisabled();
 | 
						|
        $form->setUidDisabled();
 | 
						|
        $form->setRedirectUrl('special/route');
 | 
						|
        $form->handleRequest();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @runInSeparateProcess
 | 
						|
     */
 | 
						|
    public function testWhetherACsrfCounterMeasureIsBeingAdded()
 | 
						|
    {
 | 
						|
        Mockery::mock('alias:Icinga\Web\Session')->shouldReceive('getSession->getId')->andReturn('1234567890');
 | 
						|
 | 
						|
        $form = new Form();
 | 
						|
        $form->create();
 | 
						|
 | 
						|
        $this->assertInstanceOf(
 | 
						|
            '\Zend_Form_Element',
 | 
						|
            $form->getElement($form->getTokenElementName()),
 | 
						|
            'Form::create() does not add a csrf counter measure element'
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function testWhetherACsrfCounterMeasureIsNotBeingAdded()
 | 
						|
    {
 | 
						|
        $form = new Form();
 | 
						|
        $form->setTokenDisabled();
 | 
						|
        $form->create();
 | 
						|
 | 
						|
        $this->assertNull(
 | 
						|
            $form->getElement($form->getTokenElementName()),
 | 
						|
            'Form::create() adds a csrf counter measure element in case it\'s disabled'
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function testWhetherAUniqueFormIdIsBeingAdded()
 | 
						|
    {
 | 
						|
        $form = new Form();
 | 
						|
        $form->setTokenDisabled();
 | 
						|
        $form->create();
 | 
						|
 | 
						|
        $this->assertInstanceOf(
 | 
						|
            '\Zend_Form_Element',
 | 
						|
            $form->getElement($form->getUidElementName()),
 | 
						|
            'Form::create() does not add a form identification element'
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function testWhetherAUniqueFormIdIsNotBeingAdded()
 | 
						|
    {
 | 
						|
        $form = new Form();
 | 
						|
        $form->setTokenDisabled();
 | 
						|
        $form->setUidDisabled();
 | 
						|
        $form->create();
 | 
						|
 | 
						|
        $this->assertNull(
 | 
						|
            $form->getElement($form->getUidElementName()),
 | 
						|
            'Form::create() adds a form identification element in case it\'s disabled'
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @depends testWhetherAUniqueFormIdIsBeingAdded
 | 
						|
     */
 | 
						|
    public function testWhetherAFormIsSentWithAUniqueFormIdBeingAdded()
 | 
						|
    {
 | 
						|
        $form = new Form();
 | 
						|
        $form->setTokenDisabled();
 | 
						|
        $form->create();
 | 
						|
 | 
						|
        $this->assertTrue(
 | 
						|
            $form->wasSent(
 | 
						|
                array(
 | 
						|
                    $form->getUidElementName() => $form->getElement($form->getUidElementName())->getValue()
 | 
						|
                )
 | 
						|
            ),
 | 
						|
            'Form::wasSent() does not return true in case a the form identification value is being sent'
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @depends testWhetherAUniqueFormIdIsNotBeingAdded
 | 
						|
     */
 | 
						|
    public function testWhetherAFormIsNotSentWithoutAUniqueFormIdBeingAdded()
 | 
						|
    {
 | 
						|
        $form = new Form();
 | 
						|
        $form->setTokenDisabled();
 | 
						|
        $form->setUidDisabled();
 | 
						|
        $form->create();
 | 
						|
 | 
						|
        $this->assertFalse(
 | 
						|
            $form->wasSent(array()),
 | 
						|
            'Form::wasSent() does not return false in case no form identification element was added'
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function testWhetherADefaultActionIsBeingSetOnFormCreation()
 | 
						|
    {
 | 
						|
        $this->getRequestMock()->shouldReceive('getPathInfo')->andReturn('some/route');
 | 
						|
 | 
						|
        $form = new Form();
 | 
						|
        $form->setTokenDisabled();
 | 
						|
        $form->create();
 | 
						|
 | 
						|
        $this->assertEquals(
 | 
						|
            '/some/route',
 | 
						|
            $form->getAction(),
 | 
						|
            'Form::create() does not set a default action if none was set explicitly'
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @depends testWhetherAUniqueFormIdIsBeingAdded
 | 
						|
     * @depends testWhetherASubmitButtonIsAddedWithASubmitLabelBeingSet
 | 
						|
     */
 | 
						|
    public function testWhetherItIsPossibleToRecreateAForm()
 | 
						|
    {
 | 
						|
        $form = new Form();
 | 
						|
        $form->setTokenDisabled();
 | 
						|
        $form->setSubmitLabel('test');
 | 
						|
        $form->create(); // sets the flag $this->created to true
 | 
						|
        $form->clearElements(); // should reset the flag..
 | 
						|
        $form->create(); // ..so that we can recreate the form
 | 
						|
 | 
						|
        $this->assertCount(
 | 
						|
            2,
 | 
						|
            $form->getElements(),
 | 
						|
            'Form::clearElements() does not fully reset the form'
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function testWhetherGetNameReturnsTheEscapedClassNameByDefault()
 | 
						|
    {
 | 
						|
        $form = new Form();
 | 
						|
 | 
						|
        $this->assertEquals(
 | 
						|
            $form->filterName(get_class($form)),
 | 
						|
            $form->getName(),
 | 
						|
            'Form::getName() does not return the escaped class name in case no name was explicitly set'
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @expectedException   LogicException
 | 
						|
     */
 | 
						|
    public function testWhetherTheOnSuccessOptionMustBeCallable()
 | 
						|
    {
 | 
						|
        new Form(array('onSuccess' => '_invalid_'));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @depends testWhetherACsrfCounterMeasureIsNotBeingAdded
 | 
						|
     * @depends testWhetherAUniqueFormIdIsNotBeingAdded
 | 
						|
     * @depends testWhetherNoSubmitButtonIsAddedWithoutASubmitLabelBeingSet
 | 
						|
     */
 | 
						|
    public function testWhetherAClosureCanBePassedAsOnSuccessCallback()
 | 
						|
    {
 | 
						|
        $request = new Request();
 | 
						|
        $form = new Form(array(
 | 
						|
            'onSuccess' => function ($form) { $form->getRequest()->setParam('test', 'tset'); return false; }
 | 
						|
        ));
 | 
						|
        $form->setTokenDisabled();
 | 
						|
        $form->setUidDisabled();
 | 
						|
        $form->handleRequest($request);
 | 
						|
 | 
						|
        $this->assertEquals(
 | 
						|
            'tset',
 | 
						|
            $request->getParam('test'),
 | 
						|
            'Form does not utilize the onSuccess callback set with form options on instantiation'
 | 
						|
        );
 | 
						|
    }
 | 
						|
}
 |