1<?php 2 3namespace MediaWiki\Tests\Rest; 4 5use MediaWiki\Rest\HeaderContainer; 6 7/** 8 * @covers \MediaWiki\Rest\HeaderContainer 9 */ 10class HeaderContainerTest extends \MediaWikiUnitTestCase { 11 public static function provideSetHeader() { 12 return [ 13 'simple' => [ 14 [ 15 [ 'Test', 'foo' ] 16 ], 17 [ 'Test' => [ 'foo' ] ], 18 [ 'Test' => 'foo' ] 19 ], 20 'replace' => [ 21 [ 22 [ 'Test', 'foo' ], 23 [ 'Test', 'bar' ], 24 ], 25 [ 'Test' => [ 'bar' ] ], 26 [ 'Test' => 'bar' ], 27 ], 28 'array value' => [ 29 [ 30 [ 'Test', [ '1', '2' ] ], 31 [ 'Test', [ '3', '4' ] ], 32 ], 33 [ 'Test' => [ '3', '4' ] ], 34 [ 'Test' => '3, 4' ] 35 ], 36 'preserve most recent case' => [ 37 [ 38 [ 'test', 'foo' ], 39 [ 'tesT', 'bar' ], 40 ], 41 [ 'tesT' => [ 'bar' ] ], 42 [ 'tesT' => 'bar' ] 43 ], 44 'empty' => [ [], [], [] ], 45 ]; 46 } 47 48 /** @dataProvider provideSetHeader */ 49 public function testSetHeader( $setOps, $headers, $lines ) { 50 $hc = new HeaderContainer; 51 foreach ( $setOps as list( $name, $value ) ) { 52 $hc->setHeader( $name, $value ); 53 } 54 $this->assertSame( $headers, $hc->getHeaders() ); 55 $this->assertSame( $lines, $hc->getHeaderLines() ); 56 } 57 58 public static function provideAddHeader() { 59 return [ 60 'simple' => [ 61 [ 62 [ 'Test', 'foo' ] 63 ], 64 [ 'Test' => [ 'foo' ] ], 65 [ 'Test' => 'foo' ] 66 ], 67 'add' => [ 68 [ 69 [ 'Test', 'foo' ], 70 [ 'Test', 'bar' ], 71 ], 72 [ 'Test' => [ 'foo', 'bar' ] ], 73 [ 'Test' => 'foo, bar' ], 74 ], 75 'array value' => [ 76 [ 77 [ 'Test', [ '1', '2' ] ], 78 [ 'Test', [ '3', '4' ] ], 79 ], 80 [ 'Test' => [ '1', '2', '3', '4' ] ], 81 [ 'Test' => '1, 2, 3, 4' ] 82 ], 83 'preserve original case' => [ 84 [ 85 [ 'Test', 'foo' ], 86 [ 'tesT', 'bar' ], 87 ], 88 [ 'Test' => [ 'foo', 'bar' ] ], 89 [ 'Test' => 'foo, bar' ] 90 ], 91 ]; 92 } 93 94 /** @dataProvider provideAddHeader */ 95 public function testAddHeader( $addOps, $headers, $lines ) { 96 $hc = new HeaderContainer; 97 foreach ( $addOps as list( $name, $value ) ) { 98 $hc->addHeader( $name, $value ); 99 } 100 $this->assertSame( $headers, $hc->getHeaders() ); 101 $this->assertSame( $lines, $hc->getHeaderLines() ); 102 } 103 104 public static function provideRemoveHeader() { 105 return [ 106 'simple' => [ 107 [ [ 'Test', 'foo' ] ], 108 [ 'Test' ], 109 [], 110 [] 111 ], 112 'case mismatch' => [ 113 [ [ 'Test', 'foo' ] ], 114 [ 'tesT' ], 115 [], 116 [] 117 ], 118 'remove nonexistent' => [ 119 [ [ 'A', '1' ] ], 120 [ 'B' ], 121 [ 'A' => [ '1' ] ], 122 [ 'A' => '1' ] 123 ], 124 ]; 125 } 126 127 /** @dataProvider provideRemoveHeader */ 128 public function testRemoveHeader( $addOps, $removeOps, $headers, $lines ) { 129 $hc = new HeaderContainer; 130 foreach ( $addOps as list( $name, $value ) ) { 131 $hc->addHeader( $name, $value ); 132 } 133 foreach ( $removeOps as $name ) { 134 $hc->removeHeader( $name ); 135 } 136 $this->assertSame( $headers, $hc->getHeaders() ); 137 $this->assertSame( $lines, $hc->getHeaderLines() ); 138 } 139 140 public function testHasHeader() { 141 $hc = new HeaderContainer; 142 $hc->addHeader( 'A', '1' ); 143 $hc->addHeader( 'B', '2' ); 144 $hc->addHeader( 'C', '3' ); 145 $hc->removeHeader( 'B' ); 146 $hc->removeHeader( 'c' ); 147 $this->assertTrue( $hc->hasHeader( 'A' ) ); 148 $this->assertTrue( $hc->hasHeader( 'a' ) ); 149 $this->assertFalse( $hc->hasHeader( 'B' ) ); 150 $this->assertFalse( $hc->hasHeader( 'c' ) ); 151 $this->assertFalse( $hc->hasHeader( 'C' ) ); 152 } 153 154 public function testGetRawHeaderLines() { 155 $hc = new HeaderContainer; 156 $hc->addHeader( 'A', '1' ); 157 $hc->addHeader( 'a', '2' ); 158 $hc->addHeader( 'b', '3' ); 159 $hc->addHeader( 'Set-Cookie', 'x' ); 160 $hc->addHeader( 'SET-cookie', 'y' ); 161 $this->assertSame( 162 [ 163 'A: 1, 2', 164 'b: 3', 165 'Set-Cookie: x', 166 'Set-Cookie: y', 167 ], 168 $hc->getRawHeaderLines() 169 ); 170 } 171} 172