instances added god may help

This commit is contained in:
2026-02-23 12:58:19 +01:00
parent 25370a1a55
commit 99db252f60
290 changed files with 9858 additions and 4914 deletions

View File

@@ -0,0 +1,45 @@
<?php
namespace MintyPHP\Tests\Service\Settings;
use MintyPHP\Service\Settings\SettingCacheService;
use PHPUnit\Framework\TestCase;
class SettingCacheServiceTest extends TestCase
{
public function testGetReturnsNullForMissingKey(): void
{
$file = $this->tempFilePath();
file_put_contents($file, "<?php\nreturn ['app_title' => 'Demo'];\n");
$service = new SettingCacheService($file);
$this->assertNull($service->get('missing'));
}
public function testUpdateWritesAndNormalizesValues(): void
{
$file = $this->tempFilePath();
file_put_contents($file, "<?php\nreturn ['app_title' => 'Old'];\n");
$service = new SettingCacheService($file);
$this->assertTrue($service->update([
'app_title' => 'New',
'app_locale' => null,
]));
$this->assertSame('New', $service->get('app_title'));
$this->assertNull($service->get('app_locale'));
}
private function tempFilePath(): string
{
$dir = sys_get_temp_dir() . '/mintyphp_settings_cache_test_' . bin2hex(random_bytes(6));
mkdir($dir, 0775, true);
$file = $dir . '/settings.php';
$this->addToAssertionCount(1);
$this->assertDirectoryExists($dir);
return $file;
}
}

View File

@@ -0,0 +1,32 @@
<?php
namespace MintyPHP\Tests\Service\Settings;
use MintyPHP\Service\Settings\SettingGateway;
use PHPUnit\Framework\TestCase;
class SettingGatewayTest extends TestCase
{
public function testGetDefaultTenantIdDelegatesToService(): void
{
$settingService = $this->createMock('MintyPHP\\Service\\Settings\\SettingService');
$settingService->expects($this->once())
->method('getDefaultTenantId')
->willReturn(42);
$gateway = new SettingGateway($settingService);
$this->assertSame(42, $gateway->getDefaultTenantId());
}
public function testSetDefaultRoleIdDelegatesToService(): void
{
$settingService = $this->createMock('MintyPHP\\Service\\Settings\\SettingService');
$settingService->expects($this->once())
->method('setDefaultRoleId')
->with(7, null)
->willReturn(true);
$gateway = new SettingGateway($settingService);
$this->assertTrue($gateway->setDefaultRoleId(7));
}
}

View File

@@ -0,0 +1,144 @@
<?php
namespace MintyPHP\Tests\Service\Settings;
use MintyPHP\Repository\Access\RoleRepository;
use MintyPHP\Repository\Org\DepartmentRepository;
use MintyPHP\Repository\Settings\SettingRepository;
use MintyPHP\Repository\Tenant\TenantRepository;
use MintyPHP\Service\Settings\SettingService;
use MintyPHP\Service\Settings\ThemeConfigService;
use PHPUnit\Framework\TestCase;
class SettingServiceTest extends TestCase
{
public function testSetDefaultTenantIdRejectsUnknownTenant(): void
{
$settingRepository = $this->createMock(SettingRepository::class);
$settingRepository->expects($this->never())->method('set');
$tenantRepository = $this->createMock(TenantRepository::class);
$tenantRepository->expects($this->once())->method('find')->with(99)->willReturn(null);
$service = $this->newService($settingRepository, $tenantRepository);
$this->assertFalse($service->setDefaultTenantId(99));
}
public function testSetApiTokenDefaultTtlDaysRejectsAboveCurrentMax(): void
{
$settingRepository = $this->createMock(SettingRepository::class);
$settingRepository->method('getValue')->willReturnCallback(
static function (string $key): ?string {
if ($key === SettingService::API_TOKEN_MAX_TTL_DAYS_KEY) {
return '30';
}
return null;
}
);
$settingRepository->expects($this->never())->method('set');
$service = $this->newService($settingRepository);
$this->assertFalse($service->setApiTokenDefaultTtlDays(31));
}
public function testSetApiTokenMaxTtlDaysUpdatesDefaultWhenNeeded(): void
{
$settingRepository = $this->createMock(SettingRepository::class);
$settingRepository->method('getValue')->willReturnCallback(
static function (string $key): ?string {
if ($key === SettingService::API_TOKEN_DEFAULT_TTL_DAYS_KEY) {
return '365';
}
return null;
}
);
$calls = [];
$settingRepository->expects($this->exactly(2))
->method('set')
->willReturnCallback(
static function (string $key, ?string $value, ?string $description) use (&$calls): bool {
$calls[] = [$key, $value, $description];
return true;
}
);
$service = $this->newService($settingRepository);
$this->assertTrue($service->setApiTokenMaxTtlDays(120));
$this->assertSame(
[
[SettingService::API_TOKEN_DEFAULT_TTL_DAYS_KEY, '120', 'setting.api_token_default_ttl_days'],
[SettingService::API_TOKEN_MAX_TTL_DAYS_KEY, '120', 'setting.api_token_max_ttl_days'],
],
$calls
);
}
public function testSetUserInactivityDeleteDaysRequiresDeactivatePolicy(): void
{
$settingRepository = $this->createMock(SettingRepository::class);
$settingRepository->method('getValue')->willReturnCallback(
static function (string $key): ?string {
if ($key === SettingService::USER_INACTIVITY_DEACTIVATE_DAYS_KEY) {
return '0';
}
return null;
}
);
$settingRepository->expects($this->never())->method('set');
$service = $this->newService($settingRepository);
$this->assertFalse($service->setUserInactivityDeleteDays(30));
}
public function testSetApiCorsAllowedOriginsRejectsInvalidOrigins(): void
{
$settingRepository = $this->createMock(SettingRepository::class);
$settingRepository->expects($this->never())->method('set');
$service = $this->newService($settingRepository);
$this->assertFalse($service->setApiCorsAllowedOrigins("https://ok.example\njavascript:alert(1)"));
}
public function testSetMicrosoftAuthorityRequiresHttps(): void
{
$settingRepository = $this->createMock(SettingRepository::class);
$settingRepository->expects($this->never())->method('set');
$service = $this->newService($settingRepository);
$this->assertFalse($service->setMicrosoftAuthority('http://login.microsoftonline.com/common/v2.0'));
}
public function testSetAppPrimaryColorNormalizesHexWithoutHash(): void
{
$settingRepository = $this->createMock(SettingRepository::class);
$settingRepository->expects($this->once())
->method('set')
->with(SettingService::APP_PRIMARY_COLOR_KEY, '#abc', 'setting.app_primary_color')
->willReturn(true);
$service = $this->newService($settingRepository);
$this->assertTrue($service->setAppPrimaryColor('abc'));
}
private function newService(
SettingRepository $settingRepository,
?TenantRepository $tenantRepository = null,
?RoleRepository $roleRepository = null,
?DepartmentRepository $departmentRepository = null
): SettingService {
$tenantRepository = $tenantRepository ?? $this->createMock(TenantRepository::class);
$roleRepository = $roleRepository ?? $this->createMock(RoleRepository::class);
$departmentRepository = $departmentRepository ?? $this->createMock(DepartmentRepository::class);
$themeConfigService = $this->createMock(ThemeConfigService::class);
$themeConfigService->method('all')->willReturn(['light' => 'Light', 'dark' => 'Dark']);
return new SettingService(
$settingRepository,
$tenantRepository,
$roleRepository,
$departmentRepository,
$themeConfigService
);
}
}

View File

@@ -0,0 +1,33 @@
<?php
namespace MintyPHP\Tests\Service\Settings;
use MintyPHP\Repository\Settings\SettingRepository;
use MintyPHP\Service\Settings\SettingCacheService;
use MintyPHP\Service\Settings\SettingGateway;
use MintyPHP\Service\Settings\SettingServicesFactory;
use MintyPHP\Service\Settings\ThemeConfigService;
use PHPUnit\Framework\TestCase;
class SettingServicesFactoryTest extends TestCase
{
public function testFactoryReturnsStableInstancesPerFactoryObject(): void
{
$factory = new SettingServicesFactory();
$this->assertInstanceOf(SettingRepository::class, $factory->createSettingRepository());
$this->assertSame($factory->createSettingRepository(), $factory->createSettingRepository());
$this->assertInstanceOf('MintyPHP\\Service\\Settings\\SettingService', $factory->createSettingService());
$this->assertSame($factory->createSettingService(), $factory->createSettingService());
$this->assertInstanceOf(SettingCacheService::class, $factory->createSettingCacheService());
$this->assertSame($factory->createSettingCacheService(), $factory->createSettingCacheService());
$this->assertInstanceOf(ThemeConfigService::class, $factory->createThemeConfigService());
$this->assertSame($factory->createThemeConfigService(), $factory->createThemeConfigService());
$this->assertInstanceOf(SettingGateway::class, $factory->createSettingGateway());
$this->assertSame($factory->createSettingGateway(), $factory->createSettingGateway());
}
}