1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
<?php
use MediaWiki\Context\RequestContext;
use MediaWiki\MainConfigNames;
use MediaWiki\Output\OutputPage;
use MediaWiki\Request\ContentSecurityPolicy;
use MediaWiki\Title\Title;
use PHPUnit\Framework\MockObject\MockObject;
/**
* @covers \SkinMustache
* @group Skin
* @group Database
*/
class SkinMustacheTest extends MediaWikiIntegrationTestCase {
/**
* @param string $html
* @param Title $title
* @return MockObject|OutputPage
*/
private function getMockOutputPage( $html, $title ) {
$mockContentSecurityPolicy = $this->createMock( ContentSecurityPolicy::class );
$mock = $this->createMock( OutputPage::class );
$mock->method( 'getHTML' )
->willReturn( $html );
$mock->method( 'getCategoryLinks' )
->willReturn( [] );
$mock->method( 'getIndicators' )
->willReturn( [
'id' => '<a>indicator</a>'
] );
$mock->method( 'getTitle' )
->willReturn( $title );
$mock->method( 'getIndicators' )
->willReturn( [ '' ] );
$mock->method( 'getLanguageLinks' )
->willReturn( [] );
$mock->method( 'isTOCEnabled' )
->willReturn( true );
$mock->method( 'getTOCData' )
->willReturn( null );
return $mock;
}
private function validateTemplateData( $data, $key ) {
$value = $data[$key];
if ( $value === null ) {
// Cannot validate a null value
return;
} elseif ( is_array( $value ) ) {
$this->assertTrue(
str_starts_with( $key, 'data-' ) || str_starts_with( $key, 'array-' ),
"Template data that is an object should be associated with a key" .
" prefixed with `data-` or `array-` ($key)"
);
// Validate the children
foreach ( $value as $childKey => $childValue ) {
if ( is_string( $childKey ) ) {
$this->validateTemplateData( $value, $childKey );
} else {
$this->assertStringStartsWith(
'array-',
$key,
"Template data that is a flat array should be associated with a key prefixed `array-` ($key)"
);
}
}
} elseif ( is_string( $value ) ) {
if ( str_contains( $value, '<' ) ) {
$this->assertTrue(
str_starts_with( $key, 'html-' ) || $key === 'html',
"Template data containing HTML must be prefixed with `html-` ($key)"
);
}
} elseif ( is_bool( $value ) ) {
$this->assertTrue(
str_starts_with( $key, 'is-' ) || str_starts_with( $key, 'has-' ),
"Template data containing booleans must be prefixed with `is-` or `has-` ($key)"
);
} elseif ( is_numeric( $value ) ) {
$this->assertTrue(
str_starts_with( $key, 'number-' ),
"Template data containing numbers must be prefixed with `number-` ($key)"
);
} else {
$this->fail(
"Keys must be primitives e.g. arrays OR strings OR bools OR null ($key)."
);
}
}
/**
* @covers \Skin
* @covers \MediaWiki\Skin\SkinComponentLogo
* @covers \MediaWiki\Skin\SkinComponentSearch
* @covers \MediaWiki\Skin\SkinComponentTableOfContents
* @covers \MediaWiki\Skin\SkinComponentFooter
*/
public function testGetTemplateData() {
$config = $this->getServiceContainer()->getMainConfig();
$bodytext = '<p>hello</p>';
$context = new RequestContext();
$title = Title::makeTitle( NS_MAIN, 'Mustache skin' );
$context->setTitle( $title );
$out = $this->getMockOutputPage( $bodytext, $title );
$context->setOutput( $out );
$this->overrideConfigValue( MainConfigNames::Logos, [] );
$skin = new SkinMustache( [
'name' => 'test',
'templateDirectory' => __DIR__,
] );
$context->setConfig( $config );
$skin->setContext( $context );
$data = $skin->getTemplateData();
// Validate the default template data respects the naming rules
foreach ( $data as $key => $_ ) {
$this->validateTemplateData( $data, $key );
}
// Validate search data
$searchData = $data['data-search-box'];
foreach ( $searchData as $key => $_ ) {
$this->validateTemplateData( $searchData, $key );
}
}
}
|