Merge "FauxRequest: don’t override getValues()"
[lhc/web/wiklou.git] / tests / phpunit / includes / changes / EnhancedChangesListTest.php
1 <?php
2
3 /**
4 * @covers EnhancedChangesList
5 *
6 * @group Database
7 *
8 * @author Katie Filbert < aude.wiki@gmail.com >
9 */
10 class EnhancedChangesListTest 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 public function testBeginRecentChangesList_styleModules() {
24 $enhancedChangesList = $this->newEnhancedChangesList();
25 $enhancedChangesList->beginRecentChangesList();
26
27 $styleModules = $enhancedChangesList->getOutput()->getModuleStyles();
28
29 $this->assertContains(
30 'mediawiki.icon',
31 $styleModules,
32 'has mediawiki.icon'
33 );
34
35 $this->assertContains(
36 'mediawiki.special.changeslist',
37 $styleModules,
38 'has mediawiki.special.changeslist'
39 );
40
41 $this->assertContains(
42 'mediawiki.special.changeslist.enhanced',
43 $styleModules,
44 'has mediawiki.special.changeslist.enhanced'
45 );
46 }
47
48 public function testBeginRecentChangesList_jsModules() {
49 $enhancedChangesList = $this->newEnhancedChangesList();
50 $enhancedChangesList->beginRecentChangesList();
51
52 $modules = $enhancedChangesList->getOutput()->getModules();
53
54 $this->assertContains( 'jquery.makeCollapsible', $modules, 'has jquery.makeCollapsible' );
55 }
56
57 public function testBeginRecentChangesList_html() {
58 $enhancedChangesList = $this->newEnhancedChangesList();
59 $html = $enhancedChangesList->beginRecentChangesList();
60
61 $this->assertEquals( '<div class="mw-changeslist">', $html );
62 }
63
64 /**
65 * @todo more tests
66 */
67 public function testRecentChangesLine() {
68 $enhancedChangesList = $this->newEnhancedChangesList();
69 $enhancedChangesList->beginRecentChangesList();
70
71 $recentChange = $this->getEditChange( '20131103092153' );
72 $html = $enhancedChangesList->recentChangesLine( $recentChange, false );
73
74 $this->assertInternalType( 'string', $html );
75
76 $recentChange2 = $this->getEditChange( '20131103092253' );
77 $html = $enhancedChangesList->recentChangesLine( $recentChange2, false );
78
79 $this->assertSame( '', $html );
80 }
81
82 public function testRecentChangesPrefix() {
83 $mockContext = $this->getMockBuilder( RequestContext::class )
84 ->setMethods( [ 'getTitle' ] )
85 ->getMock();
86 $mockContext->method( 'getTitle' )
87 ->will( $this->returnValue( Title::newFromText( 'Expected Context Title' ) ) );
88
89 // One group of two lines
90 $enhancedChangesList = $this->newEnhancedChangesList();
91 $enhancedChangesList->setContext( $mockContext );
92 $enhancedChangesList->setChangeLinePrefixer( function ( $rc, $changesList ) {
93 // Make sure RecentChange and ChangesList objects are the same
94 $this->assertEquals( 'Expected Context Title', $changesList->getContext()->getTitle() );
95 $this->assertTrue( $rc->getTitle() == 'Cat' || $rc->getTitle() == 'Dog' );
96 return 'Hello world prefix';
97 } );
98 $enhancedChangesList->beginRecentChangesList();
99
100 $recentChange = $this->getEditChange( '20131103092153' );
101 $enhancedChangesList->recentChangesLine( $recentChange );
102 $recentChange = $this->getEditChange( '20131103092154' );
103 $enhancedChangesList->recentChangesLine( $recentChange );
104
105 $html = $enhancedChangesList->endRecentChangesList();
106
107 $this->assertRegExp( '/Hello world prefix/', $html );
108
109 // Two separate lines
110 $enhancedChangesList->beginRecentChangesList();
111
112 $recentChange = $this->getEditChange( '20131103092153' );
113 $enhancedChangesList->recentChangesLine( $recentChange );
114 $recentChange = $this->getEditChange( '20131103092154', 'Dog' );
115 $enhancedChangesList->recentChangesLine( $recentChange );
116
117 $html = $enhancedChangesList->endRecentChangesList();
118
119 preg_match_all( '/Hello world prefix/', $html, $matches );
120 $this->assertCount( 2, $matches[0] );
121 }
122
123 public function testCategorizationLineFormatting() {
124 $html = $this->createCategorizationLine(
125 $this->getCategorizationChange( '20150629191735', 0, 0 )
126 );
127 $this->assertNotContains( 'diffhist', strip_tags( $html ) );
128 }
129
130 public function testCategorizationLineFormattingWithRevision() {
131 $html = $this->createCategorizationLine(
132 $this->getCategorizationChange( '20150629191735', 1025, 1024 )
133 );
134 $this->assertContains( 'diffhist', strip_tags( $html ) );
135 }
136
137 /**
138 * @todo more tests for actual formatting, this is more of a smoke test
139 */
140 public function testEndRecentChangesList() {
141 $enhancedChangesList = $this->newEnhancedChangesList();
142 $enhancedChangesList->beginRecentChangesList();
143
144 $recentChange = $this->getEditChange( '20131103092153' );
145 $enhancedChangesList->recentChangesLine( $recentChange, false );
146
147 $html = $enhancedChangesList->endRecentChangesList();
148 $this->assertRegExp(
149 '/data-mw-revid="5" data-mw-ts="20131103092153" class="[^"]*mw-enhanced-rc[^"]*"/',
150 $html
151 );
152
153 $recentChange2 = $this->getEditChange( '20131103092253' );
154 $enhancedChangesList->recentChangesLine( $recentChange2, false );
155
156 $html = $enhancedChangesList->endRecentChangesList();
157
158 preg_match_all( '/td class="mw-enhanced-rc-nested"/', $html, $matches );
159 $this->assertCount( 2, $matches[0] );
160
161 preg_match_all( '/data-target-page="Cat"/', $html, $matches );
162 $this->assertCount( 2, $matches[0] );
163
164 $recentChange3 = $this->getLogChange();
165 $enhancedChangesList->recentChangesLine( $recentChange3, false );
166
167 $html = $enhancedChangesList->endRecentChangesList();
168 $this->assertContains( 'data-mw-logaction="foo/bar"', $html );
169 $this->assertContains( 'data-mw-logid="25"', $html );
170 $this->assertContains( 'data-target-page="Title"', $html );
171 }
172
173 /**
174 * @return EnhancedChangesList
175 */
176 private function newEnhancedChangesList() {
177 $user = User::newFromId( 0 );
178 $context = $this->testRecentChangesHelper->getTestContext( $user );
179
180 return new EnhancedChangesList( $context );
181 }
182
183 /**
184 * @return RecentChange
185 */
186 private function getEditChange( $timestamp, $pageTitle = 'Cat' ) {
187 $user = $this->getMutableTestUser()->getUser();
188 $recentChange = $this->testRecentChangesHelper->makeEditRecentChange(
189 $user, $pageTitle, 0, 5, 191, $timestamp, 0, 0
190 );
191
192 return $recentChange;
193 }
194
195 private function getLogChange() {
196 $user = $this->getMutableTestUser()->getUser();
197 $recentChange = $this->testRecentChangesHelper->makeLogRecentChange( 'foo', 'bar', $user,
198 'Title', '20131103092153', 0, 0
199 );
200
201 return $recentChange;
202 }
203
204 /**
205 * @return RecentChange
206 */
207 private function getCategorizationChange( $timestamp, $thisId, $lastId ) {
208 $wikiPage = new WikiPage( Title::newFromText( 'Testpage' ) );
209 $wikiPage->doEditContent( new WikitextContent( 'Some random text' ), 'page created' );
210
211 $wikiPage = new WikiPage( Title::newFromText( 'Category:Foo' ) );
212 $wikiPage->doEditContent( new WikitextContent( 'Some random text' ), 'category page created' );
213
214 $user = $this->getMutableTestUser()->getUser();
215 $recentChange = $this->testRecentChangesHelper->makeCategorizationRecentChange(
216 $user, 'Category:Foo', $wikiPage->getId(), $thisId, $lastId, $timestamp
217 );
218
219 return $recentChange;
220 }
221
222 private function createCategorizationLine( $recentChange ) {
223 $enhancedChangesList = $this->newEnhancedChangesList();
224 $cacheEntry = $this->testRecentChangesHelper->getCacheEntry( $recentChange );
225
226 $reflection = new \ReflectionClass( get_class( $enhancedChangesList ) );
227 $method = $reflection->getMethod( 'recentChangesBlockLine' );
228 $method->setAccessible( true );
229
230 return $method->invokeArgs( $enhancedChangesList, [ $cacheEntry ] );
231 }
232
233 }