summaryrefslogtreecommitdiff
path: root/www/wiki/tests/phpunit/includes/utils/MWRestrictionsTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/tests/phpunit/includes/utils/MWRestrictionsTest.php')
-rw-r--r--www/wiki/tests/phpunit/includes/utils/MWRestrictionsTest.php217
1 files changed, 217 insertions, 0 deletions
diff --git a/www/wiki/tests/phpunit/includes/utils/MWRestrictionsTest.php b/www/wiki/tests/phpunit/includes/utils/MWRestrictionsTest.php
new file mode 100644
index 00000000..abdfbb14
--- /dev/null
+++ b/www/wiki/tests/phpunit/includes/utils/MWRestrictionsTest.php
@@ -0,0 +1,217 @@
+<?php
+class MWRestrictionsTest extends PHPUnit\Framework\TestCase {
+
+ use MediaWikiCoversValidator;
+
+ protected static $restrictionsForChecks;
+
+ public static function setUpBeforeClass() {
+ self::$restrictionsForChecks = MWRestrictions::newFromArray( [
+ 'IPAddresses' => [
+ '10.0.0.0/8',
+ '172.16.0.0/12',
+ '2001:db8::/33',
+ ]
+ ] );
+ }
+
+ /**
+ * @covers MWRestrictions::newDefault
+ * @covers MWRestrictions::__construct
+ */
+ public function testNewDefault() {
+ $ret = MWRestrictions::newDefault();
+ $this->assertInstanceOf( MWRestrictions::class, $ret );
+ $this->assertSame(
+ '{"IPAddresses":["0.0.0.0/0","::/0"]}',
+ $ret->toJson()
+ );
+ }
+
+ /**
+ * @covers MWRestrictions::newFromArray
+ * @covers MWRestrictions::__construct
+ * @covers MWRestrictions::loadFromArray
+ * @covers MWRestrictions::toArray
+ * @dataProvider provideArray
+ * @param array $data
+ * @param bool|InvalidArgumentException $expect True if the call succeeds,
+ * otherwise the exception that should be thrown.
+ */
+ public function testArray( $data, $expect ) {
+ if ( $expect === true ) {
+ $ret = MWRestrictions::newFromArray( $data );
+ $this->assertInstanceOf( MWRestrictions::class, $ret );
+ $this->assertSame( $data, $ret->toArray() );
+ } else {
+ try {
+ MWRestrictions::newFromArray( $data );
+ $this->fail( 'Expected exception not thrown' );
+ } catch ( InvalidArgumentException $ex ) {
+ $this->assertEquals( $expect, $ex );
+ }
+ }
+ }
+
+ public static function provideArray() {
+ return [
+ [ [ 'IPAddresses' => [] ], true ],
+ [ [ 'IPAddresses' => [ '127.0.0.1/32' ] ], true ],
+ [
+ [ 'IPAddresses' => [ '256.0.0.1/32' ] ],
+ new InvalidArgumentException( 'Invalid IP address: 256.0.0.1/32' )
+ ],
+ [
+ [ 'IPAddresses' => '127.0.0.1/32' ],
+ new InvalidArgumentException( 'IPAddresses is not an array' )
+ ],
+ [
+ [],
+ new InvalidArgumentException( 'Array is missing required keys: IPAddresses' )
+ ],
+ [
+ [ 'foo' => 'bar', 'bar' => 42 ],
+ new InvalidArgumentException( 'Array contains invalid keys: foo, bar' )
+ ],
+ ];
+ }
+
+ /**
+ * @covers MWRestrictions::newFromJson
+ * @covers MWRestrictions::__construct
+ * @covers MWRestrictions::loadFromArray
+ * @covers MWRestrictions::toJson
+ * @covers MWRestrictions::__toString
+ * @dataProvider provideJson
+ * @param string $json
+ * @param array|InvalidArgumentException $expect
+ */
+ public function testJson( $json, $expect ) {
+ if ( is_array( $expect ) ) {
+ $ret = MWRestrictions::newFromJson( $json );
+ $this->assertInstanceOf( MWRestrictions::class, $ret );
+ $this->assertSame( $expect, $ret->toArray() );
+
+ $this->assertSame( $json, $ret->toJson( false ) );
+ $this->assertSame( $json, (string)$ret );
+
+ $this->assertSame(
+ FormatJson::encode( $expect, true, FormatJson::ALL_OK ),
+ $ret->toJson( true )
+ );
+ } else {
+ try {
+ MWRestrictions::newFromJson( $json );
+ $this->fail( 'Expected exception not thrown' );
+ } catch ( InvalidArgumentException $ex ) {
+ $this->assertTrue( true );
+ }
+ }
+ }
+
+ public static function provideJson() {
+ return [
+ [
+ '{"IPAddresses":[]}',
+ [ 'IPAddresses' => [] ]
+ ],
+ [
+ '{"IPAddresses":["127.0.0.1/32"]}',
+ [ 'IPAddresses' => [ '127.0.0.1/32' ] ]
+ ],
+ [
+ '{"IPAddresses":["256.0.0.1/32"]}',
+ new InvalidArgumentException( 'Invalid IP address: 256.0.0.1/32' )
+ ],
+ [
+ '{"IPAddresses":"127.0.0.1/32"}',
+ new InvalidArgumentException( 'IPAddresses is not an array' )
+ ],
+ [
+ '{}',
+ new InvalidArgumentException( 'Array is missing required keys: IPAddresses' )
+ ],
+ [
+ '{"foo":"bar","bar":42}',
+ new InvalidArgumentException( 'Array contains invalid keys: foo, bar' )
+ ],
+ [
+ '{"IPAddresses":[]',
+ new InvalidArgumentException( 'Invalid restrictions JSON' )
+ ],
+ [
+ '"IPAddresses"',
+ new InvalidArgumentException( 'Invalid restrictions JSON' )
+ ],
+ ];
+ }
+
+ /**
+ * @covers MWRestrictions::checkIP
+ * @dataProvider provideCheckIP
+ * @param string $ip
+ * @param bool $pass
+ */
+ public function testCheckIP( $ip, $pass ) {
+ $this->assertSame( $pass, self::$restrictionsForChecks->checkIP( $ip ) );
+ }
+
+ public static function provideCheckIP() {
+ return [
+ [ '10.0.0.1', true ],
+ [ '172.16.0.0', true ],
+ [ '192.0.2.1', false ],
+ [ '2001:db8:1::', true ],
+ [ '2001:0db8:0000:0000:0000:0000:0000:0000', true ],
+ [ '2001:0DB8:8000::', false ],
+ ];
+ }
+
+ /**
+ * @covers MWRestrictions::check
+ * @dataProvider provideCheck
+ * @param WebRequest $request
+ * @param Status $expect
+ */
+ public function testCheck( $request, $expect ) {
+ $this->assertEquals( $expect, self::$restrictionsForChecks->check( $request ) );
+ }
+
+ public function provideCheck() {
+ $ret = [];
+
+ $mockBuilder = $this->getMockBuilder( FauxRequest::class )
+ ->setMethods( [ 'getIP' ] );
+
+ foreach ( self::provideCheckIP() as $checkIP ) {
+ $ok = [];
+ $request = $mockBuilder->getMock();
+
+ $request->expects( $this->any() )->method( 'getIP' )
+ ->will( $this->returnValue( $checkIP[0] ) );
+ $ok['ip'] = $checkIP[1];
+
+ /* If we ever add more restrictions, add nested for loops here:
+ * foreach ( self::provideCheckFoo() as $checkFoo ) {
+ * $request->expects( $this->any() )->method( 'getFoo' )
+ * ->will( $this->returnValue( $checkFoo[0] );
+ * $ok['foo'] = $checkFoo[1];
+ *
+ * foreach ( self::provideCheckBar() as $checkBar ) {
+ * $request->expects( $this->any() )->method( 'getBar' )
+ * ->will( $this->returnValue( $checkBar[0] );
+ * $ok['bar'] = $checkBar[1];
+ *
+ * // etc.
+ * }
+ * }
+ */
+
+ $status = Status::newGood();
+ $status->setResult( $ok === array_filter( $ok ), $ok );
+ $ret[] = [ $request, $status ];
+ }
+
+ return $ret;
+ }
+}