summaryrefslogtreecommitdiff
path: root/tests/phpunit/includes/OutputPageTest.php
blob: 4084fb1799f44ef5fbaa5e4fe698454b77662b4a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
<?php

/**
 *
 * @author Matthew Flaschen
 *
 * @group Output
 *
 */
class OutputPageTest extends MediaWikiTestCase {
	const SCREEN_MEDIA_QUERY = 'screen and (min-width: 982px)';
	const SCREEN_ONLY_MEDIA_QUERY = 'only screen and (min-width: 982px)';

	/**
	 * Tests a particular case of transformCssMedia, using the given input, globals,
	 * expected return, and message
	 *
	 * Asserts that $expectedReturn is returned.
	 *
	 * options['printableQuery'] - value of query string for printable, or omitted for none
	 * options['handheldQuery'] - value of query string for handheld, or omitted for none
	 * options['handheldForIPhone'] - value of the $wgHandheldForIPhone global
	 * options['media'] - passed into the method under the same name
	 * options['expectedReturn'] - expected return value
	 * options['message'] - PHPUnit message for assertion
	 *
	 * @param array $args key-value array of arguments as shown above
	 */
	protected function assertTransformCssMediaCase( $args ) {
		$queryData = array();
		if ( isset( $args['printableQuery'] ) ) {
			$queryData['printable'] = $args['printableQuery'];
		}

		if ( isset( $args['handheldQuery'] ) ) {
			$queryData['handheld'] = $args['handheldQuery'];
		}

		$fauxRequest = new FauxRequest( $queryData, false );
		$this->setMWGlobals( array(
			'wgRequest' => $fauxRequest,
			'wgHandheldForIPhone' => $args['handheldForIPhone']
		) );

		$actualReturn = OutputPage::transformCssMedia( $args['media'] );
		$this->assertSame( $args['expectedReturn'], $actualReturn, $args['message'] );
	}

	/**
	 * Tests a case of transformCssMedia with both values of wgHandheldForIPhone.
	 * Used to verify that behavior is orthogonal to that option.
	 *
	 * If the value of wgHandheldForIPhone should matter, use assertTransformCssMediaCase.
	 *
	 * @param array $args key-value array of arguments as shown in assertTransformCssMediaCase.
	 * Will be mutated.
	 */
	protected function assertTransformCssMediaCaseWithBothHandheldForIPhone( $args ) {
		$message = $args['message'];
		foreach ( array( true, false ) as $handheldForIPhone ) {
			$args['handheldForIPhone'] = $handheldForIPhone;
			$stringHandheldForIPhone = var_export( $handheldForIPhone, true );
			$args['message'] = "$message. \$wgHandheldForIPhone was $stringHandheldForIPhone";
			$this->assertTransformCssMediaCase( $args );
		}
	}

	/**
	 * Tests print requests
	 */
	public function testPrintRequests() {
		$this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
			'printableQuery' => '1',
			'media' => 'screen',
			'expectedReturn' => null,
			'message' => 'On printable request, screen returns null'
		) );

		$this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
			'printableQuery' => '1',
			'media' => self::SCREEN_MEDIA_QUERY,
			'expectedReturn' => null,
			'message' => 'On printable request, screen media query returns null'
		) );

		$this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
			'printableQuery' => '1',
			'media' => self::SCREEN_ONLY_MEDIA_QUERY,
			'expectedReturn' => null,
			'message' => 'On printable request, screen media query with only returns null'
		) );

		$this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
			'printableQuery' => '1',
			'media' => 'print',
			'expectedReturn' => '',
			'message' => 'On printable request, media print returns empty string'
		) );
	}

	/**
	 * Tests screen requests, without either query parameter set
	 */
	public function testScreenRequests() {
		$this->assertTransformCssMediaCase( array(
			'handheldForIPhone' => false,
			'media' => 'screen',
			'expectedReturn' => 'screen',
			'message' => 'On screen request, with handheldForIPhone false, screen media type is preserved'
		) );

		$this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
			'media' => self::SCREEN_MEDIA_QUERY,
			'expectedReturn' => self::SCREEN_MEDIA_QUERY,
			'message' => 'On screen request, screen media query is preserved.'
		) );

		$this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
			'media' => self::SCREEN_ONLY_MEDIA_QUERY,
			'expectedReturn' => self::SCREEN_ONLY_MEDIA_QUERY,
			'message' => 'On screen request, screen media query with only is preserved.'
		) );

		$this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
			'media' => 'print',
			'expectedReturn' => 'print',
			'message' => 'On screen request, print media type is preserved'
		) );
	}

	/**
	 * Tests handheld and wgHandheldForIPhone behavior
	 */
	public function testHandheld() {
		$this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
			'handheldQuery' => '1',
			'media' => 'handheld',
			'expectedReturn' => '',
			'message' => 'On request with handheld querystring and media is handheld, returns empty string'
		) );

		$this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
			'handheldQuery' => '1',
			'media' => 'screen',
			'expectedReturn' => null,
			'message' => 'On request with handheld querystring and media is screen, returns null'
		) );

		// A bit counter-intuitively, $wgHandheldForIPhone should only matter if the query handheld is false or omitted
		$this->assertTransformCssMediaCase( array(
			'handheldQuery' => '0',
			'media' => 'screen',
			'handheldForIPhone' => true,
			'expectedReturn' => 'screen and (min-device-width: 481px)',
			'message' => 'With $wgHandheldForIPhone true, screen media type is transformed'
		) );

		$this->assertTransformCssMediaCase( array(
			'media' => 'handheld',
			'handheldForIPhone' => true,
			'expectedReturn' => 'handheld, only screen and (max-device-width: 480px)',
			'message' => 'With $wgHandheldForIPhone true, handheld media type is transformed'
		) );

		$this->assertTransformCssMediaCase( array(
			'media' => 'handheld',
			'handheldForIPhone' => false,
			'expectedReturn' => 'handheld',
			'message' => 'With $wgHandheldForIPhone false, handheld media type is preserved'
		) );
	}
}