wiki.techinc.nl/tests/phpunit/includes/ResourceLoader/CodexModuleTest.php
Anne Tomasevich c8117c78ca CodexModule: Throw exception for non-entry points
If a generated chunk is listed in the codexComponents array,
an exception will be thrown informing the developer that the
item is not an export of Codex and cannot be required.

Text fixtures and expected values were updated to match
recent changes to the manifest that made composables
explict entries.

Bug: T353191
Change-Id: Ie3e35501993b1ad5d29ebecbcc8203e7f4ea8c81
2024-01-17 12:29:47 -05:00

105 lines
3.1 KiB
PHP

<?php
namespace MediaWiki\Tests\ResourceLoader;
use MediaWiki\ResourceLoader\CodexModule;
use ResourceLoaderTestCase;
/**
* @group ResourceLoader
* @covers \MediaWiki\ResourceLoader\CodexModule
*/
class CodexModuleTest extends ResourceLoaderTestCase {
public static function provideModuleConfig() {
return [
[ 'Codex subset',
[
'codexComponents' => [ 'CdxButton', 'CdxMessage', 'useModelWrapper' ],
'codexStyleOnly' => false,
'codexScriptOnly' => false
],
[
'packageFiles' => [
'codex.js',
'_codex/constants.js',
'_codex/useSlotContents2.js',
'_codex/useWarnOnce.js',
'_codex/useIconOnlyButton.js',
'_codex/_plugin-vue_export-helper.js',
'_codex/CdxButton.js',
'_codex/useComputedDirection.js',
'_codex/useComputedLanguage.js',
'_codex/Icon.js',
'_codex/CdxMessage.js',
'_codex/useModelWrapper.js'
],
'styles' => [ 'CdxButton.css', 'CdxIcon.css', 'CdxMessage.css' ]
]
],
[ 'Codex subset, style only',
[
'codexComponents' => [ 'CdxButton', 'CdxMessage' ],
'codexStyleOnly' => true,
'codexScriptOnly' => false
],
[
'packageFiles' => [],
'styles' => [ 'CdxButton.css', 'CdxIcon.css', 'CdxMessage.css' ]
]
],
[ 'Codex subset, script only',
[
'codexComponents' => [ 'CdxButton', 'CdxMessage', 'useModelWrapper' ],
'codexStyleOnly' => false,
'codexScriptOnly' => true
],
[
'packageFiles' => [
'codex.js',
'_codex/constants.js',
'_codex/useSlotContents2.js',
'_codex/useWarnOnce.js',
'_codex/useIconOnlyButton.js',
'_codex/_plugin-vue_export-helper.js',
'_codex/CdxButton.js',
'_codex/useComputedDirection.js',
'_codex/useComputedLanguage.js',
'_codex/Icon.js',
'_codex/CdxMessage.js',
'_codex/useModelWrapper.js'
],
'styles' => []
]
]
];
}
/**
* @dataProvider provideModuleConfig
*/
public function testCodexSubset( $testCase, $moduleDefinition, $expected ) {
$testModule = new class( $moduleDefinition ) extends CodexModule {
public const CODEX_MODULE_DIR = 'tests/phpunit/data/resourceloader/codexModules/';
};
$context = $this->getResourceLoaderContext();
$config = $context->getResourceLoader()->getConfig();
$testModule->setConfig( $config );
$packageFiles = $testModule->getPackageFiles( $context );
// Style-only module will not have any packageFiles.
$packageFilenames = isset( $packageFiles ) ? array_keys( $packageFiles[ 'files' ] ) : [];
$this->assertEquals( $expected[ 'packageFiles' ], $packageFilenames, 'Correct packageFiles added for ' . $testCase );
$styleFiles = $testModule->getStyleFiles( $context );
// Script-only module will not have any styleFiles.
$styleFilenames = [];
if ( count( $styleFiles ) > 0 ) {
$styleFilenames = array_map( static function ( $filepath ) use ( $testModule ) {
return str_replace( $testModule::CODEX_MODULE_DIR, '', $filepath->getPath() );
}, $styleFiles[ 'all' ] );
}
$this->assertEquals( $expected[ 'styles' ], $styleFilenames, 'Correct styleFiles added for ' . $testCase );
}
}