TenantAtlas/apps/platform/app/Support/Baselines/Compare/CompareStrategyKey.php
ahmido d644265d30 Spec 203: extract baseline compare strategy (#233)
## Summary
- extract baseline compare orchestration behind an explicit strategy contract and registry
- preserve the current Intune compare path through a dedicated `IntuneCompareStrategy`
- harden compare launch and review surfaces for mixed, unsupported, incomplete, and strategy-failure truth
- add Spec 203 artifacts, focused regression coverage, and future-domain strategy proof tests

## Testing
- `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Unit/Baselines/CompareStrategyRegistryTest.php tests/Unit/Baselines/CompareSubjectResultContractTest.php tests/Feature/Baselines/BaselineCompareStrategySelectionTest.php tests/Feature/Baselines/BaselineComparePreconditionsTest.php tests/Feature/Baselines/BaselineCompareExecutionGuardTest.php tests/Feature/Baselines/BaselineCompareMatrixCompareAllActionTest.php tests/Feature/Filament/BaselineProfileCompareStartSurfaceTest.php tests/Feature/Filament/BaselineCompareLandingStartSurfaceTest.php tests/Feature/Filament/BaselineCompareLandingWhyNoFindingsTest.php tests/Feature/Filament/BaselineCompareMatrixPageTest.php tests/Feature/Filament/OperationRunBaselineTruthSurfaceTest.php`
- `cd apps/platform && ./vendor/bin/sail bin pint --dirty --format agent`

## Notes
- no new Filament panel/provider registration changes
- no global-search resource changes
- no new asset registration or deployment step changes

Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de>
Reviewed-on: #233
2026-04-13 21:17:04 +00:00

44 lines
1023 B
PHP

<?php
declare(strict_types=1);
namespace App\Support\Baselines\Compare;
use InvalidArgumentException;
use Stringable;
final class CompareStrategyKey implements Stringable
{
public readonly string $value;
public function __construct(string $value)
{
$normalized = trim(mb_strtolower($value));
if ($normalized === '' || ! preg_match('/^[a-z0-9_]+$/', $normalized)) {
throw new InvalidArgumentException('Compare strategy keys must be non-empty lowercase snake_case strings.');
}
$this->value = $normalized;
}
public static function from(self|string $value): self
{
return $value instanceof self ? $value : new self($value);
}
public static function intunePolicy(): self
{
return new self('intune_policy');
}
public function equals(self|string $other): bool
{
return $this->value === self::from($other)->value;
}
public function __toString(): string
{
return $this->value;
}
}