diff --git a/framework/core/src/Extension/DefaultLanguagePackGuard.php b/framework/core/src/Extension/DefaultLanguagePackGuard.php index 747b60b3f6..70bec1a5f6 100644 --- a/framework/core/src/Extension/DefaultLanguagePackGuard.php +++ b/framework/core/src/Extension/DefaultLanguagePackGuard.php @@ -23,7 +23,7 @@ public function __construct( public function handle(Disabling $event): void { - if (! in_array('flarum-locale', $event->extension->extra)) { + if (! Arr::has($event->extension->extra, 'flarum-locale')) { return; } diff --git a/framework/core/tests/unit/Extension/DefaultLanguagePackGuardTest.php b/framework/core/tests/unit/Extension/DefaultLanguagePackGuardTest.php new file mode 100644 index 0000000000..d020936b3d --- /dev/null +++ b/framework/core/tests/unit/Extension/DefaultLanguagePackGuardTest.php @@ -0,0 +1,70 @@ +createStub(SettingsRepositoryInterface::class); + $settings->method('get') + ->willReturnCallback(function ($key, $default = null) use ($defaultLocale) { + return $key === 'default_locale' ? $defaultLocale : $default; + }); + + return new DefaultLanguagePackGuard($settings); + } + + private function disabling(array $extra, string $name = 'flarum/lang-english'): Disabling + { + return new Disabling(new Extension('/tmp/ext', [ + 'name' => $name, + 'extra' => $extra, + ])); + } + + #[Test] + public function it_blocks_disabling_the_default_language_pack() + { + $this->expectException(PermissionDeniedException::class); + + $this->guard('en')->handle( + $this->disabling(['flarum-locale' => ['code' => 'en', 'title' => 'English']]) + ); + } + + #[Test] + public function it_allows_disabling_a_non_default_language_pack() + { + $this->expectNotToPerformAssertions(); + + $this->guard('en')->handle( + $this->disabling(['flarum-locale' => ['code' => 'fr', 'title' => 'French']]) + ); + } + + #[Test] + public function it_allows_disabling_a_non_language_pack_extension() + { + $this->expectNotToPerformAssertions(); + + $this->guard('en')->handle( + $this->disabling(['flarum-extension' => ['title' => 'Some Extension']], 'acme/some-extension') + ); + } +}