Merge "registration: Only allow one extension to set a specific config setting"
[lhc/web/wiklou.git] / tests / phpunit / includes / changes / RecentChangeTest.php
1 <?php
2 use Wikimedia\ScopedCallback;
3
4 /**
5 * @group Database
6 */
7 class RecentChangeTest extends MediaWikiTestCase {
8 protected $title;
9 protected $target;
10 protected $user;
11 protected $user_comment;
12 protected $context;
13
14 public function setUp() {
15 parent::setUp();
16
17 $this->title = Title::newFromText( 'SomeTitle' );
18 $this->target = Title::newFromText( 'TestTarget' );
19 $this->user = User::newFromName( 'UserName' );
20
21 $this->user_comment = '<User comment about action>';
22 $this->context = RequestContext::newExtraneousContext( $this->title );
23 }
24
25 /**
26 * @covers RecentChange::newFromRow
27 * @covers RecentChange::loadFromRow
28 */
29 public function testNewFromRow() {
30 $row = new stdClass();
31 $row->rc_foo = 'AAA';
32 $row->rc_timestamp = '20150921134808';
33 $row->rc_deleted = 'bar';
34 $row->rc_comment_text = 'comment';
35 $row->rc_comment_data = null;
36
37 $rc = RecentChange::newFromRow( $row );
38
39 $expected = [
40 'rc_foo' => 'AAA',
41 'rc_timestamp' => '20150921134808',
42 'rc_deleted' => 'bar',
43 'rc_comment' => 'comment',
44 'rc_comment_text' => 'comment',
45 'rc_comment_data' => null,
46 ];
47 $this->assertEquals( $expected, $rc->getAttributes() );
48
49 $row = new stdClass();
50 $row->rc_foo = 'AAA';
51 $row->rc_timestamp = '20150921134808';
52 $row->rc_deleted = 'bar';
53 $row->rc_comment = 'comment';
54
55 MediaWiki\suppressWarnings();
56 $rc = RecentChange::newFromRow( $row );
57 MediaWiki\restoreWarnings();
58
59 $expected = [
60 'rc_foo' => 'AAA',
61 'rc_timestamp' => '20150921134808',
62 'rc_deleted' => 'bar',
63 'rc_comment' => 'comment',
64 'rc_comment_text' => 'comment',
65 'rc_comment_data' => null,
66 ];
67 $this->assertEquals( $expected, $rc->getAttributes() );
68 }
69
70 /**
71 * @covers RecentChange::parseParams
72 */
73 public function testParseParams() {
74 $params = [
75 'root' => [
76 'A' => 1,
77 'B' => 'two'
78 ]
79 ];
80
81 $this->assertParseParams(
82 $params,
83 'a:1:{s:4:"root";a:2:{s:1:"A";i:1;s:1:"B";s:3:"two";}}'
84 );
85
86 $this->assertParseParams(
87 null,
88 null
89 );
90
91 $this->assertParseParams(
92 null,
93 serialize( false )
94 );
95
96 $this->assertParseParams(
97 null,
98 'not-an-array'
99 );
100 }
101
102 /**
103 * @param array $expectedParseParams
104 * @param string|null $rawRcParams
105 */
106 protected function assertParseParams( $expectedParseParams, $rawRcParams ) {
107 $rc = new RecentChange;
108 $rc->setAttribs( [ 'rc_params' => $rawRcParams ] );
109
110 $actualParseParams = $rc->parseParams();
111
112 $this->assertEquals( $expectedParseParams, $actualParseParams );
113 }
114
115 /**
116 * @return array
117 */
118 public function provideIsInRCLifespan() {
119 return [
120 [ 6000, -3000, 0, true ],
121 [ 3000, -6000, 0, false ],
122 [ 6000, -3000, 6000, true ],
123 [ 3000, -6000, 6000, true ],
124 ];
125 }
126
127 /**
128 * @covers RecentChange::isInRCLifespan
129 * @dataProvider provideIsInRCLifespan
130 */
131 public function testIsInRCLifespan( $maxAge, $offset, $tolerance, $expected ) {
132 $this->setMwGlobals( 'wgRCMaxAge', $maxAge );
133 // Calculate this here instead of the data provider because the provider
134 // is expanded early on and the full test suite may take longer than 100 minutes
135 // when coverage is enabled.
136 $timestamp = time() + $offset;
137 $this->assertEquals( $expected, RecentChange::isInRCLifespan( $timestamp, $tolerance ) );
138 }
139
140 public function provideRCTypes() {
141 return [
142 [ RC_EDIT, 'edit' ],
143 [ RC_NEW, 'new' ],
144 [ RC_LOG, 'log' ],
145 [ RC_EXTERNAL, 'external' ],
146 [ RC_CATEGORIZE, 'categorize' ],
147 ];
148 }
149
150 /**
151 * @dataProvider provideRCTypes
152 * @covers RecentChange::parseFromRCType
153 */
154 public function testParseFromRCType( $rcType, $type ) {
155 $this->assertEquals( $type, RecentChange::parseFromRCType( $rcType ) );
156 }
157
158 /**
159 * @dataProvider provideRCTypes
160 * @covers RecentChange::parseToRCType
161 */
162 public function testParseToRCType( $rcType, $type ) {
163 $this->assertEquals( $rcType, RecentChange::parseToRCType( $type ) );
164 }
165
166 /**
167 * @return PHPUnit_Framework_MockObject_MockObject|PageProps
168 */
169 private function getMockPageProps() {
170 return $this->getMockBuilder( PageProps::class )
171 ->disableOriginalConstructor()
172 ->getMock();
173 }
174
175 public function provideCategoryContent() {
176 return [
177 [ true ],
178 [ false ],
179 ];
180 }
181
182 /**
183 * @dataProvider provideCategoryContent
184 * @covers RecentChange::newForCategorization
185 */
186 public function testHiddenCategoryChange( $isHidden ) {
187 $categoryTitle = Title::newFromText( 'CategoryPage', NS_CATEGORY );
188
189 $pageProps = $this->getMockPageProps();
190 $pageProps->expects( $this->once() )
191 ->method( 'getProperties' )
192 ->with( $categoryTitle, 'hiddencat' )
193 ->will( $this->returnValue( $isHidden ? [ $categoryTitle->getArticleID() => '' ] : [] ) );
194
195 $scopedOverride = PageProps::overrideInstance( $pageProps );
196
197 $rc = RecentChange::newForCategorization(
198 '0',
199 $categoryTitle,
200 $this->user,
201 $this->user_comment,
202 $this->title,
203 $categoryTitle->getLatestRevID(),
204 $categoryTitle->getLatestRevID(),
205 '0',
206 false
207 );
208
209 $this->assertEquals( $isHidden, $rc->getParam( 'hidden-cat' ) );
210
211 ScopedCallback::consume( $scopedOverride );
212 }
213 }