mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Popups
synced 2024-11-23 23:24:39 +00:00
Merge "Send disabled event when user disables Page Preview"
This commit is contained in:
commit
311466cad0
|
@ -11,7 +11,12 @@
|
||||||
"AutoloadClasses": {
|
"AutoloadClasses": {
|
||||||
"Popups\\PopupsHooks": "includes/PopupsHooks.php",
|
"Popups\\PopupsHooks": "includes/PopupsHooks.php",
|
||||||
"Popups\\PopupsContext": "includes/PopupsContext.php",
|
"Popups\\PopupsContext": "includes/PopupsContext.php",
|
||||||
"Popups\\PopupsGadgetsIntegration": "includes/PopupsGadgetsIntegration.php"
|
"Popups\\PopupsGadgetsIntegration": "includes/PopupsGadgetsIntegration.php",
|
||||||
|
"Popups\\UserPreferencesChangeHandler": "includes/UserPreferencesChangeHandler.php",
|
||||||
|
"Popups\\EventLogging\\EventLogger": "includes/EventLogging/EventLogger.php",
|
||||||
|
"Popups\\EventLogging\\NullLogger": "includes/EventLogging/NullLogger.php",
|
||||||
|
"Popups\\EventLogging\\MWEventLogger": "includes/EventLogging/MWEventLogger.php",
|
||||||
|
"Popups\\EventLogging\\EventLoggerFactory": "includes/EventLogging/EventLoggerFactory.php"
|
||||||
},
|
},
|
||||||
"ConfigRegistry": {
|
"ConfigRegistry": {
|
||||||
"popups": "GlobalVarConfig::newInstance"
|
"popups": "GlobalVarConfig::newInstance"
|
||||||
|
@ -29,6 +34,9 @@
|
||||||
"GetPreferences": [
|
"GetPreferences": [
|
||||||
"Popups\\PopupsHooks::onGetPreferences"
|
"Popups\\PopupsHooks::onGetPreferences"
|
||||||
],
|
],
|
||||||
|
"PreferencesFormPreSave" : [
|
||||||
|
"Popups\\UserPreferencesChangeHandler::onPreferencesFormPreSave"
|
||||||
|
],
|
||||||
"UserGetDefaultOptions": [
|
"UserGetDefaultOptions": [
|
||||||
"Popups\\PopupsHooks::onUserGetDefaultOptions"
|
"Popups\\PopupsHooks::onUserGetDefaultOptions"
|
||||||
],
|
],
|
||||||
|
|
32
includes/EventLogging/EventLogger.php
Normal file
32
includes/EventLogging/EventLogger.php
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of the MediaWiki extension Popups.
|
||||||
|
*
|
||||||
|
* Popups 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.
|
||||||
|
*
|
||||||
|
* Popups 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 Popups. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* @file
|
||||||
|
* @ingroup extensions
|
||||||
|
*/
|
||||||
|
namespace Popups\EventLogging;
|
||||||
|
|
||||||
|
interface EventLogger {
|
||||||
|
/**
|
||||||
|
* Page Previews Event logging schema name
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
const PREVIEWS_SCHEMA_NAME = 'Popups';
|
||||||
|
|
||||||
|
public function log( array $event );
|
||||||
|
|
||||||
|
}
|
53
includes/EventLogging/EventLoggerFactory.php
Normal file
53
includes/EventLogging/EventLoggerFactory.php
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of the MediaWiki extension Popups.
|
||||||
|
*
|
||||||
|
* Popups 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.
|
||||||
|
*
|
||||||
|
* Popups 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 Popups. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* @file
|
||||||
|
* @ingroup extensions
|
||||||
|
*/
|
||||||
|
namespace Popups\EventLogging;
|
||||||
|
|
||||||
|
use Config;
|
||||||
|
use ExtensionRegistry;
|
||||||
|
|
||||||
|
class EventLoggerFactory {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var ExtensionRegistry
|
||||||
|
*/
|
||||||
|
private $registry;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \Config
|
||||||
|
*/
|
||||||
|
private $config;
|
||||||
|
|
||||||
|
public function __construct( Config $config, ExtensionRegistry $registry ) {
|
||||||
|
$this->registry = $registry;
|
||||||
|
$this->config = $config;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return EventLogger
|
||||||
|
*/
|
||||||
|
public function get() {
|
||||||
|
if ( $this->registry->isLoaded( 'EventLogging' ) ) {
|
||||||
|
return new MWEventLogger( $this->config, $this->registry );
|
||||||
|
}
|
||||||
|
return new NullLogger();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
72
includes/EventLogging/MWEventLogger.php
Normal file
72
includes/EventLogging/MWEventLogger.php
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of the MediaWiki extension Popups.
|
||||||
|
*
|
||||||
|
* Popups 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.
|
||||||
|
*
|
||||||
|
* Popups 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 Popups. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* @file
|
||||||
|
* @ingroup extensions
|
||||||
|
*/
|
||||||
|
namespace Popups\EventLogging;
|
||||||
|
|
||||||
|
use Config;
|
||||||
|
use ExtensionRegistry;
|
||||||
|
|
||||||
|
class MWEventLogger implements EventLogger {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Config
|
||||||
|
*/
|
||||||
|
private $config;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var ExtensionRegistry
|
||||||
|
*/
|
||||||
|
private $registry;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module constructor.
|
||||||
|
* @param Config $config
|
||||||
|
*/
|
||||||
|
public function __construct( Config $config, ExtensionRegistry $registry ) {
|
||||||
|
$this->config = $config;
|
||||||
|
$this->registry = $registry;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function shouldLog() {
|
||||||
|
// 1 fully enabled, 0 disabled
|
||||||
|
$samplingRate = $this->config->get( 'PopupsSchemaSamplingRate' );
|
||||||
|
if ( $samplingRate == 0 ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (float)wfRandom() <= (float)$samplingRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function log( array $event ) {
|
||||||
|
if ( !$this->shouldLog() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$eventLoggingSchemas = $this->registry->getAttribute( 'EventLoggingSchemas' );
|
||||||
|
|
||||||
|
\EventLogging::logEvent(
|
||||||
|
self::PREVIEWS_SCHEMA_NAME,
|
||||||
|
$eventLoggingSchemas[ self::PREVIEWS_SCHEMA_NAME ],
|
||||||
|
$event
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
29
includes/EventLogging/NullLogger.php
Normal file
29
includes/EventLogging/NullLogger.php
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of the MediaWiki extension Popups.
|
||||||
|
*
|
||||||
|
* Popups 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.
|
||||||
|
*
|
||||||
|
* Popups 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 Popups. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* @file
|
||||||
|
* @ingroup extensions
|
||||||
|
*/
|
||||||
|
namespace Popups\EventLogging;
|
||||||
|
|
||||||
|
class NullLogger implements EventLogger {
|
||||||
|
|
||||||
|
public function log( array $event ) {
|
||||||
|
// just do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -24,6 +24,10 @@ use MediaWiki\Logger\LoggerFactory;
|
||||||
use MediaWiki\MediaWikiServices;
|
use MediaWiki\MediaWikiServices;
|
||||||
use ExtensionRegistry;
|
use ExtensionRegistry;
|
||||||
use Config;
|
use Config;
|
||||||
|
use Popups\EventLogging\EventLogger;
|
||||||
|
use Popups\EventLogging\EventLoggerFactory;
|
||||||
|
use Popups\EventLogging\MWEventLogger;
|
||||||
|
use Popups\EventLogging\NullLogger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Popups Module
|
* Popups Module
|
||||||
|
@ -68,7 +72,6 @@ class PopupsContext {
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
const PREVIEWS_BETA_PREFERENCE_NAME = 'popups';
|
const PREVIEWS_BETA_PREFERENCE_NAME = 'popups';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var \Config
|
* @var \Config
|
||||||
*/
|
*/
|
||||||
|
@ -83,12 +86,14 @@ class PopupsContext {
|
||||||
* @param Config $config
|
* @param Config $config
|
||||||
* @param ExtensionRegistry $extensionRegistry
|
* @param ExtensionRegistry $extensionRegistry
|
||||||
* @param PopupsGadgetsIntegration $gadgetsIntegration
|
* @param PopupsGadgetsIntegration $gadgetsIntegration
|
||||||
|
* @param EventLogger $eventLogger
|
||||||
*/
|
*/
|
||||||
protected function __construct( Config $config, ExtensionRegistry $extensionRegistry,
|
protected function __construct( Config $config, ExtensionRegistry $extensionRegistry,
|
||||||
PopupsGadgetsIntegration $gadgetsIntegration ) {
|
PopupsGadgetsIntegration $gadgetsIntegration, EventLogger $eventLogger ) {
|
||||||
/** @todo Use MediaWikiServices Service Locator when it's ready */
|
/** @todo Use MediaWikiServices Service Locator when it's ready */
|
||||||
$this->extensionRegistry = $extensionRegistry;
|
$this->extensionRegistry = $extensionRegistry;
|
||||||
$this->gadgetsIntegration = $gadgetsIntegration;
|
$this->gadgetsIntegration = $gadgetsIntegration;
|
||||||
|
$this->eventLogger = $eventLogger;
|
||||||
|
|
||||||
$this->config = $config;
|
$this->config = $config;
|
||||||
}
|
}
|
||||||
|
@ -106,7 +111,10 @@ class PopupsContext {
|
||||||
$config = MediaWikiServices::getInstance()->getConfigFactory()
|
$config = MediaWikiServices::getInstance()->getConfigFactory()
|
||||||
->makeConfig( PopupsContext::EXTENSION_NAME );
|
->makeConfig( PopupsContext::EXTENSION_NAME );
|
||||||
$gadgetsIntegration = new PopupsGadgetsIntegration( $config, $registry );
|
$gadgetsIntegration = new PopupsGadgetsIntegration( $config, $registry );
|
||||||
self::$instance = new PopupsContext( $config, $registry, $gadgetsIntegration );
|
$eventLoggerFactory = new EventLoggerFactory( $config, $registry );
|
||||||
|
|
||||||
|
self::$instance = new PopupsContext( $config, $registry,
|
||||||
|
$gadgetsIntegration, $eventLoggerFactory->get() );
|
||||||
}
|
}
|
||||||
return self::$instance;
|
return self::$instance;
|
||||||
}
|
}
|
||||||
|
@ -191,4 +199,23 @@ class PopupsContext {
|
||||||
return $this->config;
|
return $this->config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log disabled event
|
||||||
|
*/
|
||||||
|
public function logUserDisabledPagePreviewsEvent() {
|
||||||
|
// @see https://phabricator.wikimedia.org/T167365
|
||||||
|
$this->eventLogger->log( [
|
||||||
|
'pageTitleSource' => 'Special:Preferences',
|
||||||
|
'namespaceIdSource' => NS_SPECIAL,
|
||||||
|
'pageIdSource' => -1,
|
||||||
|
'hovercardsSuppressedByGadget' => false,
|
||||||
|
'pageToken' => wfRandomString(),
|
||||||
|
'sessionToken' => wfRandomString(), // we don't have access to mw.user.sessionId()
|
||||||
|
'action' => 'disabled',
|
||||||
|
'isAnon' => false,
|
||||||
|
'popupEnabled' => false,
|
||||||
|
'previewCountBucket' => 'unknown'
|
||||||
|
] );
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
94
includes/UserPreferencesChangeHandler.php
Normal file
94
includes/UserPreferencesChangeHandler.php
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of the MediaWiki extension Popups.
|
||||||
|
*
|
||||||
|
* Popups 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.
|
||||||
|
*
|
||||||
|
* Popups 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 Popups. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* @file
|
||||||
|
* @ingroup extensions
|
||||||
|
*/
|
||||||
|
namespace Popups;
|
||||||
|
|
||||||
|
use User;
|
||||||
|
use PreferencesForm;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* User Preferences save change listener
|
||||||
|
*
|
||||||
|
* @package Popups
|
||||||
|
*/
|
||||||
|
class UserPreferencesChangeHandler {
|
||||||
|
/**
|
||||||
|
* @var UserPreferencesChangeHandler
|
||||||
|
*/
|
||||||
|
private static $instance;
|
||||||
|
/**
|
||||||
|
* @var PopupsContext
|
||||||
|
*/
|
||||||
|
private $popupsContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UserPreferencesChangeHandler constructor.
|
||||||
|
* @param PopupsContext $context
|
||||||
|
*/
|
||||||
|
public function __construct( PopupsContext $context ) {
|
||||||
|
$this->popupsContext = $context;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hook executed on Preferences Form Save, when user disables Page Previews call PopupsContext
|
||||||
|
* to log `disabled` event.
|
||||||
|
*
|
||||||
|
* @param User $user
|
||||||
|
* @param array $oldUserOptions
|
||||||
|
*/
|
||||||
|
public function doPreferencesFormPreSave( User $user, array $oldUserOptions ) {
|
||||||
|
if ( !array_key_exists( PopupsContext::PREVIEWS_OPTIN_PREFERENCE_NAME, $oldUserOptions ) ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$oldSetting = $oldUserOptions[ PopupsContext::PREVIEWS_OPTIN_PREFERENCE_NAME ];
|
||||||
|
$newSetting = $user->getOption( PopupsContext::PREVIEWS_OPTIN_PREFERENCE_NAME );
|
||||||
|
|
||||||
|
if ( $oldSetting == PopupsContext::PREVIEWS_ENABLED
|
||||||
|
&& $newSetting == PopupsContext::PREVIEWS_DISABLED ) {
|
||||||
|
$this->popupsContext->logUserDisabledPagePreviewsEvent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return UserPreferencesChangeHandler
|
||||||
|
*/
|
||||||
|
private static function newFromGlobalState() {
|
||||||
|
if ( self::$instance === null ) {
|
||||||
|
self::$instance = new UserPreferencesChangeHandler( PopupsContext::getInstance() );
|
||||||
|
}
|
||||||
|
return self::$instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $formData
|
||||||
|
* @param PreferencesForm $form
|
||||||
|
* @param User $user
|
||||||
|
* @param boolean $result
|
||||||
|
* @param array $oldUserOptions
|
||||||
|
*/
|
||||||
|
public static function onPreferencesFormPreSave(
|
||||||
|
array $formData,
|
||||||
|
PreferencesForm $form,
|
||||||
|
User $user,
|
||||||
|
&$result,
|
||||||
|
$oldUserOptions ) {
|
||||||
|
self::newFromGlobalState()->doPreferencesFormPreSave( $user, $oldUserOptions );
|
||||||
|
}
|
||||||
|
}
|
63
tests/phpunit/EventLogging/EventLoggerFactoryTest.php
Normal file
63
tests/phpunit/EventLogging/EventLoggerFactoryTest.php
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of the MediaWiki extension Popups.
|
||||||
|
*
|
||||||
|
* Popups 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.
|
||||||
|
*
|
||||||
|
* Popups 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 Popups. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* @file
|
||||||
|
* @ingroup extensions
|
||||||
|
*/
|
||||||
|
use Popups\EventLogging\MWEventLogger;
|
||||||
|
use Popups\EventLogging\NullLogger;
|
||||||
|
use Popups\EventLogging\EventLoggerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Integration tests for Page Preview hooks
|
||||||
|
*
|
||||||
|
* @group Popups
|
||||||
|
* @coversDefaultClass EventLoggerFactory
|
||||||
|
*/
|
||||||
|
class EventLoggerFactoryTest extends MediaWikiTestCase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers ::get
|
||||||
|
*/
|
||||||
|
public function testReturnsMWEventWhenEventLoggingIsAvailable() {
|
||||||
|
$mock = $this->getMock( ExtensionRegistry::class, [ 'isLoaded' ] );
|
||||||
|
$mock->expects( $this->once() )
|
||||||
|
->method( 'isLoaded' )
|
||||||
|
->with( 'EventLogging' )
|
||||||
|
->willReturn( true );
|
||||||
|
|
||||||
|
$config = new HashConfig();
|
||||||
|
$factory = new EventLoggerFactory( $config, $mock );
|
||||||
|
$this->assertInstanceOf( MWEventLogger::class, $factory->get() );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers ::get
|
||||||
|
*/
|
||||||
|
public function testReturnsMWEventWhenEventLoggingIsNotAvailable() {
|
||||||
|
$mock = $this->getMock( ExtensionRegistry::class, [ 'isLoaded' ] );
|
||||||
|
$mock->expects( $this->once() )
|
||||||
|
->method( 'isLoaded' )
|
||||||
|
->with( 'EventLogging' )
|
||||||
|
->willReturn( false );
|
||||||
|
|
||||||
|
$config = new HashConfig();
|
||||||
|
$factory = new EventLoggerFactory( $config, $mock );
|
||||||
|
$this->assertInstanceOf( NullLogger::class, $factory->get() );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
56
tests/phpunit/EventLogging/MWEventLoggerTest.php
Normal file
56
tests/phpunit/EventLogging/MWEventLoggerTest.php
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of the MediaWiki extension Popups.
|
||||||
|
*
|
||||||
|
* Popups 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.
|
||||||
|
*
|
||||||
|
* Popups 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 Popups. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* @file
|
||||||
|
* @ingroup extensions
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Integration tests for Page Preview hooks
|
||||||
|
*
|
||||||
|
* @group Popups
|
||||||
|
* @coversDefaultClass MWEventLogger
|
||||||
|
*/
|
||||||
|
class MWEventLoggerTest extends MediaWikiTestCase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers ::logUserDisabledPagePreviewsEvent
|
||||||
|
* @dataProvider provideTestDataForLogUserDisabledPagePreviewsEventW
|
||||||
|
*/
|
||||||
|
public function testShouldLog( $samplingRate, $expected ) {
|
||||||
|
$config = $this->getMockBuilder( 'Config' )->setMethods( [ 'get', 'has' ] )->getMock();
|
||||||
|
|
||||||
|
$config->expects( $this->once() )
|
||||||
|
->method( 'get' )
|
||||||
|
->with( 'PopupsSchemaSamplingRate' )
|
||||||
|
->willReturn( $samplingRate );
|
||||||
|
|
||||||
|
$logger = new \Popups\EventLogging\MWEventLogger( $config, ExtensionRegistry::getInstance() );
|
||||||
|
$this->assertEquals( $expected, $logger->shouldLog() );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mock edge cases
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function provideTestDataForLogUserDisabledPagePreviewsEventW() {
|
||||||
|
return [
|
||||||
|
[ 0, false ],
|
||||||
|
[ 1, true ]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -311,6 +311,23 @@ class PopupsContextTest extends MediaWikiTestCase {
|
||||||
$this->assertEquals( true, $context->conflictsWithNavPopupsGadget( $user ) );
|
$this->assertEquals( true, $context->conflictsWithNavPopupsGadget( $user ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers ::logUserDisabledPagePreviewsEvent
|
||||||
|
*/
|
||||||
|
public function testLogsEvent() {
|
||||||
|
$loggerMock = $this->getMock( \Popups\EventLogging\EventLogger::class );
|
||||||
|
$loggerMock->expects( $this->once() )
|
||||||
|
->method( 'log' );
|
||||||
|
$integrationMock = $this->getMockBuilder( \Popups\PopupsGadgetsIntegration::class )
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->setMethods( [ 'conflictsWithNavPopupsGadget' ] )
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$context = new PopupsContextTestWrapper( $this->getConfigMock(),
|
||||||
|
ExtensionRegistry::getInstance(), $integrationMock, $loggerMock );
|
||||||
|
$context->logUserDisabledPagePreviewsEvent();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return PHPUnit_Framework_MockObject_MockObject|Config
|
* @return PHPUnit_Framework_MockObject_MockObject|Config
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -18,8 +18,11 @@
|
||||||
* @file
|
* @file
|
||||||
* @ingroup extensions
|
* @ingroup extensions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Popups\PopupsContext;
|
use Popups\PopupsContext;
|
||||||
use Popups\PopupsGadgetsIntegration;
|
use Popups\PopupsGadgetsIntegration;
|
||||||
|
use Popups\EventLogging\EventLogger;
|
||||||
|
use Popups\EventLogging\NullLogger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an initializable Popups context.
|
* Create an initializable Popups context.
|
||||||
|
@ -40,13 +43,16 @@ class PopupsContextTestWrapper extends PopupsContext {
|
||||||
* @param Config $config
|
* @param Config $config
|
||||||
* @param ExtensionRegistry $extensionRegistry
|
* @param ExtensionRegistry $extensionRegistry
|
||||||
* @param PopupsGadgetsIntegration|null $gadgetsIntegration
|
* @param PopupsGadgetsIntegration|null $gadgetsIntegration
|
||||||
|
* @param EventLogger|null $eventLogger
|
||||||
*/
|
*/
|
||||||
public function __construct( Config $config, ExtensionRegistry $extensionRegistry,
|
public function __construct( Config $config, ExtensionRegistry $extensionRegistry,
|
||||||
PopupsGadgetsIntegration $gadgetsIntegration = null ) {
|
PopupsGadgetsIntegration $gadgetsIntegration = null,
|
||||||
|
EventLogger $eventLogger = null ) {
|
||||||
$gadgetsIntegration = $gadgetsIntegration ? $gadgetsIntegration :
|
$gadgetsIntegration = $gadgetsIntegration ? $gadgetsIntegration :
|
||||||
new PopupsGadgetsIntegration( $config, $extensionRegistry );
|
new PopupsGadgetsIntegration( $config, $extensionRegistry );
|
||||||
|
$eventLogger = $eventLogger ? $eventLogger : new NullLogger();
|
||||||
|
|
||||||
parent::__construct( $config, $extensionRegistry, $gadgetsIntegration );
|
parent::__construct( $config, $extensionRegistry, $gadgetsIntegration, $eventLogger );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
70
tests/phpunit/UserPreferencesChangeHandlerTest.php
Normal file
70
tests/phpunit/UserPreferencesChangeHandlerTest.php
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of the MediaWiki extension Popups.
|
||||||
|
*
|
||||||
|
* Popups 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.
|
||||||
|
*
|
||||||
|
* Popups 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 Popups. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* @file
|
||||||
|
* @ingroup extensions
|
||||||
|
*/
|
||||||
|
require_once 'PopupsContextTestWrapper.php';
|
||||||
|
use Popups\PopupsContext;
|
||||||
|
use Popups\UserPreferencesChangeHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Integration tests for Page Preview hooks
|
||||||
|
*
|
||||||
|
* @group Popups
|
||||||
|
* @coversDefaultClass UserPreferencesChangeHandlerTest
|
||||||
|
*/
|
||||||
|
class UserPreferencesChangeHandlerTest extends MediaWikiTestCase {
|
||||||
|
|
||||||
|
protected function tearDown() {
|
||||||
|
PopupsContextTestWrapper::resetTestInstance();
|
||||||
|
parent::tearDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers ::handle
|
||||||
|
* @covers ::__construct
|
||||||
|
* @dataProvider provideDataForEventHandling
|
||||||
|
*/
|
||||||
|
public function testEventHandling( $oldOption, $newOption, $expectedMethodCallsCount ) {
|
||||||
|
$contextMock = $this->getMockBuilder( PopupsContextTestWrapper::class )
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->setMethods( [ 'logUserDisabledPagePreviewsEvent' ] )
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$contextMock->expects( $expectedMethodCallsCount )
|
||||||
|
->method( 'logUserDisabledPagePreviewsEvent' );
|
||||||
|
|
||||||
|
$user = $this->getMutableTestUser()->getUser();
|
||||||
|
$user->setOption( PopupsContext::PREVIEWS_OPTIN_PREFERENCE_NAME, $newOption );
|
||||||
|
$oldOptions = [
|
||||||
|
PopupsContext::PREVIEWS_OPTIN_PREFERENCE_NAME => $oldOption
|
||||||
|
];
|
||||||
|
$listener = new UserPreferencesChangeHandler( $contextMock );
|
||||||
|
$listener->doPreferencesFormPreSave( $user, $oldOptions );
|
||||||
|
}
|
||||||
|
|
||||||
|
public function provideDataForEventHandling() {
|
||||||
|
return [
|
||||||
|
[ PopupsContext::PREVIEWS_DISABLED, PopupsContext::PREVIEWS_DISABLED, $this->never() ],
|
||||||
|
[ PopupsContext::PREVIEWS_ENABLED, PopupsContext::PREVIEWS_ENABLED, $this->never() ],
|
||||||
|
[ PopupsContext::PREVIEWS_DISABLED, PopupsContext::PREVIEWS_ENABLED, $this->never() ],
|
||||||
|
[ PopupsContext::PREVIEWS_ENABLED, PopupsContext::PREVIEWS_DISABLED, $this->once() ]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue