wiki.techinc.nl/tests/phpunit/unit/includes/utils/UrlUtilsTest.php
Timo Tijhof b862174dc0 UrlUtils: Make assemble() and removeDotSegments() stateless
Follows-up 472a914c63 (I706ef8a50aafb51), which moved various
functions here en-mass, but these two don't require any state.

The warnings about parse_url() in UrlUtils.php have been obsolete
since about PHP 5.4, when it started to support protocol-relative
URLs, non-slash protocols like "mailto", and deal with spaces/newlines
correctly (https://3v4l.org/YWUkl).

Rather than complicate many components that would otherwise remain
stateless and unit-testable, fix these to once again be the static
functions they were.

For impact, see upto PS17 of change I5117eab95f57297eb02bed.

Bug: T227900
Change-Id: Ifb3f720fc429b107348644c98eb9cd8e1113a42a
2023-08-10 03:39:42 +01:00

146 lines
4.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
use MediaWiki\Utils\UrlUtils;
/**
* @coversDefaultClass \MediaWiki\Utils\UrlUtils
* @covers ::__construct
*/
class UrlUtilsTest extends MediaWikiUnitTestCase {
public function testConstructError(): void {
$this->expectException( InvalidArgumentException::class );
$this->expectExceptionMessage( 'Unrecognized option "unrecognized"' );
new UrlUtils( [ 'unrecognized' => true ] );
}
/**
* @covers ::expand
* @dataProvider UrlUtilsProviders::provideExpandException
* @param array $options
* @param string|int|null $defaultProto
* @param string $expectedClass Expected class of exception
* @param string $expectedMsg Expected exception message
*/
public function testExpandException(
array $options, $defaultProto, string $expectedClass, string $expectedMsg
): void {
$this->expectException( $expectedClass );
$this->expectExceptionMessage( $expectedMsg );
$urlUtils = new UrlUtils( $options );
$urlUtils->expand( '/', $defaultProto );
}
/**
* @covers ::expand
* @dataProvider UrlUtilsProviders::provideExpand
* @param string $input
* @param array $options
* @param string|int|null $defaultProto
* @param ?string $expected
*/
public function testExpand(
string $input, array $options, $defaultProto, ?string $expected
): void {
$urlUtils = new UrlUtils( $options );
$this->assertSame( $expected, $urlUtils->expand( $input, $defaultProto ) );
}
/**
* @covers ::getServer
* @dataProvider UrlUtilsProviders::provideGetServer
* @param array $options
* @param string|int|null $defaultProto
* @param string $expected
*/
public function testGetServer( array $options, $defaultProto, string $expected ): void {
$urlUtils = new UrlUtils( $options );
$this->assertSame( $expected, $urlUtils->getServer( $defaultProto ) );
}
/**
* @covers ::assemble
* @dataProvider UrlUtilsProviders::provideAssemble
* @param array $bits
* @param string $expected
*/
public function testAssemble( array $bits, string $expected ): void {
$this->assertSame( $expected, UrlUtils::assemble( $bits ) );
}
/**
* @covers ::removeDotSegments
* @dataProvider UrlUtilsProviders::provideRemoveDotSegments
* @param string $input
* @param string $expected
*/
public function testRemoveDotSegments( string $input, string $expected ): void {
$this->assertSame( $expected, UrlUtils::removeDotSegments( $input ) );
}
/**
* @covers ::validProtocols
* @covers ::validAbsoluteProtocols
* @covers ::validProtocolsInternal
* @dataProvider UrlUtilsProviders::provideValidProtocols
* @param string $method 'validProtocols' or 'validAbsoluteProtocols'
* @param array|string $validProtocols Value of option passed to UrlUtils
* @param string $expected
*/
public function testValidProtocols( string $method, $validProtocols, string $expected ): void {
if ( !is_array( $validProtocols ) ) {
$this->expectDeprecationAndContinue(
'/Use of \$wgUrlProtocols that is not an array was deprecated in MediaWiki 1\.39/' );
}
$urlUtils = new UrlUtils( [ UrlUtils::VALID_PROTOCOLS => $validProtocols ] );
$this->assertSame( $expected, $urlUtils->$method() );
}
/**
* @covers ::parse
* @dataProvider UrlUtilsProviders::provideParse
* @param string $url
* @param ?array $expected
*/
public function testParse( string $url, ?array $expected ): void {
$urlUtils = new UrlUtils( [ UrlUtils::VALID_PROTOCOLS => [
'//',
'http://',
'https://',
'file://',
'mailto:',
] ] );
$actual = $urlUtils->parse( $url );
if ( $expected ) {
ksort( $expected );
}
if ( $actual ) {
ksort( $actual );
}
$this->assertSame( $expected, $actual );
}
/**
* @covers ::expandIRI
*/
public function testExpandIRI(): void {
$this->assertSame( "https://te.wikibooks.org/wiki/ఉబుటు_వాడుకరి_మార్గదర్శని",
( new UrlUtils )->expandIRI( "https://te.wikibooks.org/wiki/"
. "%E0%B0%89%E0%B0%AC%E0%B1%81%E0%B0%82%E0%B0%9F%E0%B1%81_"
. "%E0%B0%B5%E0%B0%BE%E0%B0%A1%E0%B1%81%E0%B0%95%E0%B0%B0%E0%B0%BF_"
. "%E0%B0%AE%E0%B0%BE%E0%B0%B0%E0%B1%8D%E0%B0%97%E0%B0%A6%E0%B0%B0"
. "%E0%B1%8D%E0%B0%B6%E0%B0%A8%E0%B0%BF" ) );
}
/**
* @covers ::matchesDomainList
* @dataProvider UrlUtilsProviders::provideMatchesDomainList
* @param string $url
* @param array $domains
* @param bool $expected
*/
public function testMatchesDomainList( string $url, array $domains, bool $expected ): void {
$this->assertSame( $expected, ( new UrlUtils )->matchesDomainList( $url, $domains ) );
}
}