wiki.techinc.nl/tests/phpunit/integration/includes/MediaWikiEntryPointTest.php
Daimona Eaytoy 89f583625a tests: Add replacement for assertions deprecated in PHPUnit 9.6
expectWarning() and friends have been deprecated in PHPUnit 9.6, and
removed in PHPUnit 10. Unfortunately, there is no simple replacement
because PHPUnit no longer converts them to exceptions in the first
place. In fact, Sebastian Bergmann explicitly stated that he does not
consider the use case of

> a library developer to verify a code block warns its consumer when
> certain action is performed

worth supporting.

So, add an ad-hoc replacement for all the deprecated methods. This is
quite ugly, but it's simple enough given the low number of usages.

On the bright side, this new method does not halt the test when the
warning is triggered. This seems to align with the developers'
expectation, seen in a few existing tests, that any code following the
notice will be executed.

Bug: T342110
Change-Id: I214abfed4280834840c115777ed78eb0a5570da9
2024-02-23 22:09:45 +01:00

82 lines
2.3 KiB
PHP

<?php
namespace MediaWiki\Tests;
use MediaWiki\MediaWikiEntryPoint;
use MediaWiki\MediaWikiServices;
use MediaWiki\Request\FauxRequest;
use MediaWikiIntegrationTestCase;
use RequestContext;
use Wikimedia\TestingAccessWrapper;
/**
* @covers \MediaWiki\MediaWikiEntryPoint
*/
class MediaWikiEntryPointTest extends MediaWikiIntegrationTestCase {
private function newEntryPoint(): MediaWikiEntryPoint {
$context = new RequestContext();
$context->setRequest( new FauxRequest() );
$environment = new MockEnvironment();
$services = $this->createMock( MediaWikiServices::class );
$mw = $this->getMockBuilder( MediaWikiEntryPoint::class )
->onlyMethods( [ 'execute' ] )
->setConstructorArgs( [ $context, $environment, $services ] )
->getMockForAbstractClass();
return $mw;
}
/**
* Assert that we can create, flush, and access output buffers.
*
* Note that can't test the behaviour for non-removable buffers,
* because then we are stuck with a non-removable buffer,
* and PHPUnit will choke on it.
*
* We also can't test that content gets send to the client by calling
* flush(), since we can't mock that function, and we can't capture
* its output.
*/
public function testOutputBuffer() {
$oldLevel = ob_get_level();
$mw = TestingAccessWrapper::newFromObject( $this->newEntryPoint() );
$mw->enableOutputCapture();
$mw->startOutputBuffer();
$this->assertSame( 1, $mw->getOutputBufferLevel(), 'getOutputBufferLevel' );
print 'Testing test';
$this->assertSame( 12, $mw->getOutputBufferLength(), 'getOutputBufferLength' );
$mw->flushOutputBuffer();
$this->assertSame( $oldLevel, ob_get_level(), 'ob_get_level' );
$this->assertSame( 'Testing test', $mw->drainOutputBuffer() );
}
/**
* Check that flushOutputBuffer() will not try to send output
* when in post-send mode.
*/
public function testFlushOutputBuffers_sent() {
$mw = TestingAccessWrapper::newFromObject( $this->newEntryPoint() );
$mw->enableOutputCapture();
ob_start( null, 0, PHP_OUTPUT_HANDLER_STDFLAGS & ~PHP_OUTPUT_HANDLER_FLUSHABLE );
print 'Testing test';
$mw->enterPostSendMode();
$this->expectPHPError(
E_USER_NOTICE,
static function () use ( $mw ) {
$mw->flushOutputBuffer();
}
);
$this->assertSame( '', $mw->drainOutputBuffer() );
}
}