mediawiki-extensions-Cite/tests/phpunit/unit/ErrorReporterTest.php
thiemowmde 802b495160 Make it possible to disable the "cite_error" wrapper message
… as well as "cite_warning". Both are extremely trivial and don't
really do anything by default. All they do is to add the prefix
"Cite error:" or "Cite warning:" to all error messages.

This patch will make it possible to disable both messages by
default, i.e. replace their default in en.json with "-" without
breaking anything. That's part of the plan outlined in T353695.
Local on-wiki overrides will continue to work.

Bug: T353695
Change-Id: I374800d0d0b837cd17ed3a1fdde20b70325b06de
2024-02-01 17:36:27 +01:00

112 lines
3.8 KiB
PHP

<?php
namespace Cite\Tests\Unit;
use Cite\ErrorReporter;
use Cite\ReferenceMessageLocalizer;
use Language;
use Message;
use Parser;
use ParserOptions;
/**
* @covers \Cite\ErrorReporter
* @license GPL-2.0-or-later
*/
class ErrorReporterTest extends \MediaWikiUnitTestCase {
/**
* @dataProvider provideErrors
*/
public function testPlain(
string $key,
string $expectedHtml,
?string $expectedCategory
) {
$language = $this->createLanguage();
$reporter = $this->createReporter( $language );
$mockParser = $this->createParser( $language, $expectedCategory );
$this->assertSame(
$expectedHtml,
$reporter->plain( $mockParser, $key, 'first param' ) );
}
public function testDisabledWrapperMessages() {
$language = $this->createLanguage();
$reporter = $this->createReporter( $language, true );
$mockParser = $this->createParser( $language );
$this->assertSame(
'<span class="warning mw-ext-cite-warning mw-ext-cite-warning-a" lang="qqx" ' .
'dir="rtl">(cite_warning_a)</span>',
$reporter->plain( $mockParser, 'cite_warning_a' )
);
}
public function testHalfParsed() {
$language = $this->createLanguage();
$reporter = $this->createReporter( $language );
$mockParser = $this->createParser( $language );
$this->assertSame(
'<span class="warning mw-ext-cite-warning mw-ext-cite-warning-example" lang="qqx" ' .
'dir="rtl">[(cite_warning|(cite_warning_example|first param))]</span>',
$reporter->halfParsed( $mockParser, 'cite_warning_example', 'first param' ) );
}
public static function provideErrors() {
return [
'Example error' => [
'key' => 'cite_error_example',
'expectedHtml' => '<span class="error mw-ext-cite-error" lang="qqx" dir="rtl">' .
'(cite_error|(cite_error_example|first param))</span>',
'expectedCategory' => 'cite-tracking-category-cite-error',
],
'Warning error' => [
'key' => 'cite_warning_example',
'expectedHtml' => '<span class="warning mw-ext-cite-warning mw-ext-cite-warning-example" lang="qqx" ' .
'dir="rtl">(cite_warning|(cite_warning_example|first param))</span>',
'expectedCategory' => null,
],
];
}
private function createLanguage(): Language {
$language = $this->createNoOpMock( Language::class, [ 'getDir', 'getHtmlCode' ] );
$language->method( 'getDir' )->willReturn( 'rtl' );
$language->method( 'getHtmlCode' )->willReturn( 'qqx' );
return $language;
}
private function createReporter( Language $language, bool $disabled = false ): ErrorReporter {
$mockMessageLocalizer = $this->createMock( ReferenceMessageLocalizer::class );
$mockMessageLocalizer->method( 'msg' )->willReturnCallback(
function ( ...$args ) use ( $language, $disabled ) {
$message = $this->createMock( Message::class );
$message->method( 'isDisabled' )->willReturn( $disabled );
$message->method( 'getKey' )->willReturn( $args[0] );
$message->method( 'plain' )->willReturn( '(' . implode( '|', $args ) . ')' );
$message->method( 'inLanguage' )->with( $language )->willReturnSelf();
$message->method( 'getLanguage' )->willReturn( $language );
return $message;
}
);
return new ErrorReporter( $mockMessageLocalizer );
}
private function createParser( Language $language, string $expectedCategory = null ): Parser {
$parserOptions = $this->createMock( ParserOptions::class );
$parserOptions->method( 'getUserLangObj' )->willReturn( $language );
$parser = $this->createNoOpMock( Parser::class, [ 'addTrackingCategory', 'getOptions', 'recursiveTagParse' ] );
$parser->expects( $expectedCategory ? $this->once() : $this->never() )
->method( 'addTrackingCategory' )
->with( $expectedCategory );
$parser->method( 'getOptions' )->willReturn( $parserOptions );
$parser->method( 'recursiveTagParse' )->willReturnCallback(
static fn ( $content ) => '[' . $content . ']'
);
return $parser;
}
}