Merge "Push common search api parameters into SearchApi class"
[lhc/web/wiklou.git] / tests / phpunit / includes / changes / RCCacheEntryFactoryTest.php
1 <?php
2
3 use MediaWiki\Linker\LinkRenderer;
4 use MediaWiki\MediaWikiServices;
5
6 /**
7 * @covers RCCacheEntryFactory
8 *
9 * @group Database
10 *
11 * @author Katie Filbert < aude.wiki@gmail.com >
12 */
13 class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
14
15 /**
16 * @var TestRecentChangesHelper
17 */
18 private $testRecentChangesHelper;
19
20 /**
21 * @var LinkRenderer;
22 */
23 private $linkRenderer;
24
25 public function __construct( $name = null, array $data = [], $dataName = '' ) {
26 parent::__construct( $name, $data, $dataName );
27
28 $this->testRecentChangesHelper = new TestRecentChangesHelper();
29 }
30
31 protected function setUp() {
32 parent::setUp();
33
34 $this->setMwGlobals( [
35 'wgArticlePath' => '/wiki/$1'
36 ] );
37
38 $this->linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
39 }
40
41 public function testNewFromRecentChange() {
42 $user = $this->getMutableTestUser()->getUser();
43 $recentChange = $this->testRecentChangesHelper->makeEditRecentChange(
44 $user,
45 'Xyz',
46 5, // curid
47 191, // thisid
48 190, // lastid
49 '20131103212153',
50 0, // counter
51 0 // number of watching users
52 );
53 $cacheEntryFactory = new RCCacheEntryFactory(
54 $this->getContext(),
55 $this->getMessages(),
56 $this->linkRenderer
57 );
58 $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, false );
59
60 $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
61
62 $this->assertEquals( false, $cacheEntry->watched, 'watched' );
63 $this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
64 $this->assertEquals( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
65 $this->assertEquals( false, $cacheEntry->unpatrolled, 'unpatrolled' );
66
67 $this->assertUserLinks( $user->getName(), $cacheEntry );
68 $this->assertTitleLink( 'Xyz', $cacheEntry );
69
70 $diff = [ 'curid' => 5, 'diff' => 191, 'oldid' => 190 ];
71 $cur = [ 'curid' => 5, 'diff' => 0, 'oldid' => 191 ];
72 $this->assertQueryLink( 'cur', $cur, $cacheEntry->curlink, 'cur link' );
73 $this->assertQueryLink( 'prev', $diff, $cacheEntry->lastlink, 'prev link' );
74 $this->assertQueryLink( 'diff', $diff, $cacheEntry->difflink, 'diff link' );
75 }
76
77 public function testNewForDeleteChange() {
78 $expected = [
79 'title' => 'Abc',
80 'user' => 'TestRecentChangesUser',
81 'timestamp' => '21:21',
82 'numberofWatchingusers' => 0,
83 'unpatrolled' => false
84 ];
85 $user = $this->getMutableTestUser()->getUser();
86 $recentChange = $this->testRecentChangesHelper->makeLogRecentChange(
87 'delete',
88 'delete',
89 $user,
90 'Abc',
91 '20131103212153',
92 0, // counter
93 0 // number of watching users
94 );
95 $cacheEntryFactory = new RCCacheEntryFactory(
96 $this->getContext(),
97 $this->getMessages(),
98 $this->linkRenderer
99 );
100 $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, false );
101
102 $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
103
104 $this->assertEquals( false, $cacheEntry->watched, 'watched' );
105 $this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
106 $this->assertEquals( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
107 $this->assertEquals( false, $cacheEntry->unpatrolled, 'unpatrolled' );
108
109 $this->assertDeleteLogLink( $cacheEntry );
110 $this->assertUserLinks( $user->getName(), $cacheEntry );
111
112 $this->assertEquals( 'cur', $cacheEntry->curlink, 'cur link for delete log or rev' );
113 $this->assertEquals( 'diff', $cacheEntry->difflink, 'diff link for delete log or rev' );
114 $this->assertEquals( 'prev', $cacheEntry->lastlink, 'pref link for delete log or rev' );
115 }
116
117 public function testNewForRevUserDeleteChange() {
118 $user = $this->getMutableTestUser()->getUser();
119 $recentChange = $this->testRecentChangesHelper->makeDeletedEditRecentChange(
120 $user,
121 'Zzz',
122 '20131103212153',
123 191, // thisid
124 190, // lastid
125 '20131103212153',
126 0, // counter
127 0 // number of watching users
128 );
129 $cacheEntryFactory = new RCCacheEntryFactory(
130 $this->getContext(),
131 $this->getMessages(),
132 $this->linkRenderer
133 );
134 $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, false );
135
136 $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
137
138 $this->assertEquals( false, $cacheEntry->watched, 'watched' );
139 $this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
140 $this->assertEquals( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
141 $this->assertEquals( false, $cacheEntry->unpatrolled, 'unpatrolled' );
142
143 $this->assertRevDel( $cacheEntry );
144 $this->assertTitleLink( 'Zzz', $cacheEntry );
145
146 $this->assertEquals( 'cur', $cacheEntry->curlink, 'cur link for delete log or rev' );
147 $this->assertEquals( 'diff', $cacheEntry->difflink, 'diff link for delete log or rev' );
148 $this->assertEquals( 'prev', $cacheEntry->lastlink, 'pref link for delete log or rev' );
149 }
150
151 private function assertUserLinks( $user, $cacheEntry ) {
152 $this->assertTag(
153 [
154 'tag' => 'a',
155 'attributes' => [
156 'class' => 'new mw-userlink'
157 ],
158 'content' => $user
159 ],
160 $cacheEntry->userlink,
161 'verify user link'
162 );
163
164 $this->assertTag(
165 [
166 'tag' => 'span',
167 'attributes' => [
168 'class' => 'mw-usertoollinks'
169 ],
170 'child' => [
171 'tag' => 'a',
172 'content' => 'talk',
173 ]
174 ],
175 $cacheEntry->usertalklink,
176 'verify user talk link'
177 );
178
179 $this->assertTag(
180 [
181 'tag' => 'span',
182 'attributes' => [
183 'class' => 'mw-usertoollinks'
184 ],
185 'child' => [
186 'tag' => 'a',
187 'content' => 'contribs',
188 ]
189 ],
190 $cacheEntry->usertalklink,
191 'verify user tool links'
192 );
193 }
194
195 private function assertDeleteLogLink( $cacheEntry ) {
196 $this->assertTag(
197 [
198 'tag' => 'a',
199 'attributes' => [
200 'href' => '/wiki/Special:Log/delete',
201 'title' => 'Special:Log/delete'
202 ],
203 'content' => 'Deletion log'
204 ],
205 $cacheEntry->link,
206 'verify deletion log link'
207 );
208 }
209
210 private function assertRevDel( $cacheEntry ) {
211 $this->assertTag(
212 [
213 'tag' => 'span',
214 'attributes' => [
215 'class' => 'history-deleted'
216 ],
217 'content' => '(username removed)'
218 ],
219 $cacheEntry->userlink,
220 'verify user link for change with deleted revision and user'
221 );
222 }
223
224 private function assertTitleLink( $title, $cacheEntry ) {
225 $this->assertTag(
226 [
227 'tag' => 'a',
228 'attributes' => [
229 'href' => '/wiki/' . $title,
230 'title' => $title
231 ],
232 'content' => $title
233 ],
234 $cacheEntry->link,
235 'verify title link'
236 );
237 }
238
239 private function assertQueryLink( $content, $params, $link ) {
240 $this->assertTag(
241 [
242 'tag' => 'a',
243 'content' => $content
244 ],
245 $link,
246 'assert query link element'
247 );
248
249 foreach ( $params as $key => $value ) {
250 $this->assertRegExp( '/' . $key . '=' . $value . '/', $link, "verify $key link params" );
251 }
252 }
253
254 private function getMessages() {
255 return [
256 'cur' => 'cur',
257 'diff' => 'diff',
258 'hist' => 'hist',
259 'enhancedrc-history' => 'history',
260 'last' => 'prev',
261 'blocklink' => 'block',
262 'history' => 'Page history',
263 'semicolon-separator' => '; ',
264 'pipe-separator' => ' | '
265 ];
266 }
267
268 private function getContext() {
269 $user = $this->getMutableTestUser()->getUser();
270 $context = $this->testRecentChangesHelper->getTestContext( $user );
271
272 $title = Title::newFromText( 'RecentChanges', NS_SPECIAL );
273 $context->setTitle( $title );
274
275 return $context;
276 }
277 }