mockAuthority( $user, static function ( $permission ) use ( $permissions ) { return in_array( $permission, $permissions ); }, $block ); } /** * Create a mock Authority for an anon user with all but $permissions * @param array $permissions * @return Authority */ private function mockAnonAuthorityWithoutPermissions( array $permissions ): Authority { return $this->mockUserAuthorityWithoutPermissions( new UserIdentityValue( 0, '127.0.0.1' ), $permissions ); } /** * Create a mock Authority for a registered user with all but $permissions * @param array $permissions * @return Authority */ private function mockRegisteredAuthorityWithoutPermissions( array $permissions ): Authority { return $this->mockUserAuthorityWithoutPermissions( new UserIdentityValue( 9999, 'Petr' ), $permissions ); } /** * Create a mock Authority for a $user with all but $permissions * @param UserIdentity $user * @param array $permissions * @return Authority */ private function mockUserAuthorityWithoutPermissions( UserIdentity $user, array $permissions ): Authority { return $this->mockAuthority( $user, static function ( $permission ) use ( $permissions ) { return !in_array( $permission, $permissions ); } ); } /** * Create mock Authority for anon user where permissions are determined by $callback. * * @param callable $permissionCallback * @return Authority */ private function mockAnonAuthority( callable $permissionCallback ): Authority { return $this->mockAuthority( new UserIdentityValue( 0, '127.0.0.1' ), $permissionCallback ); } /** * Create mock Authority for registered user where permissions are determined by $callback. * * @param callable $permissionCallback * @return Authority */ private function mockRegisteredAuthority( callable $permissionCallback ): Authority { return $this->mockAuthority( new UserIdentityValue( 9999, 'Petr' ), $permissionCallback ); } /** * Create mock Authority for $user where permissions are determined by $callback. * * @param UserIdentity $user * @param callable $permissionCallback ( string $permission, ?PageIdentity $page ) * @param Block|null $block * * @return Authority */ private function mockAuthority( UserIdentity $user, callable $permissionCallback, Block $block = null ): Authority { $mock = $this->createMock( Authority::class ); $mock->method( 'getUser' )->willReturn( $user ); $methods = [ 'isAllowed', 'probablyCan', 'definitelyCan', 'authorizeRead', 'authorizeWrite' ]; foreach ( $methods as $method ) { $mock->method( $method )->willReturnCallback( $permissionCallback ); } $mock->method( 'isAllowedAny' ) ->willReturnCallback( static function ( ...$permissions ) use ( $permissionCallback ) { foreach ( $permissions as $permission ) { if ( $permissionCallback( $permission ) ) { return true; } } return false; } ); $mock->method( 'isAllowedAll' ) ->willReturnCallback( static function ( ...$permissions ) use ( $permissionCallback ) { foreach ( $permissions as $permission ) { if ( !$permissionCallback( $permission ) ) { return false; } } return true; } ); $mock->method( 'getBlock' )->willReturn( $block ); return $mock; } }