summaryrefslogtreecommitdiff
blob: 1ac639135e517094ba46b899e37800f12828351e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
<?php
declare( strict_types = 1 );

namespace MediaWiki\Extension\Translate\PageTranslation;

use MediaWikiIntegrationTestCase;
use Title;

/**
 * @author Abijeet Patro
 * @license GPL-2.0-or-later
 * @covers \MediaWiki\Extension\Translate\PageTranslation\PageTitleRenamer
 * @covers \MediaWiki\Extension\Translate\PageTranslation\InvalidPageTitleRename
 */
class PageTitleRenamerTest extends MediaWikiIntegrationTestCase {
	/** @dataProvider provideNewPageTitle */
	public function testGetNewTitle( string $source, string $target, array $titlesToCheck ): void {
		$sourceTitle = Title::newFromText( $source );
		$targetTitle = Title::newFromText( $target );

		$pageTitleRenamer = new PageTitleRenamer( $sourceTitle, $targetTitle );
		$this->assertEquals(
			$pageTitleRenamer->getNewTitle( $sourceTitle )->getPrefixedText(),
			$targetTitle->getPrefixedText()
		);

		foreach ( $titlesToCheck as $original => $renamed ) {
			$originalTitle = Title::newFromText( $original );
			$newRenamedTitle = $pageTitleRenamer->getNewTitle( $originalTitle );

			$renamedTitle = Title::newFromText( $renamed );
			$this->assertEquals(
				$renamedTitle->getPrefixedText(),
				$newRenamedTitle->getPrefixedText()
			);
		}
	}

	/** @dataProvider provideNewPageTitleException */
	public function testGetNewTitleException(
		string $source,
		string $target,
		string $titleToRename,
		int $exceptionCode
	): void {
		$sourceTitle = Title::newFromText( $source );
		$targetTitle = Title::newFromText( $target );

		$pageTitleRenamer = new PageTitleRenamer( $sourceTitle, $targetTitle );

		$this->expectException( InvalidPageTitleRename::class );
		$this->expectExceptionCode( $exceptionCode );

		$pageTitleRenamer->getNewTitle( Title::newFromText( $titleToRename ) );
	}

	public function provideNewPageTitle() {
		yield [
			'Main Page',
			'New Main Page',
			[
				// Subpage
				'Main Page/Hello' => 'New Main Page/Hello',
				// Talk page
				'Talk:Main Page' => 'Talk:New Main Page',
				// Translation page
				'Main Page/es' => 'New Main Page/es',
				// Translation page talk page
				'Talk:Main Page/es' => 'Talk:New Main Page/es',
				// Translation
				'Translations:Main Page/1/es' => 'Translations:New Main Page/1/es',
				// Translation talk
				'Translations talk:Main Page/1/es' => 'Translations talk:New Main Page/1/es'
			]
		];

		yield [
			'Help:Foo',
			'Category:Bar',
			[
				// Talk page
				'Help talk:Foo' => 'Category talk:Bar',
				// Sub page
				'Help:Foo/Hello' => 'Category:Bar/Hello',
				// Sub page
				'Help:Foo/Help:Foo' => 'Category:Bar/Help:Foo',
				// Translation page
				'Help:Foo/en-gb' => 'Category:Bar/en-gb',
				// Translation
				'Translations:Help:Foo/1/en-gb' => 'Translations:Category:Bar/1/en-gb',
				// Translation talk
				'Translations talk:Help:Foo/1/en-gb' => 'Translations talk:Category:Bar/1/en-gb'
			]
		];

		yield [
			'Help talk:Foo',
			'Category talk:Bar',
			[
				// Translation page
				'Help talk:Foo/en-gb' => 'Category talk:Bar/en-gb',
				// Translation
				'Translations:Help talk:Foo/1/en-gb' => 'Translations:Category talk:Bar/1/en-gb',
				// Translation talk
				'Translations talk:Help talk:Foo/1/en-gb' => 'Translations talk:Category talk:Bar/1/en-gb'
			]
		];

		yield [
			'Foo/done',
			'Template:Foo/done',
			[
				// Translation page
				'Foo/done/en' => 'Template:Foo/done/en',
				// Translation page
				'Foo/done/ko' => 'Template:Foo/done/ko',
				// Talk page
				'Talk:Foo/done/ko' => 'Template talk:Foo/done/ko',
				// Translation
				'Foo/done/1/ko' => 'Template:Foo/done/1/ko'
			]
		];

		yield [
			'Template:Foo/done',
			'Foo/done',
			[
				// Translation page
				'Template:Foo/done/en' => 'Foo/done/en',
				// Translation page
				'Template:Foo/done/ko' => 'Foo/done/ko',
				// Talk page
				'Template talk:Foo/done/ko' => 'Talk:Foo/done/ko',
				// Translation
				'Template:Foo/done/1/ko' => 'Foo/done/1/ko'
			]
		];
	}

	public function provideNewPageTitleException() {
		yield 'Moving a page not part of translatable page' => [
			'Main Page',
			'New Main Page',
			'Category:Bar',
			PageTitleRenamer::UNKNOWN_PAGE
		];

		yield 'Rename failure because there are no common strings' => [
			'Main Page',
			'Main Page 2',
			'Example',
			PageTitleRenamer::RENAME_FAILED
		];

		yield 'Namespace does not support talkpages' => [
			'Main Page',
			'Special:New Main Page',
			'Talk:Main Page',
			PageTitleRenamer::NS_TALK_UNSUPPORTED
		];
	}
}