diff options
author | Bartosz Dziewoński <matma.rex@gmail.com> | 2022-01-28 14:25:57 +0100 |
---|---|---|
committer | Bartosz Dziewoński <matma.rex@gmail.com> | 2022-01-28 22:44:35 +0100 |
commit | 751f050bf3e2561a3b2808f8e1a2037c7ffa9b57 (patch) | |
tree | d3d68bc9504b01a9899b2e6b9dcce954f410a653 /tests/phpunit/includes/htmlform/HTMLFormFieldTest.php | |
parent | ababc1438c91c78c30bfb1126476cf6202e3fb18 (diff) | |
download | mediawikicore-751f050bf3e2561a3b2808f8e1a2037c7ffa9b57.tar.gz mediawikicore-751f050bf3e2561a3b2808f8e1a2037c7ffa9b57.zip |
Add tests for HTMLFormField 'hide-if' / 'disable-if' functionality
(Test scaffolding code copied from HTMLRestrictionsFieldTest)
Change-Id: I9d221059813a6ac362e3e070984abcaae57906dc
Diffstat (limited to 'tests/phpunit/includes/htmlform/HTMLFormFieldTest.php')
-rw-r--r-- | tests/phpunit/includes/htmlform/HTMLFormFieldTest.php | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/tests/phpunit/includes/htmlform/HTMLFormFieldTest.php b/tests/phpunit/includes/htmlform/HTMLFormFieldTest.php new file mode 100644 index 000000000000..8f2c8c22e22a --- /dev/null +++ b/tests/phpunit/includes/htmlform/HTMLFormFieldTest.php @@ -0,0 +1,260 @@ +<?php + +/** + * @covers HTMLFormField + */ +class HTMLFormFieldTest extends PHPUnit\Framework\TestCase { + + use MediaWikiCoversValidator; + + /** + * @covers HTMLFormField::isHidden + * @covers HTMLFormField::isDisabled + * @covers HTMLFormField::checkStateRecurse + * @covers HTMLFormField::checkValue + * @covers HTMLFormField::getNearestFieldByName + * @dataProvider provideCondState + */ + public function testCondState( $fieldInfo, $fieldData, $callback, $exception = null ) { + if ( $exception ) { + $this->expectException( MWException::class ); + $this->expectExceptionMessageMatches( $exception ); + } + $form = HTMLForm::factory( 'ooui', wfArrayPlus2d( $fieldInfo, [ + 'check1' => [ 'type' => 'check' ], + 'check2' => [ 'type' => 'check', 'invert' => true ], + 'select1' => [ 'type' => 'select', 'options' => [ 'a' => 'a', 'b' => 'b', 'c' => 'c' ] ], + 'text1' => [ 'type' => 'text' ], + ] ) ); + $request = new FauxRequest( $fieldData, true ); + $context = new DerivativeContext( RequestContext::getMain() ); + $context->setRequest( $request ); + $form->setContext( $context ); + $form->setTitle( Title::newFromText( 'Main Page' ) )->setSubmitCallback( static function () { + return true; + } )->prepareForm(); + $status = $form->trySubmit(); + + $callback( $form, $fieldData ); + } + + public function provideCondState() { + yield 'Field hidden if "check" field is checked' => [ + 'fieldInfo' => [ + 'text1' => [ 'hide-if' => [ '===', 'check1', '1' ] ], + ], + 'fieldData' => [ + 'check1' => '1', + ], + 'callback' => function ( $form, $fieldData ) { + $this->assertTrue( $form->getField( 'text1' )->isHidden( $fieldData ) ); + } + ]; + yield 'Field hidden if "check" field is not checked' => [ + 'fieldInfo' => [ + 'text1' => [ 'hide-if' => [ '===', 'check1', '' ] ], + ], + 'fieldData' => [], + 'callback' => function ( $form, $fieldData ) { + $this->assertTrue( $form->getField( 'text1' )->isHidden( $fieldData ) ); + } + ]; + yield 'Field not hidden if "check" field is not checked' => [ + 'fieldInfo' => [ + 'text1' => [ 'hide-if' => [ '===', 'check1', '1' ] ], + ], + 'fieldData' => [], + 'callback' => function ( $form, $fieldData ) { + $this->assertFalse( $form->getField( 'text1' )->isHidden( $fieldData ) ); + } + ]; + yield 'Field hidden if "check" field (invert) is checked' => [ + 'fieldInfo' => [ + 'text1' => [ 'hide-if' => [ '===', 'check2', '' ] ], + ], + 'fieldData' => [ + 'check2' => '1', + ], + 'callback' => function ( $form, $fieldData ) { + $this->assertTrue( $form->getField( 'text1' )->isHidden( $fieldData ) ); + } + ]; + yield 'Field hidden if "check" field (invert) is not checked' => [ + 'fieldInfo' => [ + 'text1' => [ 'hide-if' => [ '===', 'check2', '1' ] ], + ], + 'fieldData' => [], + 'callback' => function ( $form, $fieldData ) { + $this->assertTrue( $form->getField( 'text1' )->isHidden( $fieldData ) ); + } + ]; + yield 'Field not hidden if "check" field (invert) is checked' => [ + 'fieldInfo' => [ + 'text1' => [ 'hide-if' => [ '===', 'check2', '1' ] ], + ], + 'fieldData' => [ + 'check2' => '1', + ], + 'callback' => function ( $form, $fieldData ) { + $this->assertFalse( $form->getField( 'text1' )->isHidden( $fieldData ) ); + } + ]; + yield 'Field hidden if "select" field has value' => [ + 'fieldInfo' => [ + 'text1' => [ 'hide-if' => [ '===', 'select1', 'a' ] ], + ], + 'fieldData' => [ + 'select1' => 'a', + ], + 'callback' => function ( $form, $fieldData ) { + $this->assertTrue( $form->getField( 'text1' )->isHidden( $fieldData ) ); + } + ]; + yield 'Field hidden if "text" field has value' => [ + 'fieldInfo' => [ + 'select1' => [ 'hide-if' => [ '===', 'text1', 'hello' ] ], + ], + 'fieldData' => [ + 'text1' => 'hello', + ], + 'callback' => function ( $form, $fieldData ) { + $this->assertTrue( $form->getField( 'select1' )->isHidden( $fieldData ) ); + } + ]; + + yield 'Field hidden using AND conditions' => [ + 'fieldInfo' => [ + 'text1' => [ 'hide-if' => [ 'AND', + [ '===', 'check1', '1' ], + [ '===', 'select1', 'a' ] + ] ], + ], + 'fieldData' => [ + 'check1' => '1', + 'select1' => 'a', + ], + 'callback' => function ( $form, $fieldData ) { + $this->assertTrue( $form->getField( 'text1' )->isHidden( $fieldData ) ); + } + ]; + yield 'Field hidden using OR conditions' => [ + 'fieldInfo' => [ + 'text1' => [ 'hide-if' => [ 'OR', + [ '===', 'check1', '1' ], + [ '===', 'select1', 'a' ] + ] ], + ], + 'fieldData' => [ + 'check1' => '1', + ], + 'callback' => function ( $form, $fieldData ) { + $this->assertTrue( $form->getField( 'text1' )->isHidden( $fieldData ) ); + } + ]; + yield 'Field hidden using NAND conditions' => [ + 'fieldInfo' => [ + 'text1' => [ 'hide-if' => [ 'NAND', + [ '===', 'check1', '1' ], + [ '===', 'select1', 'a' ] + ] ], + ], + 'fieldData' => [ + 'check1' => '1', + ], + 'callback' => function ( $form, $fieldData ) { + $this->assertTrue( $form->getField( 'text1' )->isHidden( $fieldData ) ); + } + ]; + yield 'Field hidden using NOR conditions' => [ + 'fieldInfo' => [ + 'text1' => [ 'hide-if' => [ 'NOR', + [ '===', 'check1', '1' ], + [ '===', 'select1', 'a' ] + ] ], + ], + 'fieldData' => [], + 'callback' => function ( $form, $fieldData ) { + $this->assertTrue( $form->getField( 'text1' )->isHidden( $fieldData ) ); + } + ]; + yield 'Field hidden using complex conditions' => [ + 'fieldInfo' => [ + 'text1' => [ 'hide-if' => [ 'OR', + [ 'NOT', [ 'AND', + [ '===', 'check1', '1' ], + [ '===', 'check2', '1' ] + ] ], + [ '===', 'select1', 'a' ] + ] ], + ], + 'fieldData' => [], + 'callback' => function ( $form, $fieldData ) { + $this->assertTrue( $form->getField( 'text1' )->isHidden( $fieldData ) ); + } + ]; + + yield 'Invalid conditional specification (unsupported)' => [ + 'fieldInfo' => [ + 'text1' => [ 'hide-if' => [ '>', 'test1', '10' ] ], + ], + 'fieldData' => [], + 'callback' => null, + 'exception' => '/Unknown operation/', + ]; + yield 'Invalid conditional specification (NOT)' => [ + 'fieldInfo' => [ + 'text1' => [ 'hide-if' => [ 'NOT', '===', 'check1', '1' ] ], + ], + 'fieldData' => [], + 'callback' => null, + 'exception' => '/NOT takes exactly one parameter/', + ]; + yield 'Invalid conditional specification (AND/OR/NAND/NOR)' => [ + 'fieldInfo' => [ + 'text1' => [ 'hide-if' => [ 'AND', '===', 'check1', '1' ] ], + ], + 'fieldData' => [], + 'callback' => null, + 'exception' => '/Expected array, found string/', + ]; + yield 'Invalid conditional specification (===/!===) 1' => [ + 'fieldInfo' => [ + 'text1' => [ 'hide-if' => [ '===', 'check1' ] ], + ], + 'fieldData' => [], + 'callback' => null, + 'exception' => '/=== takes exactly two parameters/', + ]; + yield 'Invalid conditional specification (===/!===) 2' => [ + 'fieldInfo' => [ + 'text1' => [ 'hide-if' => [ '===', [ '===', 'check1', '1' ], '1' ] ], + ], + 'fieldData' => [], + 'callback' => null, + 'exception' => '/Parameters for === must be strings/', + ]; + + yield 'Field disabled if "check" field is checked' => [ + 'fieldInfo' => [ + 'text1' => [ 'disable-if' => [ '===', 'check1', '1' ] ], + ], + 'fieldData' => [ + 'check1' => '1', + ], + 'callback' => function ( $form, $fieldData ) { + $this->assertTrue( $form->getField( 'text1' )->isDisabled( $fieldData ) ); + } + ]; + yield 'Field disabled if hidden' => [ + 'fieldInfo' => [ + 'text1' => [ 'hide-if' => [ '===', 'check1', '1' ] ], + ], + 'fieldData' => [ + 'check1' => '1', + ], + 'callback' => function ( $form, $fieldData ) { + $this->assertTrue( $form->getField( 'text1' )->isDisabled( $fieldData ) ); + } + ]; + } +} |