1<?php
2/**
3 * Unit tests for HTML_QuickForm2 package
4 *
5 * PHP version 5
6 *
7 * LICENSE
8 *
9 * This source file is subject to BSD 3-Clause License that is bundled
10 * with this package in the file LICENSE and available at the URL
11 * https://raw.githubusercontent.com/pear/HTML_QuickForm2/trunk/docs/LICENSE
12 *
13 * @category  HTML
14 * @package   HTML_QuickForm2
15 * @author    Alexey Borzov <avb@php.net>
16 * @author    Bertrand Mansion <golgote@mamasam.com>
17 * @copyright 2006-2021 Alexey Borzov <avb@php.net>, Bertrand Mansion <golgote@mamasam.com>
18 * @license   https://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License
19 * @link      https://pear.php.net/package/HTML_QuickForm2
20 */
21
22/** Sets up includes */
23require_once dirname(dirname(dirname(__DIR__))) . '/TestHelper.php';
24
25/**
26 * Unit test for HTML_QuickForm2_Controller_Action_Display class
27 */
28class HTML_QuickForm2_Controller_Action_DisplayTest
29    extends PHPUnit_Framework_TestCase
30{
31   /**
32    * Do not allow displaying a wizard page if preceding page(s) are not valid
33    *
34    * @link http://pear.php.net/bugs/bug.php?id=2323
35    */
36    public function testBug2323()
37    {
38        $pageFirst = $this->getMockBuilder('HTML_QuickForm2_Controller_Page')
39            ->setMethods(['populateForm'])
40            ->setConstructorArgs([new HTML_QuickForm2('first')])
41            ->getMock();
42        $mockJump = $this->getMockBuilder('HTML_QuickForm2_Controller_Action')
43            ->setMethods(['perform'])
44            ->getMock();
45        $mockJump->expects($this->once())->method('perform')
46                 ->will($this->returnValue('jump to first'));
47        $pageFirst->addHandler('jump', $mockJump);
48
49        $pageSecond = $this->getMockBuilder('HTML_QuickForm2_Controller_Page')
50            ->setMethods(['populateForm'])
51            ->setConstructorArgs([new HTML_QuickForm2('second')])
52            ->getMock();
53        $mockDisplay = $this->getMockBuilder('HTML_QuickForm2_Controller_Action_Display')
54            ->setMethods(['renderForm'])
55            ->getMock();
56        $mockDisplay->expects($this->never())->method('renderForm');
57        $pageSecond->addHandler('display', $mockDisplay);
58
59        $controller = new HTML_QuickForm2_Controller('bug2323', true);
60        $controller->addPage($pageFirst);
61        $controller->addPage($pageSecond);
62
63        $this->assertEquals('jump to first', $pageSecond->handle('display'));
64    }
65
66    public function testLoadFromSessionContainerOnDisplay()
67    {
68        $mockForm = $this->getMockBuilder('HTML_QuickForm2')
69            ->setMethods(['validate'])
70            ->setConstructorArgs(['load'])
71            ->getMock();
72        $foo = $mockForm->addElement('text', 'foo');
73        $mockForm->expects($this->once())->method('validate')
74                 ->will($this->returnValue(false));
75        $mockPage = $this->getMockBuilder('HTML_QuickForm2_Controller_Page')
76            ->setMethods(['populateForm'])
77            ->setConstructorArgs([$mockForm])
78            ->getMock();
79        $mockPage->expects($this->once())->method('populateForm');
80        $mockDisplay = $this->getMockBuilder('HTML_QuickForm2_Controller_Action_Display')
81            ->setMethods(['renderForm'])
82            ->getMock();
83        $mockDisplay->expects($this->once())->method('renderForm')
84                    ->will($this->returnValue('a form'));
85        $mockPage->addHandler('display', $mockDisplay);
86
87        $controller = new HTML_QuickForm2_Controller('loadValues');
88        $controller->addPage($mockPage);
89        $controller->getSessionContainer()->storeValues('load', [
90            'foo' => 'bar'
91        ]);
92        $controller->getSessionContainer()->storeValidationStatus('load', false);
93
94        $this->assertEquals('a form', $mockPage->handle('display'));
95        $this->assertEquals('bar', $foo->getValue());
96    }
97
98    public function testNoLoadFromSessionContainerOnOtherActions()
99    {
100        $mockForm = $this->getMockBuilder('HTML_QuickForm2')
101            ->setMethods(['validate'])
102            ->setConstructorArgs(['noload'])
103            ->getMock();
104        $foo = $mockForm->addElement('text', 'foo');
105        $mockForm->expects($this->never())->method('validate');
106        $mockPage = $this->getMockBuilder('HTML_QuickForm2_Controller_Page')
107            ->setMethods(['populateForm'])
108            ->setConstructorArgs([$mockForm])
109            ->getMock();
110        $mockDisplay = $this->getMockBuilder('HTML_QuickForm2_Controller_Action_Display')
111            ->setMethods(['renderForm'])
112            ->getMock();
113        $mockDisplay->expects($this->once())->method('renderForm')
114                    ->will($this->returnValue('a form'));
115        $mockPage->addHandler('display', $mockDisplay);
116
117        $_REQUEST = [
118            $mockPage->getButtonName('submit') => 'Yes, submit!'
119        ];
120        $controller = new HTML_QuickForm2_Controller('noLoadValues');
121        $controller->addPage($mockPage);
122        $controller->getSessionContainer()->storeValues('noload', [
123            'foo' => 'bar'
124        ]);
125        $controller->getSessionContainer()->storeValidationStatus('noload', false);
126        $controller->addDataSource(new HTML_QuickForm2_DataSource_Array([
127            'foo' => 'quux'
128        ]));
129
130        $this->assertEquals('a form', $mockPage->handle('display'));
131        $this->assertEquals('quux', $foo->getValue());
132    }
133}
134?>