TenantAtlas/apps/platform/tests/Feature/Concerns/BuildsOperatorExplanationFixtures.php
ahmido ce0615a9c1 Spec 182: relocate Laravel platform to apps/platform (#213)
## Summary
- move the Laravel application into `apps/platform` and keep the repository root for orchestration, docs, and tooling
- update the local command model, Sail/Docker wiring, runtime paths, and ignore rules around the new platform location
- add relocation quickstart/contracts plus focused smoke coverage for bootstrap, command model, routes, and runtime behavior

## Validation
- `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/PlatformRelocation`
- integrated browser smoke validated `/up`, `/`, `/admin`, `/admin/choose-workspace`, and tenant route semantics for `200`, `403`, and `404`

## Remaining Rollout Checks
- validate Dokploy build context and working-directory assumptions against the new `apps/platform` layout
- confirm web, queue, and scheduler processes all start from the expected working directory in staging/production
- verify no legacy volume mounts or asset-publish paths still point at the old root-level `public/` or `storage/` locations

Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de>
Reviewed-on: #213
2026-04-08 08:40:47 +00:00

68 lines
3.5 KiB
PHP

<?php
declare(strict_types=1);
namespace Tests\Feature\Concerns;
use App\Support\ReasonTranslation\NextStepOption;
use App\Support\ReasonTranslation\ReasonResolutionEnvelope;
use App\Support\Ui\GovernanceArtifactTruth\ArtifactTruthCause;
use App\Support\Ui\GovernanceArtifactTruth\ArtifactTruthEnvelope;
use App\Support\Ui\OperatorExplanation\TrustworthinessLevel;
trait BuildsOperatorExplanationFixtures
{
/**
* @param array<string, mixed> $overrides
*/
protected function makeExplanationReasonEnvelope(array $overrides = []): ReasonResolutionEnvelope
{
$nextSteps = $overrides['nextSteps'] ?? [NextStepOption::instruction('Review the recorded prerequisite before retrying.')];
return new ReasonResolutionEnvelope(
internalCode: (string) ($overrides['internalCode'] ?? 'operator.explanation.test'),
operatorLabel: (string) ($overrides['operatorLabel'] ?? 'Operator attention required'),
shortExplanation: (string) ($overrides['shortExplanation'] ?? 'TenantPilot recorded a missing prerequisite for this workflow.'),
actionability: (string) ($overrides['actionability'] ?? 'prerequisite_missing'),
nextSteps: is_array($nextSteps) ? $nextSteps : [],
showNoActionNeeded: (bool) ($overrides['showNoActionNeeded'] ?? false),
diagnosticCodeLabel: $overrides['diagnosticCodeLabel'] ?? 'operator.explanation.test',
trustImpact: (string) ($overrides['trustImpact'] ?? TrustworthinessLevel::Unusable->value),
absencePattern: $overrides['absencePattern'] ?? 'blocked_prerequisite',
);
}
/**
* @param array<string, mixed> $overrides
*/
protected function makeArtifactTruthEnvelope(
array $overrides = [],
?ReasonResolutionEnvelope $reason = null,
): ArtifactTruthEnvelope {
return new ArtifactTruthEnvelope(
artifactFamily: (string) ($overrides['artifactFamily'] ?? 'test_artifact'),
artifactKey: (string) ($overrides['artifactKey'] ?? 'test_artifact:1'),
workspaceId: (int) ($overrides['workspaceId'] ?? 1),
tenantId: $overrides['tenantId'] ?? 1,
executionOutcome: $overrides['executionOutcome'] ?? 'completed',
artifactExistence: (string) ($overrides['artifactExistence'] ?? 'created'),
contentState: (string) ($overrides['contentState'] ?? 'trusted'),
freshnessState: (string) ($overrides['freshnessState'] ?? 'current'),
publicationReadiness: $overrides['publicationReadiness'] ?? null,
supportState: (string) ($overrides['supportState'] ?? 'normal'),
actionability: (string) ($overrides['actionability'] ?? 'none'),
primaryLabel: (string) ($overrides['primaryLabel'] ?? 'Trustworthy artifact'),
primaryExplanation: $overrides['primaryExplanation'] ?? 'The artifact can be used for the intended operator task.',
diagnosticLabel: $overrides['diagnosticLabel'] ?? null,
nextActionLabel: $overrides['nextActionLabel'] ?? null,
nextActionUrl: $overrides['nextActionUrl'] ?? null,
relatedRunId: $overrides['relatedRunId'] ?? null,
relatedArtifactUrl: $overrides['relatedArtifactUrl'] ?? null,
dimensions: [],
reason: $reason instanceof ReasonResolutionEnvelope
? ArtifactTruthCause::fromReasonResolutionEnvelope($reason, 'test_artifact')
: null,
);
}
}