* @param Exception|Throwable $exception
* @param array $options
* - wrap: (string|array|MessageSpecifier) Used to wrap the exception's
- * message. The exception's message will be added as the final parameter.
+ * message if it's not an ILocalizedException. The exception's message
+ * will be added as the final parameter.
* - code: (string) Default code
- * - data: (array) Extra data
- * @return ApiMessage
+ * - data: (array) Default extra data
+ * @return IApiMessage
*/
public function getMessageFromException( $exception, array $options = [] ) {
$options += [ 'code' => null, 'data' => [] ];
// Extract code and data from the exception, if applicable
if ( $exception instanceof UsageException ) {
$data = $exception->getMessageArray();
- if ( !isset( $options['code'] ) ) {
+ if ( !$options['code'] ) {
$options['code'] = $data['code'];
}
unset( $data['code'], $data['info'] );
- $options['data'] = array_merge( $data['code'], $options['data'] );
+ $options['data'] = array_merge( $data, $options['data'] );
}
if ( isset( $options['wrap'] ) ) {
);
}
+ /**
+ * @dataProvider provideGetMessageFromException
+ * @covers ApiErrorFormatter::getMessageFromException
+ * @covers ApiErrorFormatter::formatException
+ * @param Exception $exception
+ * @param array $options
+ * @param array $expect
+ */
+ public function testGetMessageFromException( $exception, $options, $expect ) {
+ $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() {
+ 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' => [
+ new UsageException( '<b>Something broke!</b>', 'ue-code', 0, [ 'xxx' => 'yyy', 'baz' => 23 ] ),
+ [],
+ [
+ 'text' => '<b>Something broke!</b>',
+ 'code' => 'ue-code',
+ 'data' => [ 'xxx' => 'yyy', 'baz' => 23 ],
+ ]
+ ],
+ 'UsageException, wrapped' => [
+ new UsageException( '<b>Something broke!</b>', 'ue-code', 0, [ 'xxx' => 'yyy', 'baz' => 23 ] ),
+ [ '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 ],
+ ]
+ ],
+ ];
+ }
+
}