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( '&quot;', '"', $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