Remove hard deprecation of PasswordPolicyChecks::checkPopularPasswordBlacklist
[lhc/web/wiklou.git] / tests / phpunit / includes / MultiHttpClientTest.php
1 <?php
2
3 /**
4 * The urls herein are not actually called, because we mock the return results.
5 *
6 * @covers MultiHttpClient
7 */
8 class MultiHttpClientTest extends MediaWikiTestCase {
9 protected $client;
10
11 protected function setUp() {
12 parent::setUp();
13 $client = $this->getMockBuilder( MultiHttpClient::class )
14 ->setConstructorArgs( [ [] ] )
15 ->setMethods( [ 'isCurlEnabled' ] )->getMock();
16 $client->method( 'isCurlEnabled' )->willReturn( false );
17 $this->client = $client;
18 }
19
20 private function getHttpRequest( $statusValue, $statusCode, $headers = [] ) {
21 $httpRequest = $this->getMockBuilder( PhpHttpRequest::class )
22 ->setConstructorArgs( [ '', [] ] )
23 ->getMock();
24 $httpRequest->expects( $this->any() )
25 ->method( 'execute' )
26 ->willReturn( Status::wrap( $statusValue ) );
27 $httpRequest->expects( $this->any() )
28 ->method( 'getResponseHeaders' )
29 ->willReturn( $headers );
30 $httpRequest->expects( $this->any() )
31 ->method( 'getStatus' )
32 ->willReturn( $statusCode );
33 return $httpRequest;
34 }
35
36 private function mockHttpRequestFactory( $httpRequest ) {
37 $factory = $this->getMockBuilder( MediaWiki\Http\HttpRequestFactory::class )
38 ->getMock();
39 $factory->expects( $this->any() )
40 ->method( 'create' )
41 ->willReturn( $httpRequest );
42 return $factory;
43 }
44
45 /**
46 * Test call of a single url that should succeed
47 */
48 public function testMultiHttpClientSingleSuccess() {
49 // Mock success
50 $httpRequest = $this->getHttpRequest( StatusValue::newGood( 200 ), 200 );
51 $this->setService( 'HttpRequestFactory', $this->mockHttpRequestFactory( $httpRequest ) );
52
53 list( $rcode, $rdesc, /* $rhdrs */, $rbody, $rerr ) = $this->client->run( [
54 'method' => 'GET',
55 'url' => "http://example.test",
56 ] );
57
58 $this->assertEquals( 200, $rcode );
59 }
60
61 /**
62 * Test call of a single url that should not exist, and therefore fail
63 */
64 public function testMultiHttpClientSingleFailure() {
65 // Mock an invalid tld
66 $httpRequest = $this->getHttpRequest(
67 StatusValue::newFatal( 'http-invalid-url', 'http://www.example.test' ), 0 );
68 $this->setService( 'HttpRequestFactory', $this->mockHttpRequestFactory( $httpRequest ) );
69
70 list( $rcode, $rdesc, /* $rhdrs */, $rbody, $rerr ) = $this->client->run( [
71 'method' => 'GET',
72 'url' => "http://www.example.test",
73 ] );
74
75 $failure = $rcode < 200 || $rcode >= 400;
76 $this->assertTrue( $failure );
77 }
78
79 /**
80 * Test call of multiple urls that should all succeed
81 */
82 public function testMultiHttpClientMultipleSuccess() {
83 // Mock success
84 $httpRequest = $this->getHttpRequest( StatusValue::newGood( 200 ), 200 );
85 $this->setService( 'HttpRequestFactory', $this->mockHttpRequestFactory( $httpRequest ) );
86
87 $reqs = [
88 [
89 'method' => 'GET',
90 'url' => 'http://example.test',
91 ],
92 [
93 'method' => 'GET',
94 'url' => 'https://get.test',
95 ],
96 ];
97 $responses = $this->client->runMulti( $reqs );
98 foreach ( $responses as $response ) {
99 list( $rcode, $rdesc, /* $rhdrs */, $rbody, $rerr ) = $response['response'];
100 $this->assertEquals( 200, $rcode );
101 }
102 }
103
104 /**
105 * Test call of multiple urls that should all fail
106 */
107 public function testMultiHttpClientMultipleFailure() {
108 // Mock page not found
109 $httpRequest = $this->getHttpRequest(
110 StatusValue::newFatal( "http-bad-status", 404, 'Not Found' ), 404 );
111 $this->setService( 'HttpRequestFactory', $this->mockHttpRequestFactory( $httpRequest ) );
112
113 $reqs = [
114 [
115 'method' => 'GET',
116 'url' => 'http://example.test/12345',
117 ],
118 [
119 'method' => 'GET',
120 'url' => 'http://example.test/67890' ,
121 ]
122 ];
123 $responses = $this->client->runMulti( $reqs );
124 foreach ( $responses as $response ) {
125 list( $rcode, $rdesc, /* $rhdrs */, $rbody, $rerr ) = $response['response'];
126 $failure = $rcode < 200 || $rcode >= 400;
127 $this->assertTrue( $failure );
128 }
129 }
130
131 /**
132 * Test of response header handling
133 */
134 public function testMultiHttpClientHeaders() {
135 // Represenative headers for typical requests, per MWHttpRequest::getResponseHeaders()
136 $headers = [
137 'content-type' => [
138 'text/html; charset=utf-8',
139 ],
140 'date' => [
141 'Wed, 18 Jul 2018 14:52:41 GMT',
142 ],
143 'set-cookie' => [
144 'COUNTRY=NAe6; expires=Wed, 25-Jul-2018 14:52:41 GMT; path=/; domain=.example.test',
145 'LAST_NEWS=1531925562; expires=Thu, 18-Jul-2019 14:52:41 GMT; path=/; domain=.example.test',
146 ]
147 ];
148
149 // Mock success with specific headers
150 $httpRequest = $this->getHttpRequest( StatusValue::newGood( 200 ), 200, $headers );
151 $this->setService( 'HttpRequestFactory', $this->mockHttpRequestFactory( $httpRequest ) );
152
153 list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->client->run( [
154 'method' => 'GET',
155 'url' => 'http://example.test',
156 ] );
157
158 $this->assertEquals( 200, $rcode );
159 $this->assertEquals( count( $headers ), count( $rhdrs ) );
160 foreach ( $headers as $name => $values ) {
161 $value = implode( ', ', $values );
162 $this->assertArrayHasKey( $name, $rhdrs );
163 $this->assertEquals( $value, $rhdrs[$name] );
164 }
165 }
166 }