ILIAS  trunk Revision v13.0_alpha-62-g3b72d83f2e5
InstallLanguageModesTest.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22
25
27{
28 use RealFieldsUiFactory;
29 use InstallLanguageTestFixture;
30
31 public function testSingleNewLanguageIsInstalled(): void
32 {
33 $setup_language = $this->createSetupLanguageMock([], [], []);
34 $setup_language->expects($this->once())
35 ->method('checkLanguageForInstallation')
36 ->with('de')
37 ->willReturn(true);
38 $setup_language->expects($this->once())->method('flushLanguageForInstallation');
39 $setup_language->expects($this->once())->method('insertLanguageForInstallation');
40
41 $result = $this->createActivity($setup_language)->perform([
42 'language_keys' => ' de ',
44 ]);
45
46 $this->assertSame(['de'], $result['installed_language_keys']);
47 $this->assertSame([], $result['installed_with_local_language_keys']);
48 $this->assertSame([], $result['already_installed_language_keys']);
49 $this->assertSame([], $result['not_installed_language_keys']);
50 $this->assertSame([], $result['invalid_local_language_files']);
51 }
52
58 {
59 $setup_language = $this->createSetupLanguageMock([], [], []);
60 $setup_language->method('checkLanguageForInstallation')->willReturn(true);
61 $calls = [];
62 $setup_language->expects($this->once())
63 ->method('insertLanguageForInstallation')
64 ->willReturnCallback(static function () use (&$calls): array {
65 $calls[] = func_get_args();
66 return [];
67 });
68
69 $this->createActivity($setup_language)->perform([
70 'language_keys' => 'de',
72 ]);
73
74 $this->assertSame([['de']], $calls);
75 }
76
82 {
83 $setup_language = $this->createSetupLanguageMock([], [], []);
84 $setup_language->method('checkLanguageForInstallation')->willReturn(true);
85 $setup_language->expects($this->exactly(2))->method('insertLanguageForInstallation')->willReturnMap([
86 ['de', ['tos', 'pilot']],
87 ['fr', []],
88 ]);
89
90 $result = $this->createActivity($setup_language)->perform([
91 'language_keys' => 'de,fr',
93 ]);
94
95 $this->assertSame(['de', 'fr'], $result['installed_language_keys']);
96 $this->assertSame(['de'], $result['overlay_write_failed_language_keys']);
97 }
98
100 {
101 $setup_language = $this->createSetupLanguageMock(
102 [
103 'de' => ['obj_id' => 1, 'status' => 'installed'],
104 'en' => ['obj_id' => 2, 'status' => 'installed'],
105 ],
106 ['de', 'en'],
107 ['de', 'en']
108 );
109 $setup_language->method('checkLanguageForInstallation')->willReturn(true);
110 $setup_language->expects($this->exactly(2))->method('insertLanguageForApplyingLocalChanges')->willReturnMap([
111 ['de', []],
112 ['en', ['pilot']],
113 ]);
114
115 $result = $this->createActivity($setup_language)->perform([
116 'language_keys' => ['de', 'en'],
118 ]);
119
120 $this->assertSame(['de', 'en'], $result['installed_with_local_language_keys']);
121 $this->assertSame(['en'], $result['overlay_write_failed_language_keys']);
122 }
123
127 #[\PHPUnit\Framework\Attributes\DataProvider('modesThatApplyTheCustomizingFile')]
128 public function testListsTheDuplicateCustomizingEntriesOfTheAffectedLanguagesOnly(string $mode, array $installed): void
129 {
130 $setup_language = $this->createSetupLanguageStub(
131 ['de' => ['obj_id' => 1, 'status' => 'installed']],
132 [],
133 $installed
134 );
135 $setup_language->method('checkLanguageForInstallation')->willReturn(true);
136 $setup_language->method('insertLanguageForInstallation')->willReturn([]);
137 $setup_language->method('insertLanguageForApplyingLocalChanges')->willReturn([]);
138 $setup_language->method('getSkippedDuplicateEntries')->willReturn([
139 'de' => ['common#:#dup' => ['mme: dup']],
140 'fr' => ['common#:#dup' => ['mme: dup']],
141 ]);
142
143 $result = $this->createActivity($setup_language)->perform(['language_keys' => 'de', 'mode' => $mode]);
144
145 $this->assertSame(['de: common#:#dup (mme: dup)'], $result['duplicate_customizing_entries']);
146 }
147
149 public static function modesThatApplyTheCustomizingFile(): array
150 {
151 return [
152 'install' => [InstallLanguage::MODE_INSTALL, []],
153 'install_local' => [InstallLanguage::MODE_INSTALL_LOCAL, ['de']],
154 ];
155 }
156
158 {
159 $setup_language = $this->createSetupLanguageMock(
160 ['de' => ['obj_id' => 1, 'status' => 'installed']],
161 [],
162 ['de']
163 );
164 $setup_language->method('checkLanguageForInstallation')->willReturn(true);
165 $setup_language->expects($this->once())->method('insertLanguageForInstallation')->with('fr')->willReturn([]);
166
167 $result = $this->createActivity($setup_language)->perform([
168 'language_keys' => ['de', 'fr'],
170 ]);
171
172 $this->assertSame(['fr'], $result['installed_language_keys']);
173 $this->assertSame([], $result['overlay_write_failed_language_keys']);
174 }
175
177 {
178 // mode "install": the already installed 'de' is left completely alone, only 'fr' is installed
179 $setup_language = $this->createSetupLanguageMock(
180 [
181 'de' => ['obj_id' => 1, 'status' => 'installed'],
182 ],
183 [],
184 ['de']
185 );
186 $setup_language->expects($this->once())
187 ->method('checkLanguageForInstallation')
188 ->with('fr')
189 ->willReturn(true);
190 $setup_language->expects($this->once())->method('flushLanguageForInstallation')->with('fr');
191 $setup_language->expects($this->once())->method('insertLanguageForInstallation')->with('fr');
192
193 $result = $this->createActivity($setup_language)->perform([
194 'language_keys' => [' de, fr ', 'de'],
196 ]);
197
198 $this->assertSame(['fr'], $result['installed_language_keys']);
199 $this->assertSame([], $result['installed_with_local_language_keys']);
200 $this->assertSame(['de'], $result['already_installed_language_keys']);
201 $this->assertSame([], $result['not_installed_language_keys']);
202 $this->assertSame([], $result['invalid_local_language_files']);
203 }
204
206 {
207 // classified by "has a customizing/local file", not "newly installed"
208 $setup_language = $this->createSetupLanguageMock(
209 [],
210 ['de'],
211 []
212 );
213 $setup_language->expects($this->once())
214 ->method('checkLanguageForInstallation')
215 ->with('de')
216 ->willReturn(true);
217 $setup_language->expects($this->once())->method('flushLanguageForInstallation')->with('de');
218 $setup_language->expects($this->once())->method('insertLanguageForInstallation')->with('de');
219
220 $result = $this->createActivity($setup_language)->perform([
221 'language_keys' => 'de',
223 ]);
224
225 $this->assertSame([], $result['installed_language_keys']);
226 $this->assertSame(['de'], $result['installed_with_local_language_keys']);
227 $this->assertSame([], $result['already_installed_language_keys']);
228 $this->assertSame([], $result['not_installed_language_keys']);
229 }
230
235 {
236 $setup_language = $this->createSetupLanguageMock(
237 ['de' => ['obj_id' => 1, 'status' => 'installed']],
238 ['de'],
239 ['de']
240 );
241 $setup_language->expects($this->never())->method('checkLanguageForInstallation');
242 $setup_language->expects($this->never())->method('flushLanguageForInstallation');
243 $setup_language->expects($this->never())->method('insertLanguageForInstallation');
244 $setup_language->expects($this->never())->method('insertLanguageForApplyingLocalChanges');
245 $setup_language->expects($this->never())->method('registerInstalledLanguage');
246
247 $result = $this->createActivity($setup_language)->perform([
248 'language_keys' => 'de',
250 ]);
251
252 $this->assertSame([], $result['installed_language_keys']);
253 $this->assertSame([], $result['installed_with_local_language_keys']);
254 $this->assertSame(['de'], $result['already_installed_language_keys']);
255 $this->assertSame([], $result['not_installed_language_keys']);
256 $this->assertSame([], $result['invalid_local_language_files']);
257 }
258
260 {
261 $setup_language = $this->createSetupLanguageMock(
262 ['de' => ['obj_id' => 1, 'status' => 'installed']],
263 ['de'],
264 ['de']
265 );
266 $setup_language->expects($this->once())->method('checkLanguageForInstallation')->with('de')->willReturn(true);
267 $setup_language->expects($this->never())->method('flushLanguageForInstallation');
268 $setup_language->expects($this->never())->method('insertLanguageForInstallation');
269 $setup_language->expects($this->once())
270 ->method('insertLanguageForApplyingLocalChanges')
271 ->with('de');
272 // object_data bookkeeping is delegated to ilSetupLanguage::registerInstalledLanguage(), see ilSetupLanguageTest
273 $setup_language->expects($this->once())
274 ->method('registerInstalledLanguage')
275 ->with(
276 'de',
277 ['de' => ['obj_id' => 1, 'status' => 'installed']],
278 ['de']
279 );
280
281 $result = $this->createActivity($setup_language)->perform([
282 'language_keys' => 'de',
284 ]);
285
286 $this->assertSame([], $result['installed_language_keys']);
287 $this->assertSame(['de'], $result['installed_with_local_language_keys']);
288 $this->assertSame([], $result['already_installed_language_keys']);
289 $this->assertSame([], $result['not_installed_language_keys']);
290 $this->assertSame([], $result['invalid_local_language_files']);
291 }
292
294 {
295 $setup_language = $this->createSetupLanguageMock(
296 ['de' => ['obj_id' => 1, 'status' => 'installed']],
297 ['de'],
298 ['de']
299 );
300 $setup_language->method('checkLanguageForInstallation')->willReturn(true);
301 $calls = [];
302 $setup_language->expects($this->once())
303 ->method('insertLanguageForApplyingLocalChanges')
304 ->willReturnCallback(static function () use (&$calls): array {
305 $calls[] = func_get_args();
306 return [];
307 });
308
309 $this->createActivity($setup_language)->perform([
310 'language_keys' => 'de',
312 ]);
313
314 $this->assertSame([['de']], $calls);
315 }
316
322 {
323 $setup_language = $this->createSetupLanguageMock(
324 ['de' => ['obj_id' => 1, 'status' => 'installed']],
325 [], // no customizing/local file exists for 'de'
326 ['de']
327 );
328 $setup_language->expects($this->once())->method('checkLanguageForInstallation')->with('de')->willReturn(true);
329 $setup_language->expects($this->never())->method('flushLanguageForInstallation');
330 $setup_language->expects($this->never())->method('insertLanguageForInstallation');
331 $setup_language->expects($this->once())
332 ->method('insertLanguageForApplyingLocalChanges')
333 ->with('de');
334 $setup_language->expects($this->once())->method('registerInstalledLanguage');
335
336 $result = $this->createActivity($setup_language)->perform([
337 'language_keys' => 'de',
339 ]);
340
341 $this->assertSame([], $result['installed_language_keys']);
342 $this->assertSame([], $result['installed_with_local_language_keys']);
343 $this->assertSame(['de'], $result['already_installed_language_keys']);
344 $this->assertSame([], $result['not_installed_language_keys']);
345 }
346
351 {
352 $setup_language = $this->createSetupLanguageMock([], [], []);
353 $setup_language->expects($this->never())->method('checkLanguageForInstallation');
354 $setup_language->expects($this->never())->method('flushLanguageForInstallation');
355 $setup_language->expects($this->never())->method('insertLanguageForInstallation');
356 $setup_language->expects($this->never())->method('insertLanguageForApplyingLocalChanges');
357 $setup_language->expects($this->never())->method('registerInstalledLanguage');
358
359 $result = $this->createActivity($setup_language)->perform([
360 'language_keys' => 'de',
362 ]);
363
364 $this->assertSame([], $result['installed_language_keys']);
365 $this->assertSame([], $result['installed_with_local_language_keys']);
366 $this->assertSame([], $result['already_installed_language_keys']);
367 $this->assertSame(['de'], $result['not_installed_language_keys']);
368 }
369
375 {
376 $setup_language = $this->createMock(ilSetupLanguage::class);
377 $setup_language->method('getInstalledLanguages')->willReturn(['de', 'en']);
378 $setup_language->expects($this->never())->method('getAvailableLanguagesForInstallation');
379 $setup_language->expects($this->never())->method('getLocalLanguages');
380 $setup_language->expects($this->never())->method('getInvalidLocalLanguageFiles');
381 $setup_language->expects($this->never())->method('checkLanguageForInstallation');
382 $setup_language->expects($this->never())->method('flushLanguageForInstallation');
383 $setup_language->expects($this->never())->method('insertLanguageForInstallation');
384 $setup_language->expects($this->never())->method('insertLanguageForApplyingLocalChanges');
385 $setup_language->expects($this->never())->method('registerInstalledLanguage');
386
387 $result = $this->createActivity($setup_language)->perform([
388 'language_keys' => ['de', 'en'],
390 ]);
391
392 $this->assertSame([], $result['installed_language_keys']);
393 $this->assertSame([], $result['installed_with_local_language_keys']);
394 $this->assertSame(['de', 'en'], $result['already_installed_language_keys']);
395 $this->assertSame([], $result['not_installed_language_keys']);
396 $this->assertSame([], $result['invalid_local_language_files']);
397 }
398
403 {
404 $setup_language = $this->createSetupLanguageMock(
405 ['de' => ['obj_id' => 1, 'status' => 'installed']],
406 ['fr'], // only 'fr' has a pending customizing/local file
407 ['de']
408 );
409 $setup_language->expects($this->exactly(2))
410 ->method('checkLanguageForInstallation')
411 ->willReturnMap([
412 ['en', true],
413 ['fr', true],
414 ]);
415 $setup_language->expects($this->exactly(2))->method('flushLanguageForInstallation');
416 $setup_language->expects($this->exactly(2))->method('insertLanguageForInstallation');
417 $setup_language->expects($this->never())->method('insertLanguageForApplyingLocalChanges');
418 $setup_language->expects($this->exactly(2))->method('registerInstalledLanguage');
419 $setup_language->expects($this->once())
420 ->method('getInvalidLocalLanguageFiles')
421 ->with(['en', 'fr']);
422
423 $result = $this->createActivity($setup_language)->perform([
424 'language_keys' => ['de', 'en', 'fr'],
426 ]);
427
428 $this->assertSame(['en'], $result['installed_language_keys']);
429 $this->assertSame(['fr'], $result['installed_with_local_language_keys']);
430 $this->assertSame(['de'], $result['already_installed_language_keys']);
431 $this->assertSame([], $result['not_installed_language_keys']);
432 }
433
438 {
439 $setup_language = $this->createSetupLanguageMock(
440 [
441 'de' => ['obj_id' => 1, 'status' => 'installed'],
442 'en' => ['obj_id' => 2, 'status' => 'installed'],
443 ],
444 ['de'], // only 'de' has a pending customizing/local file
445 ['de', 'en']
446 );
447 $setup_language->expects($this->exactly(2))->method('checkLanguageForInstallation')->willReturn(true);
448 $setup_language->expects($this->never())->method('flushLanguageForInstallation');
449 $setup_language->expects($this->never())->method('insertLanguageForInstallation');
450 $setup_language->expects($this->exactly(2))
451 ->method('insertLanguageForApplyingLocalChanges')
452 ->with($this->logicalOr('de', 'en'));
453 $setup_language->expects($this->exactly(2))->method('registerInstalledLanguage');
454 $setup_language->expects($this->once())
455 ->method('getInvalidLocalLanguageFiles')
456 ->with(['de', 'en']);
457
458 $result = $this->createActivity($setup_language)->perform([
459 'language_keys' => ['de', 'en', 'fr'],
461 ]);
462
463 $this->assertSame([], $result['installed_language_keys']);
464 $this->assertSame(['de'], $result['installed_with_local_language_keys']);
465 $this->assertSame(['en'], $result['already_installed_language_keys']);
466 $this->assertSame(['fr'], $result['not_installed_language_keys']);
467 }
468
470 {
471 $setup_language = $this->createSetupLanguageMock(
472 [
473 'en' => ['obj_id' => 1, 'status' => 'installed'],
474 ],
475 [],
476 ['en']
477 );
478 $setup_language->expects($this->once())
479 ->method('checkLanguageForInstallation')
480 ->with('de')
481 ->willReturn(true);
482 $setup_language->expects($this->once())->method('flushLanguageForInstallation');
483 $setup_language->expects($this->once())->method('insertLanguageForInstallation');
484 $setup_language->expects($this->once())
485 ->method('registerInstalledLanguage')
486 ->with(
487 'de',
488 ['en' => ['obj_id' => 1, 'status' => 'installed']],
489 []
490 );
491
492 $result = $this->createActivity($setup_language)->perform([
493 'language_keys' => 'de',
495 ]);
496
497 $this->assertSame(['de'], $result['installed_language_keys']);
498 $this->assertSame([], $result['installed_with_local_language_keys']);
499 $this->assertSame([], $result['already_installed_language_keys']);
500 $this->assertSame([], $result['invalid_local_language_files']);
501 }
502}
testAllRequestedLanguagesBeingNoOpsSkipsLanguageAndFileLookupsEntirely()
If every requested language is a no-op, perform() must not read the available/local languages or scan...
testInstallModeIsNoOpForAlreadyInstalledLanguageEvenWithACustomFile()
Mode "install" must not re-install or re-apply the local file of an already installed language.
testInstallLocalModeOnAlreadyInstalledLanguageWithoutCustomFileIsReportedAsAlreadyInstalled()
"install_local" on an already installed language without a local file runs its write methods,...
testFullInstallListsOnlyTheLanguagesWhoseOverlayCouldNotBeWritten()
A non-empty list from insertLanguageForInstallation() (migrated modules whose overlay could not be wr...
testInstallLocalModeOnNotInstalledLanguageIsCompleteNoOp()
"install_local" on a language that is not installed at all is a complete no-op.
testFullInstallPassesOnlyTheLanguageKey()
The Activity passes exactly the language key (no $create_missing_mo flag).
testBulkRequestUnderInstallLocalModePartitionsEachKeyIntoTheCorrectBucket()
Mode "install_local": only insertLanguageForApplyingLocalChanges, only for already installed keys.
testListsTheDuplicateCustomizingEntriesOfTheAffectedLanguagesOnly(string $mode, array $installed)
testBulkRequestUnderInstallModePartitionsEachKeyIntoTheCorrectBucket()
Languages in every state at once land in their own bucket; only affected ones trigger a write (mode "...
Class ilLanguageBaseTest.
language handling for setup
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,)