1<?php 2 3use MediaWiki\Linker\LinkTarget; 4 5/** 6 * @since 1.26 7 */ 8abstract class LogFormatterTestCase extends MediaWikiLangTestCase { 9 10 public function doTestLogFormatter( $row, $extra, $userGroups = [] ) { 11 RequestContext::resetMain(); 12 $row = $this->expandDatabaseRow( $row, $this->isLegacy( $extra ) ); 13 14 $context = new RequestContext(); 15 $context->setUser( $this->getTestUser( $userGroups )->getUser() ); 16 17 $formatter = LogFormatter::newFromRow( $row ); 18 $formatter->setContext( $context ); 19 20 $this->assertEquals( 21 $extra['text'], 22 self::removeSomeHtml( $formatter->getActionText() ), 23 'Action text is equal to expected text' 24 ); 25 26 $this->assertSame( // ensure types and array key order 27 $extra['api'], 28 self::removeApiMetaData( $formatter->formatParametersForApi() ), 29 'Api log params is equal to expected array' 30 ); 31 32 if ( isset( $extra['preload'] ) ) { 33 $this->assertArrayEquals( 34 $this->getLinkTargetsAsStrings( $extra['preload'] ), 35 $this->getLinkTargetsAsStrings( 36 $formatter->getPreloadTitles() 37 ) 38 ); 39 } 40 } 41 42 private function getLinkTargetsAsStrings( array $linkTargets ) { 43 return array_map( static function ( LinkTarget $t ) { 44 return $t->getInterwiki() . ':' . $t->getNamespace() . ':' 45 . $t->getDBkey() . '#' . $t->getFragment(); 46 }, $linkTargets ); 47 } 48 49 protected function isLegacy( $extra ) { 50 return isset( $extra['legacy'] ) && $extra['legacy']; 51 } 52 53 protected function expandDatabaseRow( $data, $legacy ) { 54 return [ 55 // no log_id because no insert in database 56 'log_type' => $data['type'], 57 'log_action' => $data['action'], 58 'log_timestamp' => $data['timestamp'] ?? wfTimestampNow(), 59 'log_user' => $data['user'] ?? 42, 60 'log_user_text' => $data['user_text'] ?? 'User', 61 'log_actor' => $data['actor'] ?? 24, 62 'log_namespace' => $data['namespace'] ?? NS_MAIN, 63 'log_title' => $data['title'] ?? 'Main_Page', 64 'log_page' => $data['page'] ?? 0, 65 'log_comment_text' => $data['comment'] ?? '', 66 'log_comment_data' => null, 67 'log_params' => $legacy 68 ? LogPage::makeParamBlob( $data['params'] ) 69 : LogEntryBase::makeParamBlob( $data['params'] ), 70 'log_deleted' => $data['deleted'] ?? 0, 71 ]; 72 } 73 74 private static function removeSomeHtml( $html ) { 75 $html = str_replace( '"', '"', $html ); 76 $html = preg_replace( '/\xE2\x80[\x8E\x8F]/', '', $html ); // Strip lrm/rlm 77 return trim( strip_tags( $html ) ); 78 } 79 80 private static function removeApiMetaData( $val ) { 81 if ( is_array( $val ) ) { 82 unset( $val['_element'] ); 83 unset( $val['_type'] ); 84 foreach ( $val as $key => $value ) { 85 $val[$key] = self::removeApiMetaData( $value ); 86 } 87 } 88 return $val; 89 } 90} 91