mediawiki-extensions-Discus.../tests/phpunit/ThreadItemStoreTest.php
Bartosz Dziewoński 66cac8523e ThreadItemStoreTest: Add test for old revisions of indistinguishable comments
Just to confirm that this works correctly, because I broke it a few
times in different ways while working on T321121.

In this scenario, discussiontools_item_revisions contains rows for
the oldest and newest revisions of pages containing each comment
distinguishable by name, as well as extra rows for the newest
revisions of comments indistinguishable by name, so that they can
be looked up by ID.

Change-Id: Ic8450a6b082ed343dd633d3a43c50696b5d6d2bb
2022-10-20 03:50:47 +02:00

106 lines
2.9 KiB
PHP

<?php
namespace MediaWiki\Extension\DiscussionTools\Tests;
use ImportStringSource;
use MediaWiki\MediaWikiServices;
use TestUser;
/**
* @group DiscussionTools
* @group Database
* @covers \MediaWiki\Extension\DiscussionTools\ThreadItemStore
*/
class ThreadItemStoreTest extends IntegrationTestCase {
/**
* @inheritDoc
*/
public function getCliArg( $offset ) {
// Work around MySQL bug (T256006)
if ( $offset === 'use-normal-tables' ) {
return true;
}
return parent::getCliArg( $offset );
}
/** @var @inheritDoc */
protected $tablesUsed = [
'user',
'page',
'revision',
'discussiontools_items',
'discussiontools_item_pages',
'discussiontools_item_revisions',
'discussiontools_item_ids',
];
/**
* @dataProvider provideInsertCases
*/
public function testInsertThreadItems( string $dir ): void {
// Create users for the imported revisions
new TestUser( 'X' );
new TestUser( 'Y' );
new TestUser( 'Z' );
// Import revisions
$source = new ImportStringSource( static::getText( "$dir/dump.xml" ) );
$importer = MediaWikiServices::getInstance()
->getWikiImporterFactory()
->getWikiImporter( $source );
// `true` means to assign edits to the users we created above
$importer->setUsernamePrefix( 'import', true );
$importer->doImport();
// Check that expected data has been stored in the database
$expected = [];
$actual = [];
$tables = [
'discussiontools_items' => [ 'it_id' ],
'discussiontools_item_pages' => [ 'itp_id' ],
// We reuse rows causing the primary key to be all out of order.
// Use a consistent ordering for the output here.
'discussiontools_item_revisions' => [ 'itr_revision_id', 'itr_items_id', 'itr_itemid_id' ],
'discussiontools_item_ids' => [ 'itid_id' ],
];
foreach ( $tables as $table => $order ) {
$expected[$table] = static::getJson( "../$dir/$table.json", true );
$res = wfGetDb( DB_REPLICA )->newSelectQueryBuilder()
->from( $table )
->field( '*' )
->caller( __METHOD__ )
->orderBy( $order )
->fetchResultSet();
foreach ( $res as $i => $row ) {
foreach ( $row as $key => $val ) {
$actual[$table][$i][$key] = $val;
}
}
}
// Optionally write updated content to the JSON files
if ( getenv( 'DISCUSSIONTOOLS_OVERWRITE_TESTS' ) ) {
foreach ( $tables as $table => $order ) {
static::overwriteJsonFile( "../$dir/$table.json", $actual[$table] );
}
}
static::assertEquals( $expected, $actual );
}
public function provideInsertCases(): array {
return [
[ 'cases/ThreadItemStore/1simple-example' ],
[ 'cases/ThreadItemStore/2archived-section' ],
[ 'cases/ThreadItemStore/3indistinguishable-comments' ],
[ 'cases/ThreadItemStore/4transcluded-section' ],
[ 'cases/ThreadItemStore/5changed-comment-indentation' ],
[ 'cases/ThreadItemStore/6changed-heading-level' ],
[ 'cases/ThreadItemStore/7identical-rev-timestamp' ],
[ 'cases/ThreadItemStore/8indistinguishable-comments-same-page' ],
];
}
}