2022-07-20 18:19:59 +00:00
|
|
|
<?php
|
|
|
|
|
|
2022-08-04 21:14:47 +00:00
|
|
|
namespace MediaWiki\Tests\Parser\Parsoid;
|
2022-07-20 18:19:59 +00:00
|
|
|
|
2022-08-12 15:02:12 +00:00
|
|
|
use Composer\Semver\Semver;
|
2022-09-21 10:20:11 +00:00
|
|
|
use JsonContent;
|
2022-07-26 19:41:03 +00:00
|
|
|
use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface;
|
|
|
|
|
use LogicException;
|
2022-10-29 18:52:23 +00:00
|
|
|
use MediaWiki\MainConfigNames;
|
|
|
|
|
use MediaWiki\MainConfigSchema;
|
2022-08-26 20:07:48 +00:00
|
|
|
use MediaWiki\Page\PageIdentityValue;
|
2022-10-29 18:52:23 +00:00
|
|
|
use MediaWiki\Parser\Parsoid\Config\PageConfig;
|
2022-10-16 21:44:53 +00:00
|
|
|
use MediaWiki\Parser\Parsoid\HtmlToContentTransform;
|
2022-08-30 19:19:53 +00:00
|
|
|
use MediaWiki\Revision\MutableRevisionRecord;
|
2022-10-29 18:52:23 +00:00
|
|
|
use MediaWiki\Revision\SlotRecord;
|
2022-07-20 18:19:59 +00:00
|
|
|
use MediaWikiIntegrationTestCase;
|
|
|
|
|
use Wikimedia\Parsoid\Core\ClientError;
|
2022-10-29 18:52:23 +00:00
|
|
|
use Wikimedia\Parsoid\Core\SelserData;
|
2022-08-04 21:14:47 +00:00
|
|
|
use Wikimedia\Parsoid\Parsoid;
|
2022-07-22 10:26:39 +00:00
|
|
|
use Wikimedia\Parsoid\Utils\ContentUtils;
|
2022-10-29 18:52:23 +00:00
|
|
|
use Wikimedia\TestingAccessWrapper;
|
2022-09-21 10:20:11 +00:00
|
|
|
use WikitextContent;
|
2022-07-20 18:19:59 +00:00
|
|
|
|
|
|
|
|
/**
|
2022-10-16 21:44:53 +00:00
|
|
|
* @covers \MediaWiki\Parser\Parsoid\HtmlToContentTransform
|
2022-10-29 18:52:23 +00:00
|
|
|
* @group Database
|
2022-07-20 18:19:59 +00:00
|
|
|
*/
|
2022-10-16 21:44:53 +00:00
|
|
|
class HtmlToContentTransformTest extends MediaWikiIntegrationTestCase {
|
2022-08-04 14:09:20 +00:00
|
|
|
private const MODIFIED_HTML = '<html><head>' .
|
|
|
|
|
'<meta charset="utf-8"/><meta property="mw:htmlVersion" content="2.4.0"/></head>' .
|
|
|
|
|
'<body>Modified HTML</body></html>';
|
2022-07-20 18:19:59 +00:00
|
|
|
|
2022-08-26 20:07:48 +00:00
|
|
|
private const ORIG_BODY = '<body>Original Content</body>';
|
2022-07-20 18:19:59 +00:00
|
|
|
private const ORIG_HTML = '<html>' . self::ORIG_BODY . '</html>';
|
|
|
|
|
private const ORIG_DATA_MW = [ 'ids' => [ 'mwAQ' => [] ] ];
|
|
|
|
|
private const ORIG_DATA_PARSOID = [ 'ids' => [ 'mwAQ' => [ 'pi' => [ [ [ 'k' => '1' ] ] ] ] ] ];
|
|
|
|
|
private const MODIFIED_DATA_MW = [ 'ids' => [ 'mwAQ' => [
|
|
|
|
|
'parts' => [ [
|
|
|
|
|
'template' => [
|
|
|
|
|
'target' => [ 'wt' => '1x', 'href' => './Template:1x' ],
|
|
|
|
|
'params' => [ '1' => [ 'wt' => 'hi' ] ],
|
|
|
|
|
'i' => 0
|
|
|
|
|
]
|
|
|
|
|
] ]
|
|
|
|
|
] ] ];
|
|
|
|
|
|
2022-10-16 21:44:53 +00:00
|
|
|
private function setOriginalData( HtmlToContentTransform $transform ) {
|
2022-08-02 14:51:10 +00:00
|
|
|
$transform->setOriginalRevisionId( 1 );
|
|
|
|
|
$transform->setOriginalSchemaVersion( '2.4.0' );
|
|
|
|
|
$transform->setOriginalHtml( self::ORIG_HTML );
|
|
|
|
|
$transform->setOriginalDataMW( self::ORIG_DATA_MW );
|
|
|
|
|
$transform->setOriginalDataParsoid( self::ORIG_DATA_PARSOID );
|
2022-07-20 18:19:59 +00:00
|
|
|
}
|
|
|
|
|
|
2022-10-16 21:44:53 +00:00
|
|
|
private function createHtmlToContentTransform( $html = '' ) {
|
|
|
|
|
return new HtmlToContentTransform(
|
2022-08-04 21:14:47 +00:00
|
|
|
$html ?? self::ORIG_HTML,
|
2022-08-26 20:07:48 +00:00
|
|
|
PageIdentityValue::localIdentity( 7, NS_MAIN, 'Test' ),
|
2022-08-04 21:14:47 +00:00
|
|
|
new Parsoid(
|
|
|
|
|
$this->getServiceContainer()->getParsoidSiteConfig(),
|
|
|
|
|
$this->getServiceContainer()->getParsoidDataAccess()
|
|
|
|
|
),
|
2022-10-29 18:52:23 +00:00
|
|
|
MainConfigSchema::getDefaultValue( MainConfigNames::ParsoidSettings ),
|
|
|
|
|
$this->getServiceContainer()->getParsoidPageConfigFactory(),
|
2022-09-21 10:20:11 +00:00
|
|
|
$this->getServiceContainer()->getContentHandlerFactory()
|
2022-08-04 21:14:47 +00:00
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2022-10-16 21:44:53 +00:00
|
|
|
private function createHtmlToContentTransformWithOriginalData( $html = '' ) {
|
|
|
|
|
$transform = $this->createHtmlToContentTransform( $html );
|
2022-07-20 18:19:59 +00:00
|
|
|
|
2022-08-04 21:14:47 +00:00
|
|
|
// Set some options to assert on $transform object.
|
|
|
|
|
$transform->setOptions( [
|
2022-07-26 10:33:42 +00:00
|
|
|
'contentmodel' => 'wikitext',
|
|
|
|
|
'offsetType' => 'byte',
|
|
|
|
|
] );
|
2022-07-26 19:41:03 +00:00
|
|
|
|
2022-08-02 14:51:10 +00:00
|
|
|
$this->setOriginalData( $transform );
|
2022-07-20 18:19:59 +00:00
|
|
|
|
2022-08-04 21:14:47 +00:00
|
|
|
return $transform;
|
2022-07-20 18:19:59 +00:00
|
|
|
}
|
|
|
|
|
|
2022-08-02 14:51:10 +00:00
|
|
|
public function testGetOriginalBodyRequiresValidDataParsoid() {
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransform( self::ORIG_HTML );
|
2022-08-02 14:51:10 +00:00
|
|
|
$transform->setOriginalSchemaVersion( '2.4.0' );
|
|
|
|
|
$transform->setOriginalHtml( self::ORIG_HTML );
|
2022-07-20 18:19:59 +00:00
|
|
|
|
2022-08-02 14:51:10 +00:00
|
|
|
// Invalid data-parsoid structure!
|
|
|
|
|
$transform->setOriginalDataParsoid( [ 'foo' => 'bar' ] );
|
2022-07-20 18:19:59 +00:00
|
|
|
|
2022-08-02 14:51:10 +00:00
|
|
|
$exception = new ClientError( 'Invalid data-parsoid was provided.' );
|
2022-07-20 18:19:59 +00:00
|
|
|
$this->expectException( get_class( $exception ) );
|
|
|
|
|
$this->expectExceptionMessage( $exception->getMessage() );
|
2022-08-02 14:51:10 +00:00
|
|
|
|
|
|
|
|
// Should throw because setOriginalDataParsoid got bad data.
|
|
|
|
|
// Note that setOriginalDataParsoid can't validate immediately, because it
|
|
|
|
|
// may not know the schema version. The order in which the setters are called
|
|
|
|
|
// should not matter. All checks happen in getters.
|
|
|
|
|
$transform->getOriginalBody();
|
2022-07-20 18:19:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testHasOriginalHtml() {
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransform( self::MODIFIED_HTML );
|
2022-08-04 14:09:20 +00:00
|
|
|
$this->assertFalse( $transform->hasOriginalHtml() );
|
|
|
|
|
|
|
|
|
|
$transform->setOriginalDataParsoid( self::ORIG_DATA_PARSOID );
|
|
|
|
|
$this->assertFalse( $transform->hasOriginalHtml() );
|
|
|
|
|
|
|
|
|
|
$transform->setOriginalHtml( self::ORIG_HTML );
|
|
|
|
|
$this->assertTrue( $transform->hasOriginalHtml() );
|
2022-07-20 18:19:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testGetOriginalSchemaVersion() {
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransform( self::ORIG_HTML ); // no version inline
|
2022-08-04 14:09:20 +00:00
|
|
|
$this->assertSame( Parsoid::defaultHTMLVersion(), $transform->getOriginalSchemaVersion() );
|
|
|
|
|
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransform( self::MODIFIED_HTML ); // has version inline
|
2022-08-04 14:09:20 +00:00
|
|
|
$this->assertSame( '2.4.0', $transform->getOriginalSchemaVersion() );
|
|
|
|
|
|
|
|
|
|
$transform->setOriginalSchemaVersion( '2.3.0' );
|
|
|
|
|
$this->assertSame( '2.3.0', $transform->getOriginalSchemaVersion() );
|
2022-07-20 18:19:59 +00:00
|
|
|
}
|
|
|
|
|
|
2022-07-22 10:26:39 +00:00
|
|
|
public function testGetSchemaVersion() {
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransform( self::ORIG_HTML ); // no version inline
|
2022-08-04 14:09:20 +00:00
|
|
|
$this->assertSame( Parsoid::defaultHTMLVersion(), $transform->getSchemaVersion() );
|
|
|
|
|
|
|
|
|
|
// Should have an effect, since the HTML has no version specified inline
|
|
|
|
|
$transform->setOriginalSchemaVersion( '2.3.0' );
|
|
|
|
|
$this->assertSame( '2.3.0', $transform->getSchemaVersion() );
|
|
|
|
|
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransform( self::MODIFIED_HTML ); // has version inline
|
2022-08-04 14:09:20 +00:00
|
|
|
$this->assertSame( '2.4.0', $transform->getSchemaVersion() );
|
|
|
|
|
|
|
|
|
|
// Should have no impact, since the HTML has a version specified inline
|
|
|
|
|
$transform->setOriginalSchemaVersion( '2.3.0' );
|
|
|
|
|
$this->assertSame( '2.4.0', $transform->getSchemaVersion() );
|
2022-07-22 10:26:39 +00:00
|
|
|
}
|
|
|
|
|
|
2022-07-26 19:41:03 +00:00
|
|
|
public function testHasOriginalDataParsoid() {
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransform( self::MODIFIED_HTML );
|
2022-08-04 14:09:20 +00:00
|
|
|
$this->assertFalse( $transform->hasOriginalDataParsoid() );
|
|
|
|
|
|
|
|
|
|
$transform->setOriginalDataParsoid( self::ORIG_DATA_PARSOID );
|
|
|
|
|
$this->assertTrue( $transform->hasOriginalDataParsoid() );
|
2022-07-20 18:19:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testGetOriginalHtml() {
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransform( self::MODIFIED_HTML );
|
2022-08-04 14:09:20 +00:00
|
|
|
|
|
|
|
|
$this->assertFalse( $transform->hasOriginalHtml() );
|
|
|
|
|
|
|
|
|
|
$transform->setOriginalSchemaVersion( '2.4.0' );
|
|
|
|
|
$transform->setOriginalHtml( self::ORIG_HTML );
|
|
|
|
|
|
|
|
|
|
$this->assertTrue( $transform->hasOriginalHtml() );
|
|
|
|
|
$this->assertSame( self::ORIG_HTML, $transform->getOriginalHtml() );
|
2022-07-20 18:19:59 +00:00
|
|
|
}
|
|
|
|
|
|
2022-07-22 10:26:39 +00:00
|
|
|
public function testGetOriginalBody() {
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransform( self::MODIFIED_HTML );
|
2022-08-04 14:09:20 +00:00
|
|
|
$transform->setOriginalSchemaVersion( '2.4.0' );
|
|
|
|
|
$transform->setOriginalHtml( self::ORIG_HTML );
|
|
|
|
|
|
2022-07-22 10:26:39 +00:00
|
|
|
$this->assertSame(
|
|
|
|
|
self::ORIG_BODY,
|
2022-08-04 14:09:20 +00:00
|
|
|
ContentUtils::toXML( $transform->getOriginalBody() )
|
2022-07-22 10:26:39 +00:00
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2022-10-29 18:52:23 +00:00
|
|
|
private function assertTransformHasOriginalContent( HtmlToContentTransform $transform, $text ) {
|
|
|
|
|
$this->assertTrue( $transform->knowsOriginalContent() );
|
|
|
|
|
|
|
|
|
|
$access = TestingAccessWrapper::newFromObject( $transform );
|
|
|
|
|
|
|
|
|
|
/** @var PageConfig $pageConfig */
|
|
|
|
|
$pageConfig = $access->getPageConfig();
|
|
|
|
|
|
|
|
|
|
$this->assertSame( $text, $pageConfig->getPageMainContent() );
|
|
|
|
|
|
|
|
|
|
/** @var ?SelserData $selserData */
|
|
|
|
|
$selserData = $access->getSelserData();
|
|
|
|
|
|
|
|
|
|
$this->assertNotNull( $selserData );
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-20 18:19:59 +00:00
|
|
|
public function testOldId() {
|
2022-10-29 18:52:23 +00:00
|
|
|
$text = 'Lorem Ipsum';
|
|
|
|
|
$rev = $this->editPage( __METHOD__, $text )->getValue()['revision-record'];
|
|
|
|
|
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransformWithOriginalData();
|
2022-10-29 18:52:23 +00:00
|
|
|
$transform->setOriginalRevisionId( $rev->getId() );
|
|
|
|
|
|
|
|
|
|
$this->assertSame( $rev->getId(), $transform->getOriginalRevisionId() );
|
|
|
|
|
|
|
|
|
|
$this->assertTransformHasOriginalContent( $transform, $text );
|
2022-08-30 19:19:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testSetOriginalRevision() {
|
2022-10-29 18:52:23 +00:00
|
|
|
$text = 'Lorem Ipsum';
|
|
|
|
|
|
2022-08-30 19:19:53 +00:00
|
|
|
$page = PageIdentityValue::localIdentity( 17, NS_MAIN, 'Test' );
|
|
|
|
|
$rev = new MutableRevisionRecord( $page );
|
2022-10-29 18:52:23 +00:00
|
|
|
$rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
|
2022-08-30 19:19:53 +00:00
|
|
|
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransformWithOriginalData();
|
2022-08-30 19:19:53 +00:00
|
|
|
$transform->setOriginalRevision( $rev );
|
|
|
|
|
$this->assertSame( $rev->getId(), $transform->getOriginalRevisionId() );
|
2022-10-29 18:52:23 +00:00
|
|
|
|
|
|
|
|
$this->assertTransformHasOriginalContent( $transform, $text );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testSetOriginalText() {
|
|
|
|
|
$text = 'Lorem Ipsum';
|
|
|
|
|
|
|
|
|
|
$transform = $this->createHtmlToContentTransformWithOriginalData();
|
|
|
|
|
$transform->setOriginalText( $text );
|
|
|
|
|
|
|
|
|
|
$this->assertTransformHasOriginalContent( $transform, $text );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testSetOriginalContent() {
|
|
|
|
|
$text = 'Lorem Ipsum';
|
|
|
|
|
|
|
|
|
|
$transform = $this->createHtmlToContentTransformWithOriginalData();
|
|
|
|
|
$transform->setOriginalContent( new JsonContent( $text ) );
|
|
|
|
|
|
|
|
|
|
$this->assertTransformHasOriginalContent( $transform, $text );
|
|
|
|
|
$this->assertSame( CONTENT_MODEL_JSON, $transform->getContentModel() );
|
2022-07-20 18:19:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testGetContentModel() {
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransformWithOriginalData();
|
2022-08-04 14:09:20 +00:00
|
|
|
$this->assertSame( 'wikitext', $transform->getContentModel() );
|
2022-07-20 18:19:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testGetEnvOpts() {
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransformWithOriginalData();
|
2022-08-04 14:09:20 +00:00
|
|
|
$this->assertSame( 'byte', $transform->getOffsetType() );
|
2022-07-20 18:19:59 +00:00
|
|
|
}
|
2022-07-22 10:26:39 +00:00
|
|
|
|
|
|
|
|
private function getTextFromFile( string $name ): string {
|
|
|
|
|
return trim( file_get_contents( __DIR__ . "/data/Transform/$name" ) );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testDowngrade() {
|
|
|
|
|
$html = $this->getTextFromFile( 'Minimal.html' ); // Uses profile version 2.4.0
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransform( $html );
|
2022-07-22 10:26:39 +00:00
|
|
|
|
2022-08-02 14:51:10 +00:00
|
|
|
$transform->setOriginalSchemaVersion( '999.0.0' );
|
|
|
|
|
$transform->setOriginalHtml( $html );
|
|
|
|
|
$transform->setOriginalDataParsoid( self::ORIG_DATA_PARSOID );
|
2022-07-22 10:26:39 +00:00
|
|
|
|
2022-07-26 19:41:03 +00:00
|
|
|
// should automatically apply downgrade
|
2022-08-04 21:14:47 +00:00
|
|
|
$oldBody = $transform->getOriginalBody();
|
2022-07-22 10:26:39 +00:00
|
|
|
|
|
|
|
|
// all getters should now reflect the state after the downgrade.
|
2022-08-12 15:02:12 +00:00
|
|
|
// we expect a version >= 2.4.0 and < 3.0.0. So use ^2.4.0
|
2022-08-04 14:09:20 +00:00
|
|
|
$this->assertTrue( Semver::satisfies( $transform->getOriginalSchemaVersion(), '^2.4.0' ) );
|
2022-08-04 21:14:47 +00:00
|
|
|
$this->assertNotSame( $html, $transform->getOriginalHtml() );
|
|
|
|
|
$this->assertNotSame( $oldBody, ContentUtils::toXML( $transform->getOriginalBody() ) );
|
2022-07-22 10:26:39 +00:00
|
|
|
}
|
2022-07-26 19:41:03 +00:00
|
|
|
|
|
|
|
|
public function testModifiedDataMW() {
|
|
|
|
|
$html = $this->getTextFromFile( 'Minimal-999.html' ); // Uses profile version 2.4.0
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransform( $html );
|
2022-07-26 19:41:03 +00:00
|
|
|
|
2022-08-02 14:51:10 +00:00
|
|
|
$transform->setOriginalHtml( self::ORIG_HTML );
|
|
|
|
|
$transform->setOriginalDataParsoid( self::ORIG_DATA_PARSOID );
|
2022-08-04 21:14:47 +00:00
|
|
|
$transform->setModifiedDataMW( self::MODIFIED_DATA_MW );
|
2022-07-26 19:41:03 +00:00
|
|
|
// should automatically apply downgrade
|
2022-08-04 21:14:47 +00:00
|
|
|
$doc = $transform->getModifiedDocument();
|
2022-07-26 19:41:03 +00:00
|
|
|
$html = ContentUtils::toXML( $doc );
|
|
|
|
|
|
|
|
|
|
// all getters should now reflect the state after the downgrade.
|
|
|
|
|
$this->assertNotSame( '"hi"', $html );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testMetrics() {
|
|
|
|
|
$html = '<html><body>xyz</body></html>'; // no schema version!
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransform( $html );
|
2022-07-26 19:41:03 +00:00
|
|
|
|
|
|
|
|
$metrics = $this->createNoOpMock( StatsdDataFactoryInterface::class, [ 'increment' ] );
|
|
|
|
|
$metrics->expects( $this->atLeastOnce() )->method( 'increment' );
|
2022-08-04 21:14:47 +00:00
|
|
|
$transform->setMetrics( $metrics );
|
2022-07-26 19:41:03 +00:00
|
|
|
|
|
|
|
|
// getSchemaVersion should ioncrement the html2wt.original.version.notinline counter
|
|
|
|
|
// because the input HTML doesn't contain a schema version.
|
2022-08-04 21:14:47 +00:00
|
|
|
$transform->getSchemaVersion();
|
2022-07-26 19:41:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testHtmlSize() {
|
2022-07-30 23:04:02 +00:00
|
|
|
$html = '<html><body>hällö</body></html>'; // use some multi-byte characters
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransform( $html );
|
2022-07-26 19:41:03 +00:00
|
|
|
|
2022-07-30 23:04:02 +00:00
|
|
|
// make sure it counts characters, not bytes
|
2022-08-04 21:14:47 +00:00
|
|
|
$this->assertSame( 31, $transform->getModifiedHtmlSize() );
|
2022-07-26 19:41:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testSetOriginalHTML() {
|
|
|
|
|
$html = '<html><body>xyz</body></html>'; // no schema version!
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransform( $html );
|
2022-07-26 19:41:03 +00:00
|
|
|
|
|
|
|
|
// mainly check that this doesn't explode.
|
2022-08-02 14:51:10 +00:00
|
|
|
$transform->setOriginalSchemaVersion( '999.0.0' );
|
|
|
|
|
$transform->setOriginalHtml( 'hi' );
|
2022-07-26 19:41:03 +00:00
|
|
|
|
2022-08-04 21:14:47 +00:00
|
|
|
$this->assertTrue( $transform->hasOriginalHtml() );
|
|
|
|
|
$this->assertFalse( $transform->hasOriginalDataParsoid() );
|
2022-07-26 19:41:03 +00:00
|
|
|
}
|
|
|
|
|
|
2022-08-02 14:51:10 +00:00
|
|
|
public function testSetOriginalDataParsoidAfterGetModified() {
|
2022-07-26 19:41:03 +00:00
|
|
|
// Use HTML that contains a schema version!
|
|
|
|
|
// Otherwise, we won't trigger the right error.
|
|
|
|
|
$html = $this->getTextFromFile( 'Minimal.html' );
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransform( $html );
|
2022-07-26 19:41:03 +00:00
|
|
|
|
2022-08-04 21:14:47 +00:00
|
|
|
$transform->getModifiedDocument();
|
2022-07-26 19:41:03 +00:00
|
|
|
|
|
|
|
|
$this->expectException( LogicException::class );
|
|
|
|
|
$this->expectExceptionMessage( 'getModifiedDocument()' );
|
|
|
|
|
|
2022-08-02 14:51:10 +00:00
|
|
|
$transform->setOriginalDataParsoid( [] );
|
2022-07-26 19:41:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testOffsetTypeMismatch() {
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransform( self::ORIG_HTML );
|
2022-08-02 14:51:10 +00:00
|
|
|
$this->setOriginalData( $transform );
|
2022-07-26 19:41:03 +00:00
|
|
|
|
2022-08-04 21:14:47 +00:00
|
|
|
// Set some options to assert on $transform.
|
|
|
|
|
$transform->setOptions( [
|
2022-07-26 19:41:03 +00:00
|
|
|
'contentmodel' => 'wikitext',
|
|
|
|
|
'offsetType' => 'byte',
|
|
|
|
|
] );
|
|
|
|
|
|
2022-08-02 14:51:10 +00:00
|
|
|
$dataParsoid = self::ORIG_DATA_PARSOID;
|
|
|
|
|
$dataParsoid['offsetType'] = 'UCS2';
|
2022-07-26 19:41:03 +00:00
|
|
|
|
2022-08-02 14:51:10 +00:00
|
|
|
$transform->setOriginalDataParsoid( $dataParsoid );
|
2022-07-26 19:41:03 +00:00
|
|
|
|
|
|
|
|
$this->expectException( ClientError::class );
|
2022-08-02 14:51:10 +00:00
|
|
|
$transform->getOriginalBody();
|
2022-07-26 19:41:03 +00:00
|
|
|
}
|
2022-08-26 20:07:48 +00:00
|
|
|
|
2022-09-21 10:20:11 +00:00
|
|
|
public function testHtmlToWikitextContent() {
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransform( self::ORIG_HTML );
|
2022-08-26 20:07:48 +00:00
|
|
|
|
|
|
|
|
// Set some options to assert on $transform.
|
|
|
|
|
$transform->setOptions( [
|
2022-09-21 10:20:11 +00:00
|
|
|
'contentmodel' => null,
|
|
|
|
|
'offsetType' => 'byte',
|
|
|
|
|
] );
|
|
|
|
|
|
|
|
|
|
$content = $transform->htmlToContent();
|
|
|
|
|
$this->assertInstanceOf( WikitextContent::class, $content );
|
|
|
|
|
$this->assertStringContainsString( 'Original Content', $content->getText() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testHtmlToJsonContent() {
|
|
|
|
|
$jsonConfigHtml = $this->getTextFromFile( 'JsonConfig.html' );
|
2022-10-16 21:44:53 +00:00
|
|
|
$transform = $this->createHtmlToContentTransform( $jsonConfigHtml );
|
2022-09-21 10:20:11 +00:00
|
|
|
|
|
|
|
|
// Set some options to assert on $transform.
|
|
|
|
|
$transform->setOptions( [
|
|
|
|
|
'contentmodel' => CONTENT_MODEL_JSON,
|
2022-08-26 20:07:48 +00:00
|
|
|
'offsetType' => 'byte',
|
|
|
|
|
] );
|
|
|
|
|
|
2022-09-21 10:20:11 +00:00
|
|
|
$content = $transform->htmlToContent();
|
|
|
|
|
$this->assertInstanceOf( JsonContent::class, $content );
|
2022-08-26 20:07:48 +00:00
|
|
|
}
|
2022-07-20 18:19:59 +00:00
|
|
|
}
|