wiki.techinc.nl/tests/phpunit/unit/includes/CommentFormatter/RevisionCommentBatchTest.php
Tim Starling f7f84dddb3 Introduce CommentFormatter
CommentParser:

* Move comment formatting backend from Linker to a CommentParser service.
  Allow link existence and file existence to be batched.
* Rename $local to $samePage since I think that is clearer.
* Rename $title to $selfLinkTarget since it was unclear what the title
  was used for.
* Rename the "autocomment" concept to "section link" in public
  interfaces, although the old term remains in CSS classes.
* Keep unsafe HTML pass-through in separate "unsafe" methods, for easier
  static analysis and code review.

CommentFormatter:

* Add CommentFormatter and RowCommentFormatter services as a usable
  frontend for comment batches, and to replace the Linker static methods.
* Provide fluent and parametric interfaces.

Linker:

* Remove Linker::makeCommentLink() without deprecation -- nothing calls
  it and it is obviously an internal helper.
* Soft-deprecate Linker methods formatComment(), formatLinksInComment(),
  commentBlock() and revComment().

Caller migration:

* CommentFormatter single: Linker, RollbackAction, ApiComparePages,
  ApiParse
* CommentFormatter parametric batch: ImageHistoryPseudoPager
* CommentFormatter fluent batch: ApiQueryFilearchive
* RowCommentFormatter sequential: History feed, BlocklistPager,
  ProtectedPagesPager, ApiQueryProtectedTitles
* RowCommentFormatter with index: ChangesFeed, ChangesList,
  ApiQueryDeletedrevs, ApiQueryLogEvents, ApiQueryRecentChanges
* RevisionCommentBatch: HistoryPager, ContribsPager

Bug: T285917
Change-Id: Ia3fd50a4a13138ba5003d884962da24746d562d0
2021-09-28 11:13:03 -07:00

135 lines
3.1 KiB
PHP

<?php
namespace MediaWiki\Tests\Unit\CommentFormatter;
use ArrayIterator;
use MediaWiki\CommentFormatter\CommentFormatter;
use MediaWiki\CommentFormatter\RevisionCommentBatch;
use MediaWiki\Permissions\Authority;
use MediaWiki\Permissions\SimpleAuthority;
use MediaWiki\User\UserIdentityValue;
use MediaWikiUnitTestCase;
/**
* Trivial unit test with the universe mocked.
*
* @covers \MediaWiki\CommentFormatter\RevisionCommentBatch
*/
class RevisionCommentBatchTest extends MediaWikiUnitTestCase {
private function getFormatter( $callback ) {
return new class( $callback ) extends CommentFormatter {
private $callback;
public function __construct( $callback ) {
$this->callback = $callback;
}
public function formatRevisions(
$revisions, Authority $authority, $samePage = false, $isPublic = false,
$useParentheses = true, $indexById = false
) {
( $this->callback )( get_defined_vars() );
}
};
}
private function newBatch( $callback ) {
return new RevisionCommentBatch(
$this->getFormatter( $callback )
);
}
private function getAuthority() {
return new SimpleAuthority(
new UserIdentityValue( 1, 'Sysop' ),
[]
);
}
public function testAuthority() {
$authority = $this->getAuthority();
$batch = $this->newBatch(
function ( $params ) use ( $authority ) {
$this->assertSame( $authority, $params['authority'] );
}
);
$batch->authority( $authority )->execute();
}
public function testNoAuthority() {
$this->expectException( \TypeError::class );
$batch = $this->newBatch(
static function ( $params ) {
}
);
$batch
->revisions( [] )
->execute();
}
public function testRevisions() {
$revisions = new ArrayIterator( [] );
$batch = $this->newBatch(
function ( $params ) use ( $revisions ) {
$this->assertSame( $revisions, $params['revisions'] );
// Check default booleans while we have them
$this->assertFalse( $params['samePage'] );
$this->assertFalse( $params['isPublic'] );
$this->assertFalse( $params['useParentheses'] );
$this->assertFalse( $params['indexById'] );
}
);
$batch
->authority( $this->getAuthority() )
->revisions( $revisions )
->execute();
}
public function testSamePage() {
$batch = $this->newBatch(
function ( $params ) {
$this->assertTrue( $params['samePage'] );
}
);
$batch
->authority( $this->getAuthority() )
->samePage()
->execute();
}
public function testUseParentheses() {
$batch = $this->newBatch(
function ( $params ) {
$this->assertTrue( $params['useParentheses'] );
}
);
$batch
->authority( $this->getAuthority() )
->useParentheses()
->execute();
}
public function hideIfPrivate() {
$batch = $this->newBatch(
function ( $params ) {
$this->assertTrue( $params['isPublic'] );
}
);
$batch
->authority( $this->getAuthority() )
->hideIfDeleted()
->execute();
}
public function indexById() {
$batch = $this->newBatch(
function ( $params ) {
$this->assertTrue( $params['indexById'] );
}
);
$batch
->authority( $this->getAuthority() )
->indexById()
->execute();
}
}