19declare(strict_types=1);
27use PHPUnit\Framework\Attributes\DataProvider;
46 return [
'language_keys' =>
'de'];
51 $rbac = $this->createStub(\ilRbacSystem::class);
52 $rbac->method(
'checkAccessOfUser')->willReturn(
true);
54 $lng_objects =
static fn(): array => [
55 [
'obj_id' => 1,
'title' =>
'de'],
56 [
'obj_id' => 2,
'title' =>
'de'],
58 $obj_language_factory =
static function (
int $id): never {
59 throw new \LogicException(
'must never be called for an ambiguous title');
62 $result = $this->
createActivity($lng_objects, $obj_language_factory, $rbac)
63 ->maybePerformAs($this->createRealFieldsUiFactory()->input(), 6, [
'language_keys' =>
'de']);
65 $this->assertTrue($result->isError());
66 $this->assertInstanceOf(\RuntimeException::class, $result->error());
76 $lng_objects_list = [];
77 $fakes_by_obj_id = [];
80 foreach ($language_objects as $language_key => $flags) {
81 $lng_objects_list[] = [
'obj_id' => $obj_id,
'title' => $language_key];
83 is_system_language: $flags[
'system'] ??
false,
84 is_user_language: $flags[
'user'] ??
false,
85 is_installed: $flags[
'installed'] ??
true,
86 uninstall_return_value: $flags[
'uninstall_return'] ??
'uninstalled',
87 unwritten_overlay_modules: $flags[
'unwritten_overlay_modules'] ?? [],
92 $lng_objects =
static fn(): array => $lng_objects_list;
95 return [$fakes_by_obj_id, $lng_objects, $obj_language_factory];
104 $result = $this->
createActivity($lng_objects, $obj_language_factory)->perform([
105 'language_keys' =>
'de',
108 $this->assertSame([
'de'], $result[
'uninstalled_language_keys']);
109 $this->assertSame([], $result[
'system_language_keys']);
110 $this->assertSame([], $result[
'user_language_keys']);
111 $this->assertSame([], $result[
'not_installed_language_keys']);
112 $this->assertSame([], $result[
'overlay_write_failed_language_keys']);
113 $this->assertSame(1, $fakes[1]->uninstallCallCount());
119 'de' => [
'system' =>
true],
122 $result = $this->
createActivity($lng_objects, $obj_language_factory)->perform([
123 'language_keys' =>
'de',
126 $this->assertSame([], $result[
'uninstalled_language_keys']);
127 $this->assertSame([
'de'], $result[
'system_language_keys']);
128 $this->assertSame([], $result[
'user_language_keys']);
129 $this->assertSame([], $result[
'not_installed_language_keys']);
130 $this->assertSame(0, $fakes[1]->uninstallCallCount());
136 'de' => [
'user' =>
true],
139 $result = $this->
createActivity($lng_objects, $obj_language_factory)->perform([
140 'language_keys' =>
'de',
143 $this->assertSame([], $result[
'uninstalled_language_keys']);
144 $this->assertSame([], $result[
'system_language_keys']);
145 $this->assertSame([
'de'], $result[
'user_language_keys']);
146 $this->assertSame([], $result[
'not_installed_language_keys']);
147 $this->assertSame(0, $fakes[1]->uninstallCallCount());
154 'de' => [
'system' =>
true,
'user' =>
true],
157 $result = $this->
createActivity($lng_objects, $obj_language_factory)->perform([
158 'language_keys' =>
'de',
161 $this->assertSame([
'de'], $result[
'system_language_keys']);
162 $this->assertSame([], $result[
'user_language_keys']);
168 'de' => [
'installed' =>
false],
171 $result = $this->
createActivity($lng_objects, $obj_language_factory)->perform([
172 'language_keys' =>
'de',
175 $this->assertSame([], $result[
'uninstalled_language_keys']);
176 $this->assertSame([], $result[
'system_language_keys']);
177 $this->assertSame([], $result[
'user_language_keys']);
178 $this->assertSame([
'de'], $result[
'not_installed_language_keys']);
179 $this->assertSame(0, $fakes[1]->uninstallCallCount());
186 'de' => [
'uninstall_return' =>
''],
189 $result = $this->
createActivity($lng_objects, $obj_language_factory)->perform([
190 'language_keys' =>
'de',
193 $this->assertSame([], $result[
'uninstalled_language_keys']);
194 $this->assertSame([], $result[
'system_language_keys']);
195 $this->assertSame([], $result[
'user_language_keys']);
196 $this->assertSame([
'de'], $result[
'not_installed_language_keys']);
198 $this->assertSame(1, $fakes[1]->uninstallCallCount());
205 'de' => [
'unwritten_overlay_modules' => [
'pilot']],
209 $result = $this->
createActivity($lng_objects, $obj_language_factory)->perform([
'language_keys' =>
'de,fr']);
211 $this->assertSame([
'de',
'fr'], $result[
'uninstalled_language_keys']);
212 $this->assertSame([
'de'], $result[
'overlay_write_failed_language_keys']);
213 $this->assertSame(1, $fakes[1]->uninstallCallCount());
220 'de' => [
'uninstall_return' =>
'',
'unwritten_overlay_modules' => [
'pilot']],
223 $result = $this->
createActivity($lng_objects, $obj_language_factory)->perform([
'language_keys' =>
'de']);
225 $this->assertSame([
'de'], $result[
'not_installed_language_keys']);
226 $this->assertSame([], $result[
'overlay_write_failed_language_keys']);
232 $lng_objects =
static fn(): array => [];
235 $factory_calls[] =
$id;
236 throw new \LogicException(
'must never be called for an unknown language key');
239 $result = $this->
createActivity($lng_objects, $obj_language_factory)->perform([
240 'language_keys' =>
'xx',
243 $this->assertSame([], $result[
'uninstalled_language_keys']);
244 $this->assertSame([], $result[
'system_language_keys']);
245 $this->assertSame([], $result[
'user_language_keys']);
246 $this->assertSame([
'xx'], $result[
'not_installed_language_keys']);
247 $this->assertSame([], $factory_calls);
257 'en' => [
'system' =>
true],
258 'fr' => [
'user' =>
true],
259 'it' => [
'installed' =>
false],
262 $result = $this->
createActivity($lng_objects, $obj_language_factory)->perform([
263 'language_keys' => [
'de',
'en',
'fr',
'it',
'xx'],
266 $this->assertSame([
'de'], $result[
'uninstalled_language_keys']);
267 $this->assertSame([
'en'], $result[
'system_language_keys']);
268 $this->assertSame([
'fr'], $result[
'user_language_keys']);
269 $this->assertSame([
'it',
'xx'], $result[
'not_installed_language_keys']);
271 $this->assertSame(1, $fakes[1]->uninstallCallCount(),
'de must be uninstalled');
272 $this->assertSame(0, $fakes[2]->uninstallCallCount(),
'system language must never be uninstalled');
273 $this->assertSame(0, $fakes[3]->uninstallCallCount(),
'in-use language must never be uninstalled');
274 $this->assertSame(0, $fakes[4]->uninstallCallCount(),
'not-installed language must never be uninstalled');
283 $result = $this->
createActivity($lng_objects, $obj_language_factory)->perform([
284 'language_keys' => [
' de, de ',
'de'],
287 $this->assertSame([
'de'], $result[
'uninstalled_language_keys']);
288 $this->assertSame(1, $fakes[1]->uninstallCallCount());
294 'missing language_keys key' => [[]],
295 'empty (only whitespace/commas)' => [[
'language_keys' =>
' , ']],
296 'nested array value' => [[
'language_keys' => [
'de', [
'fr']]]],
297 'three letters' => [[
'language_keys' =>
'deu']],
298 'one letter' => [[
'language_keys' =>
'd']],
299 'uppercase' => [[
'language_keys' =>
'DE']],
300 'contains a digit' => [[
'language_keys' =>
'de1']],
301 'contains a hyphen' => [[
'language_keys' =>
'de-at']],
305 #[DataProvider('invalidLanguageKeysProvider')]
308 $this->expectException(InvalidInputException::class);
316 $this->expectException(InvalidInputException::class);
318 $this->
createActivity(
static fn(): array => [],
static fn(
int $id) =>
null)->perform(
'not-an-array');
323 $text = $this->createMock(Text::class);
324 $text->expects($this->once())->method(
'withRequired')->with(
true)->willReturnSelf();
325 $text->expects($this->once())
326 ->method(
'withDedicatedName')
327 ->with(
'language_keys')
331 $field->expects($this->once())->method(
'text')->with(
333 'Comma-separated list of language keys, e.g. de, fr, it.'
334 )->willReturn(
$text);
336 $field->expects($this->never())->method(
'select');
339 $field->expects($this->once())
341 ->with([
'language_keys' =>
$text], $this->anything())
342 ->willReturn($group);
345 static fn(): array => [],
346 static fn(
int $id) =>
null
349 $this->assertSame($group, $activity->getInputDescription($field));
354 $rbac = $this->createMock(\ilRbacSystem::class);
355 $rbac->expects($this->once())
356 ->method(
'checkAccessOfUser')
357 ->with(6,
'write', $this->anything())
365 $obj_language_factory,
367 )->maybePerformAs($this->createRealFieldsUiFactory()->input(), 6, [
'language_keys' =>
'de']);
369 $this->assertTrue($result->isError());
370 $this->assertSame(0, $fakes[1]->uninstallCallCount());
375 $rbac = $this->createStub(\ilRbacSystem::class);
376 $rbac->method(
'checkAccessOfUser')->willReturn(
true);
384 $obj_language_factory,
386 )->maybePerformAs($this->createRealFieldsUiFactory()->input(), 6, [
'language_keys' =>
'de']);
388 $this->assertFalse($result->isError());
389 $this->assertSame([
'de'], $result->value()[
'uninstalled_language_keys']);
390 $this->assertSame(1, $fakes[1]->uninstallCallCount());
396 $rbac = $this->createStub(\ilRbacSystem::class);
397 $rbac->method(
'checkAccessOfUser')->willReturn(
true);
404 $result = $this->
createActivity($lng_objects, $obj_language_factory, $rbac)
405 ->maybePerformAs($this->createRealFieldsUiFactory()->input(), 6, [
'language_keys' => [
'de',
'fr']]);
407 $this->assertFalse($result->isError());
408 $this->assertSame([
'de',
'fr'], $result->value()[
'uninstalled_language_keys']);
409 $this->assertSame(1, $fakes[1]->uninstallCallCount());
410 $this->assertSame(1, $fakes[2]->uninstallCallCount());
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Stand-in for \ilObjLanguage, which needs the global $DIC; injected via UninstallLanguage's $obj_langu...
UninstallLanguage works on language objects behind a mocked RepositoryProvider, answering from small ...
testSystemLanguageTakesPriorityOverUserLanguage()
isSystemLanguage() takes priority over "in use" when both flags are set.
testNoOverlayWriteFailureIsReportedForALanguageUninstallRejected()
A language the guards of uninstall() rejected has no overlay state to report.
testMixedBulkRequestPartitionsEachKeyIntoTheCorrectBucket()
Languages in every state at once land in their own bucket; only the uninstalled one calls uninstall()...
buildFakeLanguageWorld(array $language_objects)
testPermissionDeniedBeforePerformNeverCallsObjectFactoryOrUninstall()
testInvalidLanguageKeysAreRejected(array $parameters)
testThrowableFromWithinPerformIsTurnedIntoAResultErrorByMaybePerformAs()
testInputDescriptionUsesOnlyTheLanguageKeysFieldWithNoModeField()
testMaybePerformAsAcceptsAnArrayOfLanguageKeysAndUninstallsEachOne()
ilObjLanguageFolderGUI sends 'language_keys' as array of strings; the real grind() pipeline must join...
testDuplicateLanguageKeysAcrossStringAndArrayAreDeduplicated()
static invalidLanguageKeysProvider()
testSystemLanguageIsNeverUninstalled()
testLanguageWhereUninstallItselfRejectsIsReportedAsNotInstalled()
uninstall() returning '' is the authority: reported as not_installed_language_keys,...
testUnknownLanguageKeyIsReportedAsNotInstalledWithoutTouchingTheObjectFactory()
A key without a "lng" object is not installed, and the object factory is never invoked for it.
testPermissionGrantedPerformsAndReturnsOkResult()
testOverlayWriteFailureIsReportedAlongsideTheSuccessfulUninstall()
A module whose PO/MO overlay could not be removed is reported in addition to the successful uninstall...
testLanguageCurrentlyInUseIsNeverUninstalled()
testExistingButNotInstalledLanguageObjectIsReportedAsNotInstalled()
testNonArrayParametersAreRejected()
Pins InvalidInputException, not just its parent \InvalidArgumentException.
testInstalledOrdinaryLanguageIsUninstalled()
This describes text inputs.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
trait UninstallLanguageTestFixture
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.