mirror of
https://github.com/chenasraf/nextcloud-forum.git
synced 2026-05-18 01:28:58 +00:00
298 lines
9.5 KiB
PHP
298 lines
9.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace OCA\Forum\Tests\Service;
|
|
|
|
use OCA\Forum\Service\AdminSettingsService;
|
|
use OCP\AppFramework\Services\IAppConfig;
|
|
use OCP\IL10N;
|
|
use PHPUnit\Framework\MockObject\MockObject;
|
|
use PHPUnit\Framework\TestCase;
|
|
use Psr\Log\LoggerInterface;
|
|
|
|
class AdminSettingsServiceTest extends TestCase {
|
|
private AdminSettingsService $service;
|
|
/** @var IAppConfig&MockObject */
|
|
private IAppConfig $config;
|
|
/** @var IL10N&MockObject */
|
|
private IL10N $l10n;
|
|
/** @var LoggerInterface&MockObject */
|
|
private LoggerInterface $logger;
|
|
|
|
protected function setUp(): void {
|
|
$this->config = $this->createMock(IAppConfig::class);
|
|
$this->l10n = $this->createMock(IL10N::class);
|
|
$this->logger = $this->createMock(LoggerInterface::class);
|
|
|
|
// Mock translations
|
|
$this->l10n->method('t')
|
|
->willReturnCallback(function ($text) {
|
|
return $text;
|
|
});
|
|
|
|
$this->service = new AdminSettingsService(
|
|
$this->config,
|
|
$this->l10n,
|
|
$this->logger
|
|
);
|
|
}
|
|
|
|
public function testGetAllSettingsReturnsAllSettings(): void {
|
|
$this->config->expects($this->exactly(2))
|
|
->method('getAppValueString')
|
|
->willReturnCallback(function ($key, $default, $lazy) {
|
|
return match ($key) {
|
|
AdminSettingsService::SETTING_TITLE => 'My Forum',
|
|
AdminSettingsService::SETTING_SUBTITLE => 'Welcome!',
|
|
default => $default,
|
|
};
|
|
});
|
|
|
|
$this->config->expects($this->exactly(5))
|
|
->method('getAppValueBool')
|
|
->willReturnCallback(function ($key, $default, $lazy) {
|
|
return match ($key) {
|
|
AdminSettingsService::SETTING_ALLOW_GUEST_ACCESS => true,
|
|
AdminSettingsService::SETTING_IS_INITIALIZED => false,
|
|
AdminSettingsService::SETTING_PUBLIC_EDIT_HISTORY => true,
|
|
AdminSettingsService::SETTING_ALLOW_EDIT_HISTORY_USER_OVERRIDE => false,
|
|
AdminSettingsService::SETTING_ENABLE_SIGNATURES => true,
|
|
default => $default,
|
|
};
|
|
});
|
|
|
|
$result = $this->service->getAllSettings();
|
|
|
|
$this->assertIsArray($result);
|
|
$this->assertCount(7, $result);
|
|
$this->assertEquals('My Forum', $result[AdminSettingsService::SETTING_TITLE]);
|
|
$this->assertEquals('Welcome!', $result[AdminSettingsService::SETTING_SUBTITLE]);
|
|
$this->assertTrue($result[AdminSettingsService::SETTING_ALLOW_GUEST_ACCESS]);
|
|
$this->assertFalse($result[AdminSettingsService::SETTING_IS_INITIALIZED]);
|
|
$this->assertTrue($result[AdminSettingsService::SETTING_PUBLIC_EDIT_HISTORY]);
|
|
$this->assertFalse($result[AdminSettingsService::SETTING_ALLOW_EDIT_HISTORY_USER_OVERRIDE]);
|
|
$this->assertTrue($result[AdminSettingsService::SETTING_ENABLE_SIGNATURES]);
|
|
}
|
|
|
|
public function testGetSettingReturnsCorrectStringValue(): void {
|
|
$key = AdminSettingsService::SETTING_TITLE;
|
|
|
|
$this->config->expects($this->once())
|
|
->method('getAppValueString')
|
|
->with($key, 'Forum', true)
|
|
->willReturn('Custom Title');
|
|
|
|
$result = $this->service->getSetting($key);
|
|
|
|
$this->assertEquals('Custom Title', $result);
|
|
}
|
|
|
|
public function testGetSettingReturnsCorrectBoolValue(): void {
|
|
$key = AdminSettingsService::SETTING_ALLOW_GUEST_ACCESS;
|
|
|
|
$this->config->expects($this->once())
|
|
->method('getAppValueBool')
|
|
->with($key, false, true)
|
|
->willReturn(true);
|
|
|
|
$result = $this->service->getSetting($key);
|
|
|
|
$this->assertTrue($result);
|
|
}
|
|
|
|
public function testGetSettingReturnsDefaultWhenNotSet(): void {
|
|
$key = AdminSettingsService::SETTING_TITLE;
|
|
|
|
$this->config->expects($this->once())
|
|
->method('getAppValueString')
|
|
->with($key, 'Forum', true)
|
|
->willReturn('Forum');
|
|
|
|
$result = $this->service->getSetting($key);
|
|
|
|
$this->assertEquals('Forum', $result);
|
|
}
|
|
|
|
public function testGetSettingThrowsExceptionForInvalidKey(): void {
|
|
$invalidKey = 'invalid_key';
|
|
|
|
$this->expectException(\InvalidArgumentException::class);
|
|
$this->expectExceptionMessage("Invalid setting key: $invalidKey");
|
|
|
|
$this->service->getSetting($invalidKey);
|
|
}
|
|
|
|
public function testSetSettingSetsStringValue(): void {
|
|
$key = AdminSettingsService::SETTING_TITLE;
|
|
$value = 'New Title';
|
|
|
|
$this->config->expects($this->once())
|
|
->method('setAppValueString')
|
|
->with($key, $value, true)
|
|
->willReturn(true);
|
|
|
|
$this->service->setSetting($key, $value);
|
|
}
|
|
|
|
public function testSetSettingSetsBoolValue(): void {
|
|
$key = AdminSettingsService::SETTING_ALLOW_GUEST_ACCESS;
|
|
$value = true;
|
|
|
|
$this->config->expects($this->once())
|
|
->method('setAppValueBool')
|
|
->with($key, $value, true)
|
|
->willReturn(true);
|
|
|
|
$this->service->setSetting($key, $value);
|
|
}
|
|
|
|
public function testSetSettingThrowsExceptionForInvalidKey(): void {
|
|
$invalidKey = 'invalid_key';
|
|
|
|
$this->expectException(\InvalidArgumentException::class);
|
|
$this->expectExceptionMessage("Invalid setting key: $invalidKey");
|
|
|
|
$this->service->setSetting($invalidKey, 'value');
|
|
}
|
|
|
|
public function testUpdateSettingsUpdatesMultipleValues(): void {
|
|
$settings = [
|
|
AdminSettingsService::SETTING_TITLE => 'New Title',
|
|
AdminSettingsService::SETTING_SUBTITLE => 'New Subtitle',
|
|
AdminSettingsService::SETTING_ALLOW_GUEST_ACCESS => true,
|
|
];
|
|
|
|
$this->config->expects($this->exactly(2))
|
|
->method('setAppValueString')
|
|
->willReturnCallback(function ($key, $value, $lazy) use ($settings) {
|
|
if ($key === AdminSettingsService::SETTING_TITLE) {
|
|
$this->assertEquals($settings[AdminSettingsService::SETTING_TITLE], $value);
|
|
} elseif ($key === AdminSettingsService::SETTING_SUBTITLE) {
|
|
$this->assertEquals($settings[AdminSettingsService::SETTING_SUBTITLE], $value);
|
|
}
|
|
return true;
|
|
});
|
|
|
|
$this->config->expects($this->once())
|
|
->method('setAppValueBool')
|
|
->with(AdminSettingsService::SETTING_ALLOW_GUEST_ACCESS, true, true)
|
|
->willReturn(true);
|
|
|
|
$this->config->expects($this->exactly(2))
|
|
->method('getAppValueString')
|
|
->willReturnCallback(function ($key, $default, $lazy) use ($settings) {
|
|
return match ($key) {
|
|
AdminSettingsService::SETTING_TITLE => $settings[AdminSettingsService::SETTING_TITLE],
|
|
AdminSettingsService::SETTING_SUBTITLE => $settings[AdminSettingsService::SETTING_SUBTITLE],
|
|
default => $default,
|
|
};
|
|
});
|
|
|
|
$this->config->expects($this->exactly(5))
|
|
->method('getAppValueBool')
|
|
->willReturnCallback(function ($key, $default, $lazy) {
|
|
return match ($key) {
|
|
AdminSettingsService::SETTING_ALLOW_GUEST_ACCESS => true,
|
|
AdminSettingsService::SETTING_IS_INITIALIZED => false,
|
|
AdminSettingsService::SETTING_PUBLIC_EDIT_HISTORY => true,
|
|
AdminSettingsService::SETTING_ALLOW_EDIT_HISTORY_USER_OVERRIDE => false,
|
|
default => $default,
|
|
};
|
|
});
|
|
|
|
$result = $this->service->updateSettings($settings);
|
|
|
|
$this->assertIsArray($result);
|
|
$this->assertEquals('New Title', $result[AdminSettingsService::SETTING_TITLE]);
|
|
$this->assertEquals('New Subtitle', $result[AdminSettingsService::SETTING_SUBTITLE]);
|
|
$this->assertTrue($result[AdminSettingsService::SETTING_ALLOW_GUEST_ACCESS]);
|
|
}
|
|
|
|
public function testUpdateSettingsThrowsExceptionForInvalidKey(): void {
|
|
$settings = [
|
|
'invalid_key' => 'value',
|
|
];
|
|
|
|
$this->expectException(\InvalidArgumentException::class);
|
|
$this->expectExceptionMessage('Invalid setting key: invalid_key');
|
|
|
|
$this->service->updateSettings($settings);
|
|
}
|
|
|
|
public function testUpdateSettingsWithPartialUpdate(): void {
|
|
$settings = [
|
|
AdminSettingsService::SETTING_TITLE => 'Updated Title',
|
|
];
|
|
|
|
$this->config->expects($this->once())
|
|
->method('setAppValueString')
|
|
->with(AdminSettingsService::SETTING_TITLE, 'Updated Title', true)
|
|
->willReturn(true);
|
|
|
|
$this->config->expects($this->exactly(2))
|
|
->method('getAppValueString')
|
|
->willReturnCallback(function ($key, $default, $lazy) {
|
|
return match ($key) {
|
|
AdminSettingsService::SETTING_TITLE => 'Updated Title',
|
|
AdminSettingsService::SETTING_SUBTITLE => 'Welcome to the forum!',
|
|
default => $default,
|
|
};
|
|
});
|
|
|
|
$this->config->expects($this->exactly(5))
|
|
->method('getAppValueBool')
|
|
->willReturnCallback(function ($key, $default, $lazy) {
|
|
return match ($key) {
|
|
AdminSettingsService::SETTING_ALLOW_GUEST_ACCESS => false,
|
|
AdminSettingsService::SETTING_IS_INITIALIZED => false,
|
|
AdminSettingsService::SETTING_PUBLIC_EDIT_HISTORY => true,
|
|
AdminSettingsService::SETTING_ALLOW_EDIT_HISTORY_USER_OVERRIDE => false,
|
|
default => $default,
|
|
};
|
|
});
|
|
|
|
$result = $this->service->updateSettings($settings);
|
|
|
|
$this->assertIsArray($result);
|
|
$this->assertEquals('Updated Title', $result[AdminSettingsService::SETTING_TITLE]);
|
|
$this->assertEquals('Welcome to the forum!', $result[AdminSettingsService::SETTING_SUBTITLE]);
|
|
$this->assertFalse($result[AdminSettingsService::SETTING_ALLOW_GUEST_ACCESS]);
|
|
}
|
|
|
|
public function testGetDefaultReturnsCorrectDefaults(): void {
|
|
// Test title default
|
|
$this->config->expects($this->once())
|
|
->method('getAppValueString')
|
|
->with(AdminSettingsService::SETTING_TITLE, 'Forum', true)
|
|
->willReturn('Forum');
|
|
|
|
$result = $this->service->getSetting(AdminSettingsService::SETTING_TITLE);
|
|
$this->assertEquals('Forum', $result);
|
|
}
|
|
|
|
public function testSetSettingCoercesBooleanValue(): void {
|
|
$key = AdminSettingsService::SETTING_ALLOW_GUEST_ACCESS;
|
|
|
|
// Test with integer 1 (should be coerced to true)
|
|
$this->config->expects($this->once())
|
|
->method('setAppValueBool')
|
|
->with($key, true, true)
|
|
->willReturn(true);
|
|
|
|
$this->service->setSetting($key, 1);
|
|
}
|
|
|
|
public function testSetSettingCoercesStringValue(): void {
|
|
$key = AdminSettingsService::SETTING_TITLE;
|
|
|
|
// Test with integer (should be coerced to string)
|
|
$this->config->expects($this->once())
|
|
->method('setAppValueString')
|
|
->with($key, '123', true)
|
|
->willReturn(true);
|
|
|
|
$this->service->setSetting($key, 123);
|
|
}
|
|
}
|