ILIAS  trunk Revision v13.0_alpha-62-g3b72d83f2e5
InstallLanguageTest.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22
28use PHPUnit\Framework\Attributes\DataProvider;
29use PHPUnit\Framework\MockObject\Stub;
31
33{
34 use InstallLanguageTestFixture;
35
37 {
38 $setup_language = $this->createSetupLanguageStub(['de'], [], []);
39 $setup_language->method('checkLanguageForInstallation')->willReturn(true);
40
41 return $this->createActivity($setup_language);
42 }
43
44 protected function validPerformParameters(): array
45 {
46 return ['language_keys' => 'de', 'mode' => InstallLanguage::MODE_INSTALL];
47 }
48
50 {
51 $setup_language = $this->createSetupLanguageMock([], [], [], ['ilias_de.lang.locl']);
52 $setup_language->expects($this->once())
53 ->method('getInvalidLocalLanguageFiles')
54 ->with(['de'])
55 ->willReturn(['ilias_de.lang.locl']);
56 $setup_language->expects($this->once())
57 ->method('checkLanguageForInstallation')
58 ->with('de')
59 ->willReturn(true);
60 $setup_language->expects($this->once())->method('flushLanguageForInstallation');
61 $setup_language->expects($this->once())->method('insertLanguageForInstallation');
62
63 $result = $this->createActivity($setup_language)->perform([
64 'language_keys' => 'de',
66 ]);
67
68 $this->assertSame(['de'], $result['installed_language_keys']);
69 $this->assertSame(['ilias_de.lang.locl'], $result['invalid_local_language_files']);
70 }
71
73 {
74 $setup_language = $this->createSetupLanguageMock([], [], []);
75 $setup_language->expects($this->once())
76 ->method('checkLanguageForInstallation')
77 ->with('xx')
78 ->willReturn(false);
79 $setup_language->method('getInstallableLanguagesForInstallation')->willReturn(['xx']);
80 $setup_language->expects($this->never())->method('flushLanguageForInstallation');
81 $setup_language->expects($this->never())->method('insertLanguageForInstallation');
82
83 $this->expectException(InvalidLanguageFilesException::class);
84 $this->expectExceptionCode(409);
85 $this->createActivity($setup_language)->perform([
86 'language_keys' => 'xx',
88 ]);
89 }
90
92 {
93 $setup_language = $this->createSetupLanguageMock([], [], []);
94 $setup_language->expects($this->exactly(2))
95 ->method('checkLanguageForInstallation')
96 ->willReturnMap([
97 ['de', true],
98 ['xx', false],
99 ]);
100 $setup_language->method('getInstallableLanguagesForInstallation')->willReturn(['de', 'xx']);
101 $setup_language->expects($this->never())->method('flushLanguageForInstallation');
102 $setup_language->expects($this->never())->method('insertLanguageForInstallation');
103
104 $this->expectException(InvalidLanguageFilesException::class);
105 $this->expectExceptionCode(409);
106 $this->createActivity($setup_language)->perform([
107 'language_keys' => 'de,xx',
109 ]);
110 }
111
113 {
114 $setup_language = $this->createSetupLanguageMock([], [], []);
115 $setup_language->method('checkLanguageForInstallation')->willReturn(false);
116 $setup_language->method('getInstallableLanguagesForInstallation')->willReturn(['de']);
117 $setup_language->expects($this->never())->method('flushLanguageForInstallation');
118 $setup_language->expects($this->never())->method('insertLanguageForInstallation');
119
120 try {
121 $this->createActivity($setup_language)->perform([
122 'language_keys' => 'qq',
124 ]);
125 $this->fail('InvalidInputException expected');
126 } catch (InvalidInputException $e) {
127 $this->assertSame(400, $e->getCode());
128 $this->assertSame('Unknown languages: qq', $e->getMessage());
129 }
130 }
131
134 {
135 $setup_language = $this->createSetupLanguageMock([], [], []);
136 $setup_language->method('checkLanguageForInstallation')->willReturnMap([
137 ['de', true],
138 ['xx', false],
139 ['qq', false],
140 ]);
141 $setup_language->method('getInstallableLanguagesForInstallation')->willReturn(['de', 'xx']);
142 $setup_language->expects($this->never())->method('flushLanguageForInstallation');
143 $setup_language->expects($this->never())->method('insertLanguageForInstallation');
144
145 try {
146 $this->createActivity($setup_language)->perform([
147 'language_keys' => 'de,xx,qq',
149 ]);
150 $this->fail('InvalidInputException expected');
151 } catch (InvalidInputException $e) {
152 $this->assertSame(400, $e->getCode());
153 $this->assertSame('Unknown languages: qq', $e->getMessage());
154 }
155 }
156
162 {
163 $setup_language = $this->createSetupLanguageMock([], [], ['de', 'fr']);
164 $setup_language->expects($this->exactly(2))
165 ->method('checkLanguageForInstallation')
166 ->willReturnMap([
167 ['de', false],
168 ['fr', true],
169 ]);
170 $setup_language->method('getInstallableLanguagesForInstallation')->willReturn(['fr']);
171 $setup_language->expects($this->never())->method('insertLanguageForApplyingLocalChanges');
172 $setup_language->expects($this->never())->method('registerInstalledLanguage');
173
174 try {
175 $this->createActivity($setup_language)->perform([
176 'language_keys' => 'de,fr,qq',
178 ]);
179 $this->fail('InvalidLanguageFilesException expected');
181 $this->assertSame(409, $e->getCode());
182 $this->assertSame(['de'], $e->getLanguageKeys());
183 }
184 }
185
187 {
188 $this->expectException(InvalidInputException::class);
189
190 $this->createActivity($this->createSetupLanguageStub([], [], []))->perform([
191 'language_keys' => 'de',
192 ]);
193 }
194
195 public function testInvalidModeValueIsRejected(): void
196 {
197 $this->expectException(InvalidInputException::class);
198
199 $this->createActivity($this->createSetupLanguageStub([], [], []))->perform([
200 'language_keys' => 'de',
201 'mode' => 'foo',
202 ]);
203 }
204
206 {
207 $text = $this->createMock(Text::class);
208 $text->expects($this->once())->method('withRequired')->with(true)->willReturnSelf();
209 $text->expects($this->once())
210 ->method('withDedicatedName')
211 ->with('language_keys')
212 ->willReturnSelf();
213
214 $select = $this->createMock(Select::class);
215 $select->expects($this->once())->method('withRequired')->with(true)->willReturnSelf();
216 $select->expects($this->once())
217 ->method('withDedicatedName')
218 ->with('mode')
219 ->willReturnSelf();
220
221 $field = $this->createMock(\ILIAS\UI\Component\Input\Field\Factory::class);
222 $field->expects($this->once())->method('text')->with(
223 'Language keys',
224 'Comma-separated list of language keys, e.g. de, fr, it.'
225 )->willReturn($text);
226 $field->expects($this->once())->method('select')->with(
227 'Mode',
228 [
230 InstallLanguage::MODE_INSTALL_LOCAL => 'Install local',
231 ],
232 self::callback(static fn(mixed $value): bool => is_string($value))
233 )->willReturn($select);
234
235 $group = $this->createStub(\ILIAS\UI\Component\Input\Field\Section::class);
236 $field->expects($this->once())
237 ->method('section')
238 ->with(['language_keys' => $text, 'mode' => $select], $this->anything())
239 ->willReturn($group);
240
241 $activity = $this->createActivity(
242 $this->createSetupLanguageStub([], [], [])
243 );
244
245 $this->assertSame($group, $activity->getInputDescription($field));
246 }
247
248 public static function invalidLanguageKeysProvider(): array
249 {
250 return [
251 'empty (only whitespace/commas)' => [
252 ['language_keys' => ' , ', 'mode' => InstallLanguage::MODE_INSTALL],
253 ],
254 'nested array value' => [
255 ['language_keys' => ['de', ['fr']], 'mode' => InstallLanguage::MODE_INSTALL],
256 ],
257 // format validation of ParsesLanguageKeyList::toLanguageKeyList()
258 'three letters' => [
259 ['language_keys' => 'deu', 'mode' => InstallLanguage::MODE_INSTALL],
260 ],
261 'one letter' => [
262 ['language_keys' => 'd', 'mode' => InstallLanguage::MODE_INSTALL],
263 ],
264 'uppercase' => [
265 ['language_keys' => 'DE', 'mode' => InstallLanguage::MODE_INSTALL],
266 ],
267 'contains a digit' => [
268 ['language_keys' => 'de1', 'mode' => InstallLanguage::MODE_INSTALL],
269 ],
270 'contains a hyphen' => [
271 ['language_keys' => 'de-at', 'mode' => InstallLanguage::MODE_INSTALL],
272 ],
273 ];
274 }
275
276 #[DataProvider('invalidLanguageKeysProvider')]
278 {
279 $this->expectException(InvalidInputException::class);
280
281 $this->createActivity($this->createSetupLanguageStub([], [], []))->perform($parameters);
282 }
283
285 public function testNonArrayParametersAreRejected(): void
286 {
287 $this->expectException(InvalidInputException::class);
288
289 $this->createActivity($this->createSetupLanguageStub([], [], []))->perform('not-an-array');
290 }
291
294 {
295 $rbac = $this->createStub(\ilRbacSystem::class);
296 $rbac->method('checkAccessOfUser')->willReturn(true);
297
298 $setup_language = $this->createSetupLanguageMock([], [], []);
299 $setup_language->method('checkLanguageForInstallation')->willReturn(true);
300 $setup_language->expects($this->exactly(2))->method('flushLanguageForInstallation');
301 $setup_language->expects($this->exactly(2))->method('insertLanguageForInstallation');
302
303 $result = $this->createActivity($setup_language, $rbac)->maybePerformAs(
304 $this->createRealFieldsUiFactory()->input(),
305 6,
306 ['language_keys' => ['de', 'fr'], 'mode' => InstallLanguage::MODE_INSTALL]
307 );
308
309 $this->assertTrue($result->isOk());
310 $this->assertSame(['de', 'fr'], $result->value()['installed_language_keys']);
311 }
312
313 public function testPermissionDeniedBeforePerform(): void
314 {
315 $rbac = $this->createMock(\ilRbacSystem::class);
316 $rbac->expects($this->once())
317 ->method('checkAccessOfUser')
318 ->with(
319 6,
320 'write',
321 $this->anything()
322 )
323 ->willReturn(false);
324
325 $setup_language = $this->createSetupLanguageMock([], [], []);
326 $setup_language->expects($this->never())->method('getAvailableLanguagesForInstallation');
327 $result = $this->createActivity(
328 $setup_language,
329 $rbac
330 )->maybePerformAs($this->createRealFieldsUiFactory()->input(), 6, ['language_keys' => 'de', 'mode' => InstallLanguage::MODE_INSTALL]);
331
332 $this->assertTrue($result->isError());
333 }
334}
A state of the server, not of the call: 409, so Failure::of() passes it on and the GUI can name the l...
Cross-checks the declared output field names against the keys perform() returns, using a real Descrip...
testMaybePerformAsAcceptsAnArrayOfLanguageKeysAndInstallsEachOne()
ilObjLanguageFolderGUI sends 'language_keys' as array of strings; the real grind() pipeline must join...
testUnknownAndInvalidLanguagesTogetherAreRejectedAsInvalidInput()
The unknown language decides: the caller has to fix its input first.
testNonArrayParametersAreRejected()
Pins InvalidInputException, not just its parent \InvalidArgumentException.
testInstallLocalModeWithAnInvalidLanguageFileIsReportedAsActivityErrorWithoutWriting()
"install_local" merges the shipped files too: an invalid one of an installed language rejects the req...
Definition: UI.php:27
language handling for setup
This describes select field.
Definition: Select.php:29
This describes text inputs.
Definition: Text.php:29
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
createActivity(\Closure $lng_objects, \Closure $obj_language_factory, ?\ilRbacSystem $rbac=null, int $language_folder_ref_id=0, ?RepositoryProvider $repository=null,)
Interface Observer \BackgroundTasks Contains several chained tasks and infos about them.
$text
Definition: xapiexit.php:21