summaryrefslogtreecommitdiff
path: root/www/wiki/tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php')
-rw-r--r--www/wiki/tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php183
1 files changed, 183 insertions, 0 deletions
diff --git a/www/wiki/tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php b/www/wiki/tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php
new file mode 100644
index 00000000..c1015234
--- /dev/null
+++ b/www/wiki/tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php
@@ -0,0 +1,183 @@
+<?php
+
+use MediaWiki\Auth\AuthManager;
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Preferences\DefaultPreferencesFactory;
+use Wikimedia\ObjectFactory;
+use Wikimedia\TestingAccessWrapper;
+
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @group Preferences
+ */
+class DefaultPreferencesFactoryTest extends MediaWikiTestCase {
+
+ /** @var IContextSource */
+ protected $context;
+
+ /** @var Config */
+ protected $config;
+
+ public function setUp() {
+ parent::setUp();
+ global $wgParserConf;
+ $this->context = new RequestContext();
+ $this->context->setTitle( Title::newFromText( self::class ) );
+ $this->setMwGlobals( 'wgParser',
+ ObjectFactory::constructClassInstance( $wgParserConf['class'], [ $wgParserConf ] )
+ );
+ $this->config = MediaWikiServices::getInstance()->getMainConfig();
+ }
+
+ /**
+ * Get a basic PreferencesFactory for testing with.
+ * @return DefaultPreferencesFactory
+ */
+ protected function getPreferencesFactory() {
+ return new DefaultPreferencesFactory(
+ $this->config,
+ new Language(),
+ AuthManager::singleton(),
+ MediaWikiServices::getInstance()->getLinkRenderer()
+ );
+ }
+
+ /**
+ * @covers MediaWiki\Preferences\DefaultPreferencesFactory::getForm()
+ */
+ public function testGetForm() {
+ $testUser = $this->getTestUser();
+ $form = $this->getPreferencesFactory()->getForm( $testUser->getUser(), $this->context );
+ $this->assertInstanceOf( PreferencesForm::class, $form );
+ $this->assertCount( 5, $form->getPreferenceSections() );
+ }
+
+ /**
+ * CSS classes for emailauthentication preference field when there's no email.
+ * @see https://phabricator.wikimedia.org/T36302
+ * @covers MediaWiki\Preferences\DefaultPreferencesFactory::profilePreferences()
+ * @dataProvider emailAuthenticationProvider
+ */
+ public function testEmailAuthentication( $user, $cssClass ) {
+ $prefs = $this->getPreferencesFactory()->getFormDescriptor( $user, $this->context );
+ $this->assertArrayHasKey( 'cssclass', $prefs['emailauthentication'] );
+ $this->assertEquals( $cssClass, $prefs['emailauthentication']['cssclass'] );
+ }
+
+ public function emailAuthenticationProvider() {
+ $userNoEmail = new User;
+ $userEmailUnauthed = new User;
+ $userEmailUnauthed->setEmail( 'noauth@example.org' );
+ $userEmailAuthed = new User;
+ $userEmailAuthed->setEmail( 'noauth@example.org' );
+ $userEmailAuthed->setEmailAuthenticationTimestamp( wfTimestamp() );
+ return [
+ [ $userNoEmail, 'mw-email-none' ],
+ [ $userEmailUnauthed, 'mw-email-not-authenticated' ],
+ [ $userEmailAuthed, 'mw-email-authenticated' ],
+ ];
+ }
+
+ /**
+ * Test that PreferencesFormPreSave hook has correct data:
+ * - user Object is passed
+ * - oldUserOptions contains previous user options (before save)
+ * - formData and User object have set up new properties
+ *
+ * @see https://phabricator.wikimedia.org/T169365
+ * @covers MediaWiki\Preferences\DefaultPreferencesFactory::submitForm()
+ */
+ public function testPreferencesFormPreSaveHookHasCorrectData() {
+ $oldOptions = [
+ 'test' => 'abc',
+ 'option' => 'old'
+ ];
+ $newOptions = [
+ 'test' => 'abc',
+ 'option' => 'new'
+ ];
+ $configMock = new HashConfig( [
+ 'HiddenPrefs' => []
+ ] );
+ $form = $this->getMockBuilder( PreferencesForm::class )
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $userMock = $this->getMockBuilder( User::class )
+ ->disableOriginalConstructor()
+ ->getMock();
+ $userMock->method( 'getOptions' )
+ ->willReturn( $oldOptions );
+ $userMock->method( 'isAllowedAny' )
+ ->willReturn( true );
+ $userMock->method( 'isAllowed' )
+ ->willReturn( true );
+
+ $userMock->expects( $this->exactly( 2 ) )
+ ->method( 'setOption' )
+ ->withConsecutive(
+ [ $this->equalTo( 'test' ), $this->equalTo( $newOptions[ 'test' ] ) ],
+ [ $this->equalTo( 'option' ), $this->equalTo( $newOptions[ 'option' ] ) ]
+ );
+
+ $form->expects( $this->any() )
+ ->method( 'getModifiedUser' )
+ ->willReturn( $userMock );
+
+ $form->expects( $this->any() )
+ ->method( 'getContext' )
+ ->willReturn( $this->context );
+
+ $form->expects( $this->any() )
+ ->method( 'getConfig' )
+ ->willReturn( $configMock );
+
+ $this->setTemporaryHook( 'PreferencesFormPreSave',
+ function ( $formData, $form, $user, &$result, $oldUserOptions )
+ use ( $newOptions, $oldOptions, $userMock ) {
+ $this->assertSame( $userMock, $user );
+ foreach ( $newOptions as $option => $value ) {
+ $this->assertSame( $value, $formData[ $option ] );
+ }
+ foreach ( $oldOptions as $option => $value ) {
+ $this->assertSame( $value, $oldUserOptions[ $option ] );
+ }
+ $this->assertEquals( true, $result );
+ }
+ );
+
+ $factory = TestingAccessWrapper::newFromObject( $this->getPreferencesFactory() );
+ $factory->saveFormData( $newOptions, $form );
+ }
+
+ /**
+ * The rclimit preference should accept non-integer input and filter it to become an integer.
+ */
+ public function testIntvalFilter() {
+ // Test a string with leading zeros (i.e. not octal) and spaces.
+ $this->context->getRequest()->setVal( 'wprclimit', ' 0012 ' );
+ $user = new User;
+ $form = $this->getPreferencesFactory()->getForm( $user, $this->context );
+ $form->show();
+ $form->trySubmit();
+ $this->assertEquals( 12, $user->getOption( 'rclimit' ) );
+ }
+}