test: add 92 tests for 12 untested gateway and service classes
Cover Settings gateways (Session, LoginPersistence, SystemAudit, Smtp,
FrontendTelemetry, Metadata, App), Auth gateways (ExternalIdentity,
Tenant), DirectorySettings, UserSettings, and HotkeyService.
Gateway test coverage rises from 25% to 52%, overall service/gateway
coverage from 58.6% to 70.7%.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-13 20:46:20 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace MintyPHP\Tests\Service\Settings;
|
|
|
|
|
|
|
|
|
|
use MintyPHP\Repository\Settings\SettingRepositoryInterface;
|
|
|
|
|
use MintyPHP\Service\Settings\SettingsAppGateway;
|
|
|
|
|
use MintyPHP\Service\Settings\SettingsMetadataGateway;
|
|
|
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
|
|
|
|
|
|
class SettingsAppGatewayTest extends TestCase
|
|
|
|
|
{
|
refactor(settings): remove global appearance settings — tenant is sole source
Removes the global app_theme, app_theme_user and app_primary_color settings
from the admin/settings area and the underlying service/cache/API/i18n/docs
layers. The tenant columns (tenants.primary_color, default_theme,
allow_user_theme) become the single source of truth for appearance.
Branding helpers are tenant-only and fall back to a hardcoded 'light' theme
with no brand color when no tenant context is available (login, error,
pre-session pages). The APP_THEME env var is removed.
Scope:
- UI: Appearance tab gone from /admin/settings; tenant edit form drops the
global-fallback color preview.
- Service: SettingsAppGateway no longer exposes setting-backed accessors
for theme/user-theme/primary-color. Theme catalog utilities (listThemes,
isAllowedTheme, normalizeTheme, resolveDefaultTheme) stay and are used
across Tenant / Auth / User flows; resolveDefaultTheme now hardcodes
'light' with a catalog fallback (no global/env lookup).
- AdminSettingsService: buildPageData, sanitization, audit snapshot, apply
step and cache payload are all stripped of the three keys. Dead helper
applyAppPrimaryColor + normalizePrimaryColor removed.
- Cache: SettingCacheService HOT_PATH_KEYS drops the three keys.
- API: /settings (GET/PUT) and /settings/public (GET) no longer expose
appearance fields; OpenAPI schemas pruned accordingly.
- Audit redaction list shortened.
- DB: db/init/init.sql seed rows removed. No migration for existing
installs — legacy rows stay inert.
- i18n + docs: setting.app_theme, setting.app_theme_user,
setting.app_primary_color removed from de+en locales; reference and
explanation docs updated.
- Tests: covering tests for the removed methods pruned; ThemeResolutionTest
rewritten for tenant-only semantics. One unrelated PHP-CS-Fixer issue in
UserRegistrar.php cleaned up to keep QG-006 green.
Workflow: .agents/runs/SETTINGS-APPEARANCE-TENANT-ONLY/ (gitignored).
Gates: QG-001..003, QG-006, QG-008 all pass (1985 tests, 28764 assertions).
Reviews: code, security, acceptance all pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 22:40:15 +02:00
|
|
|
private function createGateway(SettingRepositoryInterface $settings): SettingsAppGateway
|
test: add 92 tests for 12 untested gateway and service classes
Cover Settings gateways (Session, LoginPersistence, SystemAudit, Smtp,
FrontendTelemetry, Metadata, App), Auth gateways (ExternalIdentity,
Tenant), DirectorySettings, UserSettings, and HotkeyService.
Gateway test coverage rises from 25% to 52%, overall service/gateway
coverage from 58.6% to 70.7%.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-13 20:46:20 +02:00
|
|
|
{
|
2026-04-24 16:15:10 +02:00
|
|
|
return new SettingsAppGateway(new SettingsMetadataGateway($settings));
|
test: add 92 tests for 12 untested gateway and service classes
Cover Settings gateways (Session, LoginPersistence, SystemAudit, Smtp,
FrontendTelemetry, Metadata, App), Auth gateways (ExternalIdentity,
Tenant), DirectorySettings, UserSettings, and HotkeyService.
Gateway test coverage rises from 25% to 52%, overall service/gateway
coverage from 58.6% to 70.7%.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-13 20:46:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testGetAppTitleReturnsNullWhenEmpty(): void
|
|
|
|
|
{
|
|
|
|
|
$settings = $this->createMock(SettingRepositoryInterface::class);
|
|
|
|
|
$settings->expects($this->any())->method('getValue')->with('app_title')->willReturn(null);
|
|
|
|
|
|
|
|
|
|
$gateway = $this->createGateway($settings);
|
|
|
|
|
$this->assertNull($gateway->getAppTitle());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testGetAppTitleReturnsTrimmedValue(): void
|
|
|
|
|
{
|
|
|
|
|
$settings = $this->createMock(SettingRepositoryInterface::class);
|
|
|
|
|
$settings->expects($this->any())->method('getValue')->with('app_title')->willReturn(' My App ');
|
|
|
|
|
|
|
|
|
|
$gateway = $this->createGateway($settings);
|
|
|
|
|
$this->assertSame('My App', $gateway->getAppTitle());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testGetAppLocaleReturnsNullWhenNotSet(): void
|
|
|
|
|
{
|
|
|
|
|
$settings = $this->createMock(SettingRepositoryInterface::class);
|
|
|
|
|
$settings->expects($this->any())->method('getValue')->with('app_locale')->willReturn(null);
|
|
|
|
|
|
|
|
|
|
$gateway = $this->createGateway($settings);
|
|
|
|
|
$this->assertNull($gateway->getAppLocale());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testIsRegistrationEnabledDefaultsToTrue(): void
|
|
|
|
|
{
|
|
|
|
|
$settings = $this->createMock(SettingRepositoryInterface::class);
|
|
|
|
|
$settings->expects($this->any())->method('getValue')->with('app_registration')->willReturn(null);
|
|
|
|
|
|
|
|
|
|
$gateway = $this->createGateway($settings);
|
|
|
|
|
$this->assertTrue($gateway->isRegistrationEnabled());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testIsRegistrationEnabledReturnsFalseWhenDisabled(): void
|
|
|
|
|
{
|
|
|
|
|
$settings = $this->createMock(SettingRepositoryInterface::class);
|
|
|
|
|
$settings->expects($this->any())->method('getValue')->with('app_registration')->willReturn('0');
|
|
|
|
|
|
|
|
|
|
$gateway = $this->createGateway($settings);
|
|
|
|
|
$this->assertFalse($gateway->isRegistrationEnabled());
|
|
|
|
|
}
|
|
|
|
|
}
|