<?php
+use Wikimedia\TestingAccessWrapper;
+
/**
* @group API
*/
$formatter->addMessagesFromStatus( 'status', $status );
$this->assertSame( [
'error' => [
- 'code' => 'parentheses',
- 'info' => $parensPlain,
+ 'code' => 'mainpage',
+ 'info' => $mainpagePlain,
],
'warnings' => [
'status' => [
$formatter->arrayFromStatus( $status, 'warning' ),
'arrayFromStatus test for warning'
);
+
+ $result->reset();
+ $result->addValue( null, 'error', [ 'bogus' ] );
+ $formatter->addError( 'err', 'mainpage' );
+ $this->assertSame( [
+ 'error' => [
+ 'code' => 'mainpage',
+ 'info' => $mainpagePlain,
+ ],
+ ApiResult::META_TYPE => 'assoc',
+ ], $result->getResultData(), 'Overwrites bogus "error" value with real error' );
+ }
+
+ /**
+ * @dataProvider provideGetMessageFromException
+ * @covers ApiErrorFormatter::getMessageFromException
+ * @covers ApiErrorFormatter::formatException
+ * @param Exception $exception
+ * @param array $options
+ * @param array $expect
+ */
+ public function testGetMessageFromException( $exception, $options, $expect ) {
+ if ( $exception instanceof UsageException ) {
+ $this->hideDeprecated( 'UsageException::getMessageArray' );
+ }
+
+ $result = new ApiResult( 8388608 );
+ $formatter = new ApiErrorFormatter( $result, Language::factory( 'en' ), 'html', false );
+
+ $msg = $formatter->getMessageFromException( $exception, $options );
+ $this->assertInstanceOf( Message::class, $msg );
+ $this->assertInstanceOf( IApiMessage::class, $msg );
+ $this->assertSame( $expect, [
+ 'text' => $msg->parse(),
+ 'code' => $msg->getApiCode(),
+ 'data' => $msg->getApiData(),
+ ] );
+
+ $expectFormatted = $formatter->formatMessage( $msg );
+ $formatted = $formatter->formatException( $exception, $options );
+ $this->assertSame( $expectFormatted, $formatted );
+ }
+
+ /**
+ * @dataProvider provideGetMessageFromException
+ * @covers ApiErrorFormatter_BackCompat::formatException
+ * @param Exception $exception
+ * @param array $options
+ * @param array $expect
+ */
+ public function testGetMessageFromException_BC( $exception, $options, $expect ) {
+ $result = new ApiResult( 8388608 );
+ $formatter = new ApiErrorFormatter_BackCompat( $result );
+
+ $msg = $formatter->getMessageFromException( $exception, $options );
+ $this->assertInstanceOf( Message::class, $msg );
+ $this->assertInstanceOf( IApiMessage::class, $msg );
+ $this->assertSame( $expect, [
+ 'text' => $msg->parse(),
+ 'code' => $msg->getApiCode(),
+ 'data' => $msg->getApiData(),
+ ] );
+
+ $expectFormatted = $formatter->formatMessage( $msg );
+ $formatted = $formatter->formatException( $exception, $options );
+ $this->assertSame( $expectFormatted, $formatted );
+ $formatted = $formatter->formatException( $exception, $options + [ 'bc' => true ] );
+ $this->assertSame( $expectFormatted['info'], $formatted );
+ }
+
+ public static function provideGetMessageFromException() {
+ Wikimedia\suppressWarnings();
+ $usageException = new UsageException(
+ '<b>Something broke!</b>', 'ue-code', 0, [ 'xxx' => 'yyy', 'baz' => 23 ]
+ );
+ Wikimedia\restoreWarnings();
+
+ return [
+ 'Normal exception' => [
+ new RuntimeException( '<b>Something broke!</b>' ),
+ [],
+ [
+ 'text' => '<b>Something broke!</b>',
+ 'code' => 'internal_api_error_RuntimeException',
+ 'data' => [],
+ ]
+ ],
+ 'Normal exception, wrapped' => [
+ new RuntimeException( '<b>Something broke!</b>' ),
+ [ 'wrap' => 'parentheses', 'code' => 'some-code', 'data' => [ 'foo' => 'bar', 'baz' => 42 ] ],
+ [
+ 'text' => '(<b>Something broke!</b>)',
+ 'code' => 'some-code',
+ 'data' => [ 'foo' => 'bar', 'baz' => 42 ],
+ ]
+ ],
+ 'UsageException' => [
+ $usageException,
+ [],
+ [
+ 'text' => '<b>Something broke!</b>',
+ 'code' => 'ue-code',
+ 'data' => [ 'xxx' => 'yyy', 'baz' => 23 ],
+ ]
+ ],
+ 'UsageException, wrapped' => [
+ $usageException,
+ [ 'wrap' => 'parentheses', 'code' => 'some-code', 'data' => [ 'foo' => 'bar', 'baz' => 42 ] ],
+ [
+ 'text' => '(<b>Something broke!</b>)',
+ 'code' => 'some-code',
+ 'data' => [ 'xxx' => 'yyy', 'baz' => 42, 'foo' => 'bar' ],
+ ]
+ ],
+ 'LocalizedException' => [
+ new LocalizedException( [ 'returnto', '<b>FooBar</b>' ] ),
+ [],
+ [
+ 'text' => 'Return to <b>FooBar</b>.',
+ 'code' => 'returnto',
+ 'data' => [],
+ ]
+ ],
+ 'LocalizedException, wrapped' => [
+ new LocalizedException( [ 'returnto', '<b>FooBar</b>' ] ),
+ [ 'wrap' => 'parentheses', 'code' => 'some-code', 'data' => [ 'foo' => 'bar', 'baz' => 42 ] ],
+ [
+ 'text' => 'Return to <b>FooBar</b>.',
+ 'code' => 'some-code',
+ 'data' => [ 'foo' => 'bar', 'baz' => 42 ],
+ ]
+ ],
+ ];
}
}