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