mediawiki-extensions-Cookie.../tests/phpunit/includes/HooksTest.php
Ostrzyciel 4f3981580d Move the warning outside sitenotice, tidy up code
There's a lot of things going on here, so a quick summary:
* Moved the warning outside sitenotice to avoid reflows and all
  kinds of other issues, including those with dismissable notices.
* Placed the warning on the bottom of the page, on all skins, for
  consistency and to avoid obstructing vital UI elements such as
  site name, user tools, search box.
* Changed the UI to use OOUI for, again, consistency and to avoid
  reinventing the wheel with button styling.
* Removed the cookie emoji as it was only taking up valuable space
  on mobile and making designing a sensible layout much harder.
* Merged the mobile and desktop RL modules into a single, responsive
  one. The warning will work correctly for any skin and screen width.
* The integration tests are truly horrible, I tried to at least
  make them work. They deserve a proper rewrite, but that should be
  done after the extension switches to the new hook system.

I will post screenshots of this in action in the first of the linked
tasks.

Bug: T271047
Bug: T173335
Change-Id: I6e2a3d7aeccc0d4df1b3238e52c67e72099d27d8
(cherry picked from commit edd0a7d949)
2021-02-01 17:56:50 +00:00

218 lines
4.5 KiB
PHP

<?php
namespace CookieWarning\Tests;
use CookieWarning\GeoLocation;
use CookieWarning\Hooks;
use DerivativeContext;
use FauxRequest;
use MediaWiki\MediaWikiServices;
use MediaWikiLangTestCase;
use RequestContext;
use SkinTemplate;
/**
* @covers Hooks
* @group Database
*/
class HooksTest extends MediaWikiLangTestCase {
/**
* @dataProvider providerOnSiteNoticeAfter
*
* @param bool $enabled
* @param false|string $morelinkConfig
* @param false|string $morelinkCookieWarningMsg
* @param false|string $morelinkCookiePolicyMsg
* @param false|string $expectedLink
*
* @throws \MWException
*/
public function testOnSiteNoticeAfter(
bool $enabled,
$morelinkConfig,
$morelinkCookieWarningMsg,
$morelinkCookiePolicyMsg,
$expectedLink
) : void {
$this->setMwGlobals( [
'wgCookieWarningEnabled' => $enabled,
'wgCookieWarningMoreUrl' => $morelinkConfig,
'wgCookieWarningForCountryCodes' => false,
] );
MediaWikiServices::getInstance()->getMessageCache()->enable();
if ( $morelinkCookieWarningMsg ) {
$this->editPage(
'cookiewarning-more-link',
strval( $morelinkCookieWarningMsg ),
'',
NS_MEDIAWIKI,
$this->getTestSysop()->getUser()
);
}
if ( $morelinkCookiePolicyMsg ) {
$this->editPage(
'cookie-policy-link',
strval( $morelinkCookiePolicyMsg ),
'',
NS_MEDIAWIKI,
$this->getTestSysop()->getUser()
);
}
$sk = new SkinTemplate();
// setup OOUI, that would be normally done in BeforePageDisplay hook
$sk->getOutput()->enableOOUI();
$data = '';
Hooks::onSkinAfterContent( $data, $sk );
if ( $enabled ) {
$this->assertNotEmpty( $data, 'Cookie warning should be present' );
} else {
$this->assertEmpty( $data, 'Cookie warning should not be present' );
return;
}
if ( $expectedLink === false ) {
$this->assertNotRegExp(
'/<a[^>]+href=[\'"]([^\'"]+)[\'"].+?>/',
$data,
'More information link should not be present'
);
} else {
$this->assertRegExp(
'/<a[^>]+href=[\'"]' . preg_quote( $expectedLink, '/' ) . '[\'"].+?>/',
$data,
'More information link should be present and match the expectation'
);
}
}
public function providerOnSiteNoticeAfter() : array {
return [
[
// $wgCookieWarningEnabled
true,
// $wgCookieWarningMoreUrl
'',
// MediaWiki:Cookiewarning-more-link
false,
// MediaWiki:Cookie-policy-link
false,
// expected cookie warning link (when string), nothing if false
false,
],
[
false,
'',
false,
false,
false,
],
[
true,
'http://google.de',
false,
false,
'http://google.de',
],
[
true,
'',
'http://google.de',
false,
'http://google.de',
],
[
true,
'',
false,
'http://google.de',
'http://google.de',
],
// the config should be the used, if set (no matter if the messages are used or not)
[
true,
'http://google.de',
false,
'http://google123.de',
'http://google.de',
],
[
true,
'http://google.de',
'http://google1234.de',
'http://google123.de',
'http://google.de',
],
[
true,
'',
'http://google.de',
'http://google123.de',
'http://google.de',
],
];
}
/**
* @dataProvider providerOnSiteNoticeAfterGeoLocation
* @throws \MWException
* @throws \ConfigException
*/
public function testOnSiteNoticeAfterGeoLocation( $ipAddress, $countryCodes,
$expected
) {
$this->setMwGlobals( [
'wgCookieWarningEnabled' => true,
'wgCookieWarningGeoIPLookup' => is_array( $countryCodes ) ? 'php' : 'none',
'wgCookieWarningForCountryCodes' => $countryCodes,
] );
$this->mockGeoLocationService();
$request = new FauxRequest();
$request->setIP( $ipAddress );
$context = new DerivativeContext( RequestContext::getMain() );
$context->setRequest( $request );
$sk = new SkinTemplate();
$sk->setContext( $context );
$data = '';
Hooks::onSkinAfterContent( $data, $sk );
$this->assertEquals(
$expected,
(bool)$data
);
}
public function providerOnSiteNoticeAfterGeoLocation() {
return [
[
'8.8.8.8',
[ 'US' => 'United States of America' ],
true,
],
[
'8.8.8.8',
[ 'EU' => 'European Union' ],
false,
],
[
'8.8.8.8',
false,
true,
],
];
}
private function mockGeoLocationService() {
$geoLocation = $this->getMockBuilder( GeoLocation::class )
->disableOriginalConstructor()
->getMock();
$geoLocation->method( 'locate' )->willReturn( 'US' );
$this->setService( 'GeoLocation', $geoLocation );
}
}