' . '' . '
Empty array
' ], [ (object)[], '
' . '
Empty object
' ], [ (object)[ 'foo' ], '
' . '
0"foo"
' ], [ (object)[ 'foo', 'bar' ], '
' . '' . '
0"foo"
1"bar"
' ], [ (object)[ 'baz' => 'foo', 'bar' ], '
' . '' . '
baz"foo"
0"bar"
' ], [ (object)[ 'baz' => 1000, 'bar' ], '
' . '' . '
baz1000
0"bar"
' ], [ (object)[ '' ], '
0"' . '<script>alert("evil!")</script>"' . '
', ], [ '{ broken JSON ]', 'Invalid JSON: $1', ], ]; } /** * @dataProvider provideDataAndParserText */ public function testFillParserOutput( $data, $expected ) { if ( !is_string( $data ) ) { $data = FormatJson::encode( $data ); } $title = $this->createMock( Title::class ); $title->method( 'getPageLanguage' ) ->willReturn( $this->getServiceContainer()->getContentLanguage() ); $content = new JsonContent( $data ); $contentRenderer = $this->getServiceContainer()->getContentRenderer(); $opts = ParserOptions::newFromAnon(); $parserOutput = $contentRenderer->getParserOutput( $content, $title, null, $opts, true ); $this->assertInstanceOf( ParserOutput::class, $parserOutput ); $this->assertEquals( $expected, $parserOutput->runOutputPipeline( $opts, [] )->getContentHolderText() ); } public function testValidateSave() { $handler = new JsonContentHandler(); $validationParams = new ValidationParams( PageIdentityValue::localIdentity( 123, NS_MEDIAWIKI, 'Config.json' ), 0 ); $validJson = new JsonContent( FormatJson::encode( [ 'test' => 'value' ] ) ); $invalidJson = new JsonContent( '{"key":' ); $this->assertStatusGood( $handler->validateSave( $validJson, $validationParams ) ); $this->assertStatusError( 'invalid-json-data', $handler->validateSave( $invalidJson, $validationParams ) ); $this->setTemporaryHook( 'JsonValidateSave', static function ( JsonContent $content, PageIdentity $pageIdentity, StatusValue $status ) { if ( $pageIdentity->getDBkey() === 'Config.json' && !isset( $content->getData()->getValue()->foo ) ) { $status->fatal( 'missing-key-foo' ); } } ); $this->assertStatusError( 'invalid-json-data', $handler->validateSave( $invalidJson, $validationParams ) ); $this->assertStatusError( 'missing-key-foo', $handler->validateSave( $validJson, $validationParams ) ); } }