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