Files
breadcrumb-the-shire/tests/Service/Settings/SettingsFrontendTelemetryGatewayTest.php
fs 98afac24b1 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

117 lines
4.8 KiB
PHP

<?php
namespace MintyPHP\Tests\Service\Settings;
use MintyPHP\Repository\Settings\SettingRepositoryInterface;
use MintyPHP\Service\Settings\SettingsFrontendTelemetryGateway;
use MintyPHP\Service\Settings\SettingsMetadataGateway;
use PHPUnit\Framework\TestCase;
class SettingsFrontendTelemetryGatewayTest extends TestCase
{
public function testIsFrontendTelemetryEnabledReturnsFalseByDefault(): void
{
$settings = $this->createMock(SettingRepositoryInterface::class);
$settings->method('getValue')->willReturnCallback(static function (string $key): ?string {
return null;
});
$gateway = new SettingsFrontendTelemetryGateway(new SettingsMetadataGateway($settings));
$this->assertFalse($gateway->isFrontendTelemetryEnabled());
}
public function testIsFrontendTelemetryEnabledReturnsTrueWhenEnabled(): void
{
$settings = $this->createMock(SettingRepositoryInterface::class);
$settings->method('getValue')->willReturnCallback(static function (string $key): ?string {
return match ($key) {
'frontend_telemetry_enabled' => '1',
default => null,
};
});
$gateway = new SettingsFrontendTelemetryGateway(new SettingsMetadataGateway($settings));
$this->assertTrue($gateway->isFrontendTelemetryEnabled());
}
public function testGetFrontendTelemetrySampleRateDefaultsToPointTwo(): void
{
$settings = $this->createMock(SettingRepositoryInterface::class);
$settings->method('getValue')->willReturnCallback(static function (string $key): ?string {
return null;
});
$gateway = new SettingsFrontendTelemetryGateway(new SettingsMetadataGateway($settings));
$this->assertSame(0.2, $gateway->getFrontendTelemetrySampleRate());
}
public function testGetFrontendTelemetrySampleRateClampsToZero(): void
{
$settings = $this->createMock(SettingRepositoryInterface::class);
$settings->method('getValue')->willReturnCallback(static function (string $key): ?string {
return match ($key) {
'frontend_telemetry_sample_rate' => '-0.5',
default => null,
};
});
$gateway = new SettingsFrontendTelemetryGateway(new SettingsMetadataGateway($settings));
// Out-of-range values fall back to the default 0.2
$this->assertSame(0.2, $gateway->getFrontendTelemetrySampleRate());
}
public function testGetFrontendTelemetrySampleRateClampsToOne(): void
{
$settings = $this->createMock(SettingRepositoryInterface::class);
$settings->method('getValue')->willReturnCallback(static function (string $key): ?string {
return match ($key) {
'frontend_telemetry_sample_rate' => '1.5',
default => null,
};
});
$gateway = new SettingsFrontendTelemetryGateway(new SettingsMetadataGateway($settings));
// Out-of-range values fall back to the default 0.2
$this->assertSame(0.2, $gateway->getFrontendTelemetrySampleRate());
}
public function testGetFrontendTelemetryAllowedEventsReturnsDefaults(): void
{
$settings = $this->createMock(SettingRepositoryInterface::class);
$settings->method('getValue')->willReturnCallback(static function (string $key): ?string {
return null;
});
$gateway = new SettingsFrontendTelemetryGateway(new SettingsMetadataGateway($settings));
$this->assertSame(['warn_once', 'ajax_error'], $gateway->getFrontendTelemetryAllowedEvents());
}
public function testSetFrontendTelemetryAllowedEventsNormalizesAndDeduplicates(): void
{
$settings = $this->createMock(SettingRepositoryInterface::class);
$stored = null;
$settings->expects($this->once())
->method('set')
->willReturnCallback(static function (string $key, ?string $value) use (&$stored): bool {
if ($key === 'frontend_telemetry_allowed_events') {
$stored = $value;
}
return true;
});
$settings->method('getValue')->willReturnCallback(static function (string $key) use (&$stored): ?string {
return match ($key) {
'frontend_telemetry_allowed_events' => $stored,
default => null,
};
});
$gateway = new SettingsFrontendTelemetryGateway(new SettingsMetadataGateway($settings));
// Pass duplicates with mixed casing and frontend. prefix
$this->assertTrue($gateway->setFrontendTelemetryAllowedEvents('frontend.WARN_ONCE, warn_once, AJAX_ERROR'));
// Stored value should be sorted, deduplicated, and lowercased
$this->assertSame('ajax_error,warn_once', $stored);
}
}