Move ResultWrapper subclasses to Rdbms
[mediawiki.git] / tests / phpunit / includes / api / format / ApiFormatPhpTest.php
blob3aa1db301057b922726d503939b1d3f6496db480
1 <?php
3 /**
4 * @group API
5 * @covers ApiFormatPhp
6 */
7 class ApiFormatPhpTest extends ApiFormatTestBase {
9 protected $printerName = 'php';
11 private static function addFormatVersion( $format, $arr ) {
12 foreach ( $arr as &$p ) {
13 if ( !isset( $p[2] ) ) {
14 $p[2] = [ 'formatversion' => $format ];
15 } else {
16 $p[2]['formatversion'] = $format;
19 return $arr;
22 public static function provideGeneralEncoding() {
23 // @codingStandardsIgnoreStart Generic.Files.LineLength
24 return array_merge(
25 self::addFormatVersion( 1, [
26 // Basic types
27 [ [ null ], 'a:1:{i:0;N;}' ],
28 [ [ true ], 'a:1:{i:0;s:0:"";}' ],
29 [ [ false ], 'a:0:{}' ],
30 [ [ true, ApiResult::META_BC_BOOLS => [ 0 ] ],
31 'a:1:{i:0;b:1;}' ],
32 [ [ false, ApiResult::META_BC_BOOLS => [ 0 ] ],
33 'a:1:{i:0;b:0;}' ],
34 [ [ 42 ], 'a:1:{i:0;i:42;}' ],
35 [ [ 42.5 ], 'a:1:{i:0;d:42.5;}' ],
36 [ [ 1e42 ], 'a:1:{i:0;d:1.0E+42;}' ],
37 [ [ 'foo' ], 'a:1:{i:0;s:3:"foo";}' ],
38 [ [ 'fóo' ], 'a:1:{i:0;s:4:"fóo";}' ],
40 // Arrays and objects
41 [ [ [] ], 'a:1:{i:0;a:0:{}}' ],
42 [ [ [ 1 ] ], 'a:1:{i:0;a:1:{i:0;i:1;}}' ],
43 [ [ [ 'x' => 1 ] ], 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ],
44 [ [ [ 2 => 1 ] ], 'a:1:{i:0;a:1:{i:2;i:1;}}' ],
45 [ [ (object)[] ], 'a:1:{i:0;a:0:{}}' ],
46 [ [ [ 1, ApiResult::META_TYPE => 'assoc' ] ], 'a:1:{i:0;a:1:{i:0;i:1;}}' ],
47 [ [ [ 'x' => 1, ApiResult::META_TYPE => 'array' ] ], 'a:1:{i:0;a:1:{i:0;i:1;}}' ],
48 [ [ [ 'x' => 1, ApiResult::META_TYPE => 'kvp' ] ], 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ],
49 [ [ [ 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ] ],
50 'a:1:{i:0;a:1:{i:0;a:2:{s:3:"key";s:1:"x";s:1:"*";i:1;}}}' ],
51 [ [ [ 'x' => 1, ApiResult::META_TYPE => 'BCarray' ] ], 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ],
52 [ [ [ 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ] ], 'a:1:{i:0;a:2:{i:0;s:1:"a";i:1;s:1:"b";}}' ],
54 // Content
55 [ [ 'content' => 'foo', ApiResult::META_CONTENT => 'content' ],
56 'a:1:{s:1:"*";s:3:"foo";}' ],
58 // BC Subelements
59 [ [ 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => [ 'foo' ] ],
60 'a:1:{s:3:"foo";a:1:{s:1:"*";s:3:"foo";}}' ],
61 ] ),
62 self::addFormatVersion( 2, [
63 // Basic types
64 [ [ null ], 'a:1:{i:0;N;}' ],
65 [ [ true ], 'a:1:{i:0;b:1;}' ],
66 [ [ false ], 'a:1:{i:0;b:0;}' ],
67 [ [ true, ApiResult::META_BC_BOOLS => [ 0 ] ],
68 'a:1:{i:0;b:1;}' ],
69 [ [ false, ApiResult::META_BC_BOOLS => [ 0 ] ],
70 'a:1:{i:0;b:0;}' ],
71 [ [ 42 ], 'a:1:{i:0;i:42;}' ],
72 [ [ 42.5 ], 'a:1:{i:0;d:42.5;}' ],
73 [ [ 1e42 ], 'a:1:{i:0;d:1.0E+42;}' ],
74 [ [ 'foo' ], 'a:1:{i:0;s:3:"foo";}' ],
75 [ [ 'fóo' ], 'a:1:{i:0;s:4:"fóo";}' ],
77 // Arrays and objects
78 [ [ [] ], 'a:1:{i:0;a:0:{}}' ],
79 [ [ [ 1 ] ], 'a:1:{i:0;a:1:{i:0;i:1;}}' ],
80 [ [ [ 'x' => 1 ] ], 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ],
81 [ [ [ 2 => 1 ] ], 'a:1:{i:0;a:1:{i:2;i:1;}}' ],
82 [ [ (object)[] ], 'a:1:{i:0;a:0:{}}' ],
83 [ [ [ 1, ApiResult::META_TYPE => 'assoc' ] ], 'a:1:{i:0;a:1:{i:0;i:1;}}' ],
84 [ [ [ 'x' => 1, ApiResult::META_TYPE => 'array' ] ], 'a:1:{i:0;a:1:{i:0;i:1;}}' ],
85 [ [ [ 'x' => 1, ApiResult::META_TYPE => 'kvp' ] ], 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ],
86 [ [ [ 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ] ],
87 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ],
88 [ [ [ 'x' => 1, ApiResult::META_TYPE => 'BCarray' ] ], 'a:1:{i:0;a:1:{i:0;i:1;}}' ],
89 [ [ [ 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ] ], 'a:1:{i:0;a:2:{i:0;s:1:"a";i:1;s:1:"b";}}' ],
91 // Content
92 [ [ 'content' => 'foo', ApiResult::META_CONTENT => 'content' ],
93 'a:1:{s:7:"content";s:3:"foo";}' ],
95 // BC Subelements
96 [ [ 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => [ 'foo' ] ],
97 'a:1:{s:3:"foo";s:3:"foo";}' ],
98 ] )
100 // @codingStandardsIgnoreEnd
103 public function testCrossDomainMangling() {
104 $config = new HashConfig( [ 'MangleFlashPolicy' => false ] );
105 $context = new RequestContext;
106 $context->setConfig( new MultiConfig( [
107 $config,
108 $context->getConfig(),
109 ] ) );
110 $main = new ApiMain( $context );
111 $main->getResult()->addValue( null, null, '< Cross-Domain-Policy >' );
113 if ( !function_exists( 'wfOutputHandler' ) ) {
114 function wfOutputHandler( $s ) {
115 return $s;
119 $printer = $main->createPrinterByName( 'php' );
120 ob_start( 'wfOutputHandler' );
121 $printer->initPrinter();
122 $printer->execute();
123 $printer->closePrinter();
124 $ret = ob_get_clean();
125 $this->assertSame( 'a:1:{i:0;s:23:"< Cross-Domain-Policy >";}', $ret );
127 $config->set( 'MangleFlashPolicy', true );
128 $printer = $main->createPrinterByName( 'php' );
129 ob_start( 'wfOutputHandler' );
130 try {
131 $printer->initPrinter();
132 $printer->execute();
133 $printer->closePrinter();
134 ob_end_clean();
135 $this->fail( 'Expected exception not thrown' );
136 } catch ( ApiUsageException $ex ) {
137 ob_end_clean();
138 $this->assertTrue(
139 $ex->getStatusValue()->hasMessage( 'apierror-formatphp' ),
140 'Expected exception'