Some checks failed
Main Confidence / confidence (push) Failing after 57s
## Summary - add the provider boundary catalog, boundary support types, and guardrails for platform-core versus provider-owned seams - harden provider gateway, identity resolution, operation registry, and start-gate behavior to require explicit provider bindings - add unit and feature coverage for boundary classification, runtime preservation, unsupported paths, and platform-core leakage guards - add the full Spec Kit artifact set for spec 237 and update roadmap/spec-candidate tracking ## Validation - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Unit/Providers/ProviderBoundaryClassificationTest.php tests/Unit/Providers/ProviderBoundaryGuardrailTest.php tests/Feature/Providers/ProviderBoundaryHardeningTest.php tests/Feature/Providers/UnsupportedProviderBoundaryPathTest.php tests/Feature/Guards/ProviderBoundaryPlatformCoreGuardTest.php` - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Unit/Providers/ProviderGatewayTest.php tests/Unit/Providers/ProviderIdentityResolverTest.php tests/Unit/Providers/ProviderOperationStartGateTest.php` - `cd apps/platform && ./vendor/bin/sail bin pint --dirty --format agent` - browser smoke: `http://localhost/admin/provider-connections?tenant_id=18000000-0000-4000-8000-000000000180` loaded with the local smoke user, the empty-state CTA reached the canonical create route, and cancel returned to the scoped list Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #273
58 lines
2.8 KiB
PHP
58 lines
2.8 KiB
PHP
<?php
|
|
|
|
use App\Support\Providers\Boundary\ProviderBoundaryCatalog;
|
|
use App\Support\Providers\Boundary\ProviderBoundaryOwner;
|
|
use App\Support\Providers\Boundary\ProviderBoundarySeam;
|
|
|
|
it('classifies the authoritative first-slice provider seams', function (): void {
|
|
$catalog = app(ProviderBoundaryCatalog::class);
|
|
|
|
expect(array_keys($catalog->all()))->toBe([
|
|
'provider.connection_resolution',
|
|
'provider.gateway_runtime',
|
|
'provider.identity_resolution',
|
|
'provider.operation_registry',
|
|
'provider.operation_start_gate',
|
|
]);
|
|
|
|
expect($catalog->get('provider.gateway_runtime')->owner)->toBe(ProviderBoundaryOwner::ProviderOwned);
|
|
expect($catalog->get('provider.identity_resolution')->owner)->toBe(ProviderBoundaryOwner::PlatformCore);
|
|
expect($catalog->get('provider.connection_resolution')->owner)->toBe(ProviderBoundaryOwner::PlatformCore);
|
|
expect($catalog->get('provider.operation_registry')->owner)->toBe(ProviderBoundaryOwner::PlatformCore);
|
|
expect($catalog->get('provider.operation_start_gate')->owner)->toBe(ProviderBoundaryOwner::PlatformCore);
|
|
});
|
|
|
|
it('records implementation paths and bounded exception metadata for platform-core seams', function (): void {
|
|
$catalog = app(ProviderBoundaryCatalog::class);
|
|
|
|
$identity = $catalog->get('provider.identity_resolution');
|
|
|
|
expect($identity->coversPath('app/Services/Providers/ProviderIdentityResolution.php'))->toBeTrue()
|
|
->and($identity->neutralTerms)->toContain('target scope')
|
|
->and($identity->retainedProviderSemantics)->toContain('entra_tenant_id')
|
|
->and($identity->retainedProviderSemantics)->not->toContain('Microsoft Graph option keys')
|
|
->and($identity->followUpAction)->toBe(ProviderBoundarySeam::FOLLOW_UP_SPEC);
|
|
|
|
$registry = $catalog->get('provider.operation_registry');
|
|
|
|
expect($registry->neutralTerms)->toContain('provider binding')
|
|
->and($registry->retainedProviderSemantics)->toContain('active provider binding')
|
|
->and($registry->followUpAction)->toBe(ProviderBoundarySeam::FOLLOW_UP_DOCUMENT_IN_FEATURE);
|
|
});
|
|
|
|
it('aligns the catalog shape with the logical boundary contract', function (): void {
|
|
$seam = app(ProviderBoundaryCatalog::class)->get('provider.operation_start_gate');
|
|
|
|
expect($seam->key)->toBe('provider.operation_start_gate')
|
|
->and($seam->owner->value)->toBeIn(ProviderBoundaryOwner::values())
|
|
->and($seam->description)->not->toBeEmpty()
|
|
->and($seam->implementationPaths)->not->toBeEmpty()
|
|
->and($seam->neutralTerms)->not->toBeEmpty()
|
|
->and($seam->retainedProviderSemantics)->toContain('target_scope.entra_tenant_id')
|
|
->and($seam->followUpAction)->toBeIn([
|
|
ProviderBoundarySeam::FOLLOW_UP_NONE,
|
|
ProviderBoundarySeam::FOLLOW_UP_DOCUMENT_IN_FEATURE,
|
|
ProviderBoundarySeam::FOLLOW_UP_SPEC,
|
|
]);
|
|
});
|