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