## Summary This PR implements Spec 206 end to end and establishes the first checked-in test suite governance foundation for the platform app. Key changes: - add manifest-backed test lanes for fast-feedback, confidence, browser, heavy-governance, profiling, and junit - add budget and report helpers plus app-local artifact generation under `apps/platform/storage/logs/test-lanes` - add repo-root Sail-friendly lane/report wrappers - switch the default contributor test path to the fast-feedback lane - introduce explicit fixture profiles and cheaper defaults for shared tenant/provider test setup - add minimal/heavy factory states for tenant and provider connection setup - migrate the first high-usage and provider-sensitive tests to explicit fixture profiles - document budgets, taxonomy rules, DB reset guidance, and the full Spec 206 plan/contracts/tasks set ## Validation Executed during implementation: - focused Spec 206 guard/support/factory validation pack: 31 passed - provider-sensitive regression pack: 29 passed - first high-usage caller migration pack: 120 passed - lane routing and wrapper validation succeeded - pint completed successfully Measured lane baselines captured in docs: - fast-feedback: 176.74s - confidence: 394.38s - heavy-governance: 83.66s - browser: 128.87s - junit: 380.14s - profiling: 2701.51s - full-suite baseline anchor: 2624.60s ## Notes - Livewire v4 / Filament v5 runtime behavior is unchanged by this PR. - No new runtime routes, product UI flows, or database migrations are introduced. - Panel provider registration remains unchanged in `bootstrap/providers.php`. Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #239
109 lines
2.9 KiB
PHP
109 lines
2.9 KiB
PHP
<?php
|
|
|
|
namespace Database\Factories;
|
|
|
|
use App\Models\Tenant;
|
|
use App\Models\Workspace;
|
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
|
|
|
/**
|
|
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Tenant>
|
|
*/
|
|
class TenantFactory extends Factory
|
|
{
|
|
protected bool $provisionsWorkspace = true;
|
|
|
|
public function configure(): static
|
|
{
|
|
return $this->afterCreating(function (Tenant $tenant): void {
|
|
if (! $this->provisionsWorkspace || $tenant->workspace_id !== null) {
|
|
return;
|
|
}
|
|
|
|
$workspace = Workspace::factory()->create();
|
|
|
|
$tenant->forceFill([
|
|
'workspace_id' => (int) $workspace->getKey(),
|
|
])->save();
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Define the model's default state.
|
|
*
|
|
* @return array<string, mixed>
|
|
*/
|
|
public function definition(): array
|
|
{
|
|
return [
|
|
'name' => fake()->company(),
|
|
'external_id' => fake()->uuid(),
|
|
'tenant_id' => fake()->uuid(),
|
|
'app_client_id' => fake()->uuid(),
|
|
'app_client_secret' => null, // Skip encryption in tests
|
|
'app_certificate_thumbprint' => null,
|
|
'app_status' => 'ok',
|
|
'app_notes' => null,
|
|
'status' => 'active',
|
|
'environment' => 'other',
|
|
'is_current' => false,
|
|
'metadata' => [],
|
|
'rbac_status' => 'ok',
|
|
'rbac_last_checked_at' => now(),
|
|
];
|
|
}
|
|
|
|
public function draft(): static
|
|
{
|
|
return $this->state(fn (): array => [
|
|
'status' => Tenant::STATUS_DRAFT,
|
|
'is_current' => false,
|
|
]);
|
|
}
|
|
|
|
public function onboarding(): static
|
|
{
|
|
return $this->state(fn (): array => [
|
|
'status' => Tenant::STATUS_ONBOARDING,
|
|
'is_current' => false,
|
|
]);
|
|
}
|
|
|
|
public function active(): static
|
|
{
|
|
return $this->state(fn (): array => [
|
|
'status' => Tenant::STATUS_ACTIVE,
|
|
'deleted_at' => null,
|
|
]);
|
|
}
|
|
|
|
public function archived(): static
|
|
{
|
|
return $this->state(fn (): array => [
|
|
'status' => Tenant::STATUS_ARCHIVED,
|
|
'deleted_at' => now(),
|
|
'is_current' => false,
|
|
]);
|
|
}
|
|
|
|
public function minimal(): static
|
|
{
|
|
Tenant::skipTestWorkspaceProvisioning();
|
|
|
|
$factory = clone $this;
|
|
$factory->provisionsWorkspace = false;
|
|
|
|
return $factory
|
|
->afterCreating(function (Tenant $tenant): void {
|
|
if ($tenant->workspace_id !== null) {
|
|
$workspaceId = (int) $tenant->workspace_id;
|
|
|
|
$tenant->forceFill(['workspace_id' => null])->saveQuietly();
|
|
Workspace::query()->whereKey($workspaceId)->delete();
|
|
}
|
|
|
|
Tenant::skipTestWorkspaceProvisioning(false);
|
|
});
|
|
}
|
|
}
|