summaryrefslogtreecommitdiff
path: root/tests/phpunit/includes/specials/SpecialRecentchanges.php
blob: a98e7c1a391b69f7aa4531edf55462a56868da48 (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
<?php
/**
 * Test class for SpecialRecentchanges class
 *
 * Copyright © 2011, Ashar Voultoiz
 *
 * @author Ashar Voultoiz
 */
class SpecialRecentchangesTest extends MediaWikiTestCase {

	/**
	 * @var SpecialRecentChanges
	 */
	protected $rc;

	function setUp() {
	}

	/** helper to test SpecialRecentchanges::buildMainQueryConds() */
	private function assertConditions( $expected, $requestOptions = null, $message = '' ) {
		global $wgRequest;
		$savedGlobal = $wgRequest;

		# Initialize a WebRequest object ...
		$wgRequest = new FauxRequest( $requestOptions );
		# ... then setup the rc object (which use wgRequest internally)
		$this->rc = new SpecialRecentChanges();
		$formOptions = $this->rc->setup( null );

		# Filter out rc_timestamp conditions which depends on the test runtime
		# This condition is not needed as of march 2, 2011 -- hashar
		# @todo FIXME: Find a way to generate the correct rc_timestamp
		$queryConditions = array_filter(
			$this->rc->buildMainQueryConds( $formOptions ),
			'SpecialRecentchangesTest::filterOutRcTimestampCondition'
		);

		$this->assertEquals(
			$expected,
			$queryConditions,
			$message
		);

		$wgRequest = $savedGlobal;
	}

	/** return false if condition begin with 'rc_timestamp ' */
	private static function filterOutRcTimestampCondition( $var ) {
		return (false === strpos( $var, 'rc_timestamp ' ));

	}

	public function testRcNsFilter() {
		$this->assertConditions(
			array( # expected
				'rc_bot' => 0,
				#0 => "rc_timestamp >= '20110223000000'",
				1 => "rc_namespace = '0'",
			),
			array(
				'namespace' => NS_MAIN,
			),
			"rc conditions with no options (aka default setting)"
		);
	}

	public function testRcNsFilterInversion() {
		$this->assertConditions(
			array( # expected
				#0 => "rc_timestamp >= '20110223000000'",
				'rc_bot' => 0,
				1 => sprintf( "rc_namespace != '%s'", NS_MAIN ),
			),
			array(
				'namespace' => NS_MAIN,
				'invert' => 1,
			),
		  "rc conditions with namespace inverted"
		);
	}

	/**
	 * @bug 2429
	 * @dataProvider provideNamespacesAssociations
	 */
	public function testRcNsFilterAssociation( $ns1, $ns2 ) {
		$this->assertConditions(
			array( # expected
				#0 => "rc_timestamp >= '20110223000000'",
				'rc_bot' => 0,
				1 => sprintf( "(rc_namespace = '%s' OR rc_namespace = '%s')", $ns1, $ns2 ),
			),
			array(
				'namespace' => $ns1,
				'associated' => 1,
			),
		  "rc conditions with namespace inverted"
		);
	}

	/**
	 * @bug 2429
	 * @dataProvider provideNamespacesAssociations
	 */
	public function testRcNsFilterAssociationWithInversion( $ns1, $ns2 ) {
		$this->assertConditions(
			array( # expected
				#0 => "rc_timestamp >= '20110223000000'",
				'rc_bot' => 0,
				1 => sprintf( "(rc_namespace != '%s' AND rc_namespace != '%s')", $ns1, $ns2 ),
			),
			array(
				'namespace'  => $ns1,
				'associated' => 1,
				'invert'     => 1,
			),
		  "rc conditions with namespace inverted"
		);
	}

	/**
	 * Provides associated namespaces to test recent changes
	 * namespaces association filtering.
	 */
	public function provideNamespacesAssociations() {
		return array( # (NS => Associated_NS)
			array( NS_MAIN, NS_TALK),
			array( NS_TALK, NS_MAIN),
		);
	}

}