wiki.techinc.nl/tests/phpunit/unit/includes/http/GuzzleHttpRequestTest.php
Máté Szabó 0a2b996278 Separate MediaWiki unit and integration tests
This changeset implements T89432 and related tickets and is based on exploration
done at the Prague Hackathon. The goal is to identify tests in MediaWiki core
that can be run without having to install & configure MediaWiki and its dependencies,
and provide a way to execute these tests via the standard phpunit entry point,
allowing for faster development and integration with existing tooling like IDEs.

The initial set of tests that met these criteria were identified using the work Amir did in
I88822667693d9e00ac3d4639c87bc24e5083e5e8. These tests were then moved into a new subdirectory
under phpunit/ and organized into a separate test suite. The environment for this suite
is set up via a PHPUnit bootstrap file without a custom entry point.

You can execute these tests by running:
$ vendor/bin/phpunit -d memory_limit=512M -c tests/phpunit/unit-tests.xml

Bug: T89432
Bug: T87781
Bug: T84948
Change-Id: Iad01033a0548afd4d2a6f2c1ef6fcc9debf72c0d
2019-06-13 22:56:31 +02:00

151 lines
4.6 KiB
PHP

<?php
use GuzzleHttp\Handler\MockHandler;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Psr7\Response;
use GuzzleHttp\Psr7\Request;
/**
* class for tests of GuzzleHttpRequest
*
* No actual requests are made herein - all external communications are mocked
*
* @covers GuzzleHttpRequest
* @covers MWHttpRequest
*/
class GuzzleHttpRequestTest extends \MediaWikiUnitTestCase {
/**
* Placeholder url to use for various tests. This is never contacted, but we must use
* a url of valid format to avoid validation errors.
* @var string
*/
protected $exampleUrl = 'http://www.example.test';
/**
* Minimal example body text
* @var string
*/
protected $exampleBodyText = 'x';
/**
* For accumulating callback data for testing
* @var string
*/
protected $bodyTextReceived = '';
/**
* Callback: process a chunk of the result of a HTTP request
*
* @param mixed $req
* @param string $buffer
* @return int Number of bytes handled
*/
public function processHttpDataChunk( $req, $buffer ) {
$this->bodyTextReceived .= $buffer;
return strlen( $buffer );
}
public function testSuccess() {
$handler = HandlerStack::create( new MockHandler( [ new Response( 200, [
'status' => 200,
], $this->exampleBodyText ) ] ) );
$r = new GuzzleHttpRequest( $this->exampleUrl, [ 'handler' => $handler ] );
$r->execute();
$this->assertEquals( 200, $r->getStatus() );
$this->assertEquals( $this->exampleBodyText, $r->getContent() );
}
public function testSuccessConstructorCallback() {
$this->bodyTextReceived = '';
$handler = HandlerStack::create( new MockHandler( [ new Response( 200, [
'status' => 200,
], $this->exampleBodyText ) ] ) );
$r = new GuzzleHttpRequest( $this->exampleUrl, [
'callback' => [ $this, 'processHttpDataChunk' ],
'handler' => $handler,
] );
$r->execute();
$this->assertEquals( 200, $r->getStatus() );
$this->assertEquals( $this->exampleBodyText, $this->bodyTextReceived );
}
public function testSuccessSetCallback() {
$this->bodyTextReceived = '';
$handler = HandlerStack::create( new MockHandler( [ new Response( 200, [
'status' => 200,
], $this->exampleBodyText ) ] ) );
$r = new GuzzleHttpRequest( $this->exampleUrl, [
'handler' => $handler,
] );
$r->setCallback( [ $this, 'processHttpDataChunk' ] );
$r->execute();
$this->assertEquals( 200, $r->getStatus() );
$this->assertEquals( $this->exampleBodyText, $this->bodyTextReceived );
}
/**
* use a callback stream to pipe the mocked response data to our callback function
*/
public function testSuccessSink() {
$this->bodyTextReceived = '';
$handler = HandlerStack::create( new MockHandler( [ new Response( 200, [
'status' => 200,
], $this->exampleBodyText ) ] ) );
$r = new GuzzleHttpRequest( $this->exampleUrl, [
'handler' => $handler,
'sink' => new MWCallbackStream( [ $this, 'processHttpDataChunk' ] ),
] );
$r->execute();
$this->assertEquals( 200, $r->getStatus() );
$this->assertEquals( $this->exampleBodyText, $this->bodyTextReceived );
}
public function testBadUrl() {
$r = new GuzzleHttpRequest( '' );
$s = $r->execute();
$errorMsg = $s->getErrorsByType( 'error' )[0]['message'];
$this->assertEquals( 0, $r->getStatus() );
$this->assertEquals( 'http-invalid-url', $errorMsg );
}
public function testConnectException() {
$handler = HandlerStack::create( new MockHandler( [ new GuzzleHttp\Exception\ConnectException(
'Mock Connection Exception', new Request( 'GET', $this->exampleUrl )
) ] ) );
$r = new GuzzleHttpRequest( $this->exampleUrl, [ 'handler' => $handler ] );
$s = $r->execute();
$errorMsg = $s->getErrorsByType( 'error' )[0]['message'];
$this->assertEquals( 0, $r->getStatus() );
$this->assertEquals( 'http-request-error', $errorMsg );
}
public function testTimeout() {
$handler = HandlerStack::create( new MockHandler( [ new GuzzleHttp\Exception\RequestException(
'Connection timed out', new Request( 'GET', $this->exampleUrl )
) ] ) );
$r = new GuzzleHttpRequest( $this->exampleUrl, [ 'handler' => $handler ] );
$s = $r->execute();
$errorMsg = $s->getErrorsByType( 'error' )[0]['message'];
$this->assertEquals( 0, $r->getStatus() );
$this->assertEquals( 'http-timed-out', $errorMsg );
}
public function testNotFound() {
$handler = HandlerStack::create( new MockHandler( [ new Response( 404, [
'status' => '404',
] ) ] ) );
$r = new GuzzleHttpRequest( $this->exampleUrl, [ 'handler' => $handler ] );
$s = $r->execute();
$errorMsg = $s->getErrorsByType( 'error' )[0]['message'];
$this->assertEquals( 404, $r->getStatus() );
$this->assertEquals( 'http-bad-status', $errorMsg );
}
}