wiki.techinc.nl/tests/phpunit/structure/BundleSizeTest.php
Kosta Harlan 61e16d8ef8 tests: Add structure test for bundlesize.config.json
This is the same functionality provided by `npm test:size` in Minerva
and Vector skins, but as a structure test. Any extension/skin that
provides bundlesize.config.json containing an array of expected gzipped
sizes and module names will be processed by this test.

See also WikimediaMaintenance's blameStartupRegistry.php for similar
code.

Bug: T255149
Change-Id: Ieb7591f3c0ac843677a2a61b4ad47f920fc2ca2d
2021-12-01 14:12:33 +01:00

68 lines
2.3 KiB
PHP

<?php
namespace MediaWiki\Tests\Structure;
use DerivativeResourceLoaderContext;
use FauxRequest;
use MediaWiki\MediaWikiServices;
use MediaWikiIntegrationTestCase;
use ResourceLoaderContext;
use ResourceLoaderModule;
/**
* Compare bundle sizes from each skin/extension bundlesize.config.json with ResourceLoader output.
*
* Extensions and skins can subclass this and override getTestCases with just their own bundlesize
* file. This allows one to run that test suite by its own, for faster CLI feedback.
*/
abstract class BundleSizeTest extends MediaWikiIntegrationTestCase {
/**
* @coversNothing
*/
public function testBundleSize() {
$bundleSizeConfig = json_decode( file_get_contents( $this->getBundleSizeConfig() ), true );
foreach ( $bundleSizeConfig as $testCase ) {
$maxSize = $testCase['maxSize'];
$projectName = $testCase['projectName'] ?? '';
$moduleName = $testCase['resourceModule'];
if ( is_string( $maxSize ) ) {
if ( strpos( $maxSize, 'KB' ) !== false || strpos( $maxSize, 'kB' ) !== false ) {
$maxSize = (float)str_replace( [ 'KB', 'kB', ' KB', ' kB' ], '', $maxSize );
$maxSize = $maxSize * 1024;
} elseif ( strpos( $maxSize, 'B' ) !== false ) {
$maxSize = (float)str_replace( [ ' B', 'B' ], '', $maxSize );
}
}
$resourceLoader = MediaWikiServices::getInstance()->getResourceLoader();
$request = new FauxRequest(
[
'lang' => 'en',
'modules' => $moduleName,
'skin' => MediaWikiServices::getInstance()->getMainConfig()->get( 'DefaultSkin' )
]
);
$context = new ResourceLoaderContext( $resourceLoader, $request );
$module = $resourceLoader->getModule( $moduleName );
$contentContext = new DerivativeResourceLoaderContext( $context );
$contentContext->setOnly(
$module->getType() === ResourceLoaderModule::LOAD_STYLES
? ResourceLoaderModule::TYPE_STYLES
: ResourceLoaderModule::TYPE_COMBINED
);
$content = $resourceLoader->makeModuleResponse( $context, [ $moduleName => $module ] );
$contentTransferSize = strlen( gzencode( $content, 9 ) );
$message = $projectName ?
"$projectName: $moduleName is less than $maxSize" :
"$moduleName is less than $maxSize";
$this->assertLessThan( $maxSize, $contentTransferSize, $message );
}
}
/**
* @return string Path to bundlesize.config.json
*/
abstract public function getBundleSizeConfig(): string;
}