Current File : /home/jvzmxxx/wiki1/extensions/Wikibase/repo/tests/phpunit/includes/RepoHooksTest.php
<?php

namespace Wikibase\Tests;

use ApiQuerySiteinfo;
use ConfigFactory;
use DerivativeContext;
use ImportStringSource;
use MWException;
use OutputPage;
use ParserOutput;
use RequestContext;
use Title;
use Wikibase\Repo\WikibaseRepo;
use Wikibase\RepoHooks;
use WikiImporter;

/**
 * @covers Wikibase\RepoHooks
 *
 * @group Wikibase
 * @group WikibaseRepo
 *
 * @group Database
 *
 * @license GPL-2.0+
 * @author Daniel Kinzler
 * @author Thiemo Mättig
 */
class RepoHooksTest extends \MediaWikiTestCase {

	private $saveAllowImport = false;

	protected function setUp() {
		parent::setUp();

		$this->saveAllowImport = WikibaseRepo::getDefaultInstance()->getSettings()->getSetting( 'allowEntityImport' );
	}

	protected function tearDown() {
		WikibaseRepo::getDefaultInstance()->getSettings()->setSetting( 'allowEntityImport', $this->saveAllowImport );
		Title::clearCaches();

		parent::tearDown();
	}

	public function testOnAPIQuerySiteInfoGeneralInfo() {
		$api = $this->getMockBuilder( ApiQuerySiteinfo::class )
			->disableOriginalConstructor()
			->getMock();

		$actual = array();
		RepoHooks::onAPIQuerySiteInfoGeneralInfo( $api, $actual );
		foreach ( $actual['wikibase-propertytypes'] as $key => $value ) {
			$this->assertInternalType( 'string', $key );
			$this->assertInternalType( 'string', $value['valuetype'] );
		}
	}

	public function revisionInfoProvider() {
		return array(
			'empty_allowimport' => array(
				array(),
				true
			),
			'empty_noimport' => array(
				array(),
				true
			),
			'wikitext_allowimport' => array(
				array( 'model' => CONTENT_MODEL_WIKITEXT ),
				true
			),
			'wikitext_noimport' => array(
				array( 'model' => CONTENT_MODEL_WIKITEXT ),
				false
			),
			'item_allowimport' => array(
				array( 'model' => CONTENT_MODEL_WIKIBASE_ITEM ),
				false,
				MWException::class
			),
			'item_noimport' => array(
				array( 'model' => CONTENT_MODEL_WIKIBASE_ITEM ),
				true
			)
		);
	}

	/**
	 * @dataProvider revisionInfoProvider
	 */
	public function testOnImportHandleRevisionXMLTag(
		array $revisionInfo,
		$allowEntityImport,
		$expectedException = null
	) {
		//NOTE: class is unclear, see Bug T66657. But we don't use that object anyway.
		$importer = $this->getMockBuilder( 'Import' )
			->disableOriginalConstructor()
			->getMock();

		WikibaseRepo::getDefaultInstance()->getSettings()->setSetting(
			'allowEntityImport',
			$allowEntityImport
		);

		if ( $expectedException !== null ) {
			$this->setExpectedException( $expectedException );
		}

		RepoHooks::onImportHandleRevisionXMLTag( $importer, array(), $revisionInfo );
		$this->assertTrue( true ); // make PHPUnit happy
	}

	public function importProvider() {
		return array(
			'wikitext' => array( <<<XML
<mediawiki>
  <siteinfo>
    <sitename>TestWiki</sitename>
    <case>first-letter</case>
  </siteinfo>
  <page>
    <title>Bla</title><ns>0</ns>
    <revision>
      <contributor><username>Tester</username><id>0</id></contributor>
      <comment>Test</comment>
      <text>Hallo Welt</text>
      <model>wikitext</model>
      <format>text/x-wiki</format>
    </revision>
  </page>
 </mediawiki>
XML
				,
				false
			),
			'item' => array( <<<XML
<mediawiki>
  <siteinfo>
    <sitename>TestWiki</sitename>
    <case>first-letter</case>
  </siteinfo>
  <page>
    <title>Q123</title><ns>1234</ns>
    <revision>
      <contributor><username>Tester</username><id>0</id></contributor>
      <comment>Test</comment>
      <text>{ "type": "item", "id":"Q123" }</text>
      <model>wikibase-item</model>
      <format>application/json</format>
    </revision>
  </page>
 </mediawiki>
XML
				,
				false,
				MWException::class
			),
			'item (allow)' => array( <<<XML
<mediawiki>
  <siteinfo>
    <sitename>TestWiki</sitename>
    <case>first-letter</case>
  </siteinfo>
  <page>
    <title>Q123</title><ns>1234</ns>
    <revision>
      <contributor><username>Tester</username><id>0</id></contributor>
      <comment>Test</comment>
      <text>{ "type": "item", "id":"Q123" }</text>
      <model>wikibase-item</model>
      <format>application/json</format>
    </revision>
  </page>
 </mediawiki>
XML
			,
				true
			),
		);
	}

	/**
	 * @dataProvider importProvider
	 */
	public function testImportHandleRevisionXMLTag_hook( $xml, $allowImport, $expectedException = null ) {
		// WikiImporter tried to register this protocol every time, so unregister first to avoid errors.
		\MediaWiki\suppressWarnings();
		stream_wrapper_unregister( 'uploadsource' );
		\MediaWiki\restoreWarnings();

		WikibaseRepo::getDefaultInstance()->getSettings()->setSetting( 'allowEntityImport', $allowImport );

		$source = new ImportStringSource( $xml );
		$importer = new WikiImporter( $source, ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );

		$importer->setNoticeCallback( function() {
			// Do nothing for now. Could collect and compare notices.
		} );
		$importer->setPageOutCallback( function() {
		} );

		if ( $expectedException !== null ) {
			$this->setExpectedException( $expectedException );
		}

		$importer->doImport();
		$this->assertTrue( true ); // make PHPUnit happy
	}

	public function testOnOutputPageParserOutput() {
		$altLinks = array( array( 'a' => 'b' ), array( 'c', 'd' ) );

		$context = new DerivativeContext( RequestContext::getMain() );
		$out = new OutputPage( $context );

		$parserOutput = $this->getMock( ParserOutput::class );
		$parserOutput->expects( $this->exactly( 4 ) )
			->method( 'getExtensionData' )
			->will( $this->returnCallback( function ( $key ) use ( $altLinks ) {
				if ( $key === 'wikibase-alternate-links' ) {
					return $altLinks;
				} else {
					return $key;
				}
			} ) );

		RepoHooks::onOutputPageParserOutput( $out, $parserOutput );

		$this->assertSame(
			'wikibase-view-chunks',
			$out->getProperty( 'wikibase-view-chunks' )
		);

		$this->assertSame(
			'wikibase-titletext',
			$out->getProperty( 'wikibase-titletext' )
		);

		$this->assertSame( $altLinks, $out->getLinkTags() );
	}

}