Skip to content

Commit

Permalink
feat(files/user-config): make configs admin-configurable
Browse files Browse the repository at this point in the history
Signed-off-by: Kai Henseler <kai.henseler@strato.de>
  • Loading branch information
bromiesTM committed Dec 11, 2024
1 parent 45386eb commit 35d852d
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 7 deletions.
11 changes: 10 additions & 1 deletion apps/files/lib/Service/UserConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
namespace OCA\Files\Service;

use OCA\Files\AppInfo\Application;
use OCP\AppFramework\Services\IAppConfig;
use OCP\IConfig;
use OCP\IUser;
use OCP\IUserSession;
Expand Down Expand Up @@ -54,6 +55,7 @@ class UserConfig {
public function __construct(
protected IConfig $config,
IUserSession $userSession,
protected IAppConfig $appConfig
) {
$this->user = $userSession->getUser();
}
Expand Down Expand Up @@ -146,6 +148,13 @@ public function getConfigs(): array {
return $value;
}, $this->getAllowedConfigKeys());

return array_combine($this->getAllowedConfigKeys(), $userConfigs);
$userConfigsMerged = array_combine($this->getAllowedConfigKeys(), $userConfigs);

// override user configs with app configs
$configs = array_map(function (string $key) use ($userConfigsMerged) {
return $this->appConfig->getAppValueBool($key, $userConfigsMerged[$key]);

Check failure on line 155 in apps/files/lib/Service/UserConfig.php

View workflow job for this annotation

GitHub Actions / static-code-analysis

InvalidScalarArgument

apps/files/lib/Service/UserConfig.php:155:51: InvalidScalarArgument: Argument 2 of OCP\AppFramework\Services\IAppConfig::getAppValueBool expects bool, but bool|string provided (see https://psalm.dev/012)
}, $this->getAllowedConfigKeys());

return array_combine($this->getAllowedConfigKeys(), $configs);
}
}
62 changes: 56 additions & 6 deletions apps/files/tests/Service/UserConfigTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

use OCA\Files\AppInfo\Application;
use OCA\Files\Service\UserConfig;
use OCP\AppFramework\Services\IAppConfig;
use OCP\IConfig;
use OCP\IUser;
use OCP\IUserSession;
Expand All @@ -34,6 +35,9 @@ class UserConfigTest extends \Test\TestCase {
/** @var IUserSession|\PHPUnit\Framework\MockObject\MockObject */
private $userSessionMock;

/** @var IAppConfig|\PHPUnit\Framework\MockObject\MockObject */
private $appConfigMock;

/**
* @var UserConfig|\PHPUnit\Framework\MockObject\MockObject
*/
Expand All @@ -42,6 +46,7 @@ class UserConfigTest extends \Test\TestCase {
protected function setUp(): void {
parent::setUp();
$this->configMock = $this->createMock(IConfig::class);
$this->appConfigMock = $this->createMock(IAppConfig::class);

$this->userUID = static::getUniqueID('user_id-');
\OC::$server->getUserManager()->createUser($this->userUID, 'test');
Expand All @@ -67,6 +72,7 @@ protected function getUserConfigService(array $methods = []) {
->setConstructorArgs([
$this->configMock,
$this->userSessionMock,
$this->appConfigMock,
])
->setMethods($methods)
->getMock();
Expand Down Expand Up @@ -100,31 +106,31 @@ public function testThrowsExceptionWhenNoUserLoggedInForSetConfig(): void {
$this->expectException(\Exception::class);
$this->expectExceptionMessage('No user logged in');

$userConfig = new UserConfig($this->configMock, $this->userSessionMock);
$userConfig = new UserConfig($this->configMock, $this->userSessionMock, $this->appConfigMock);
$userConfig->setConfig('crop_image_previews', true);
}

public function testThrowsInvalidArgumentExceptionForUnknownConfigKey(): void {
$this->expectException(\InvalidArgumentException::class);
$this->expectExceptionMessage('Unknown config key');

$userConfig = new UserConfig($this->configMock, $this->userSessionMock);
$userConfig = new UserConfig($this->configMock, $this->userSessionMock, $this->appConfigMock);
$userConfig->setConfig('unknown_key', true);
}

public function testThrowsInvalidArgumentExceptionForInvalidConfigValue(): void {
$this->expectException(\InvalidArgumentException::class);
$this->expectExceptionMessage('Invalid config value');

$userConfig = new UserConfig($this->configMock, $this->userSessionMock);
$userConfig = new UserConfig($this->configMock, $this->userSessionMock, $this->appConfigMock);
$userConfig->setConfig('crop_image_previews', 'foo');
}

public function testSetsConfigSuccessfully(): void {
$this->configMock->expects($this->once())
->method('setUserValue')
->with($this->userUID, Application::APP_ID, 'crop_image_previews', '1');
$userConfig = new UserConfig($this->configMock, $this->userSessionMock);
$userConfig = new UserConfig($this->configMock, $this->userSessionMock, $this->appConfigMock);
$userConfig->setConfig('crop_image_previews', true);
}

Expand All @@ -135,7 +141,13 @@ public function testGetsConfigsWithDefaultValuesSuccessfully(): void {
return $default;
});

$userConfig = new UserConfig($this->configMock, $this->userSessionMock);
// pass the default app settings unchanged
$this->appConfigMock->method('getAppValueBool')
->willReturnCallback(function ($key, $default) {
return $default;
});

$userConfig = new UserConfig($this->configMock, $this->userSessionMock, $this->appConfigMock);
$configs = $userConfig->getConfigs();
$this->assertEquals([
'crop_image_previews' => true,
Expand All @@ -162,7 +174,13 @@ public function testGetsConfigsOverrideWithUserValuesSuccessfully(): void {
return $default;
});

$userConfig = new UserConfig($this->configMock, $this->userSessionMock);
// pass the default app settings unchanged
$this->appConfigMock->method('getAppValueBool')
->willReturnCallback(function ($key, $default) {
return $default;
});

$userConfig = new UserConfig($this->configMock, $this->userSessionMock, $this->appConfigMock);
$configs = $userConfig->getConfigs();
$this->assertEquals([
'crop_image_previews' => false,
Expand All @@ -173,4 +191,36 @@ public function testGetsConfigsOverrideWithUserValuesSuccessfully(): void {
'folder_tree' => true,
], $configs);
}

public function testGetsConfigsOverrideWithAppsValuesSuccessfully(): void {
$this->userSessionMock->method('getUser')->willReturn($this->userMock);

// set all user values to true
$this->configMock->method('getUserValue')
->willReturnCallback(function () {
return true;
});

// emulate override by the app config values
$this->appConfigMock->method('getAppValueBool')
->willReturnCallback(function ($key, $default) {
if ($key === 'crop_image_previews') {
return false;
} elseif ($key === 'show_hidden') {
return false;
}
return $default;
});

$userConfig = new UserConfig($this->configMock, $this->userSessionMock, $this->appConfigMock);
$configs = $userConfig->getConfigs();
$this->assertEquals([
'crop_image_previews' => false,
'show_hidden' => false,
'sort_favorites_first' => true,
'sort_folders_first' => true,
'grid_view' => true,
'folder_tree' => true,
], $configs);
}
}

0 comments on commit 35d852d

Please sign in to comment.