TenantAtlas/apps/platform/tests/Unit/Entitlements/WorkspaceSubscriptionResolverTest.php
ahmido 35b59eb628 274: Billing subscription truth - add workspace subscription model & tests (#326)
Automated PR: commit all local changes and add feature 274-billing-subscription-truth.

Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de>
Reviewed-on: #326
2026-05-04 21:15:57 +00:00

72 lines
2.7 KiB
PHP

<?php
declare(strict_types=1);
use App\Models\Workspace;
use App\Models\WorkspaceSubscription;
use App\Services\Entitlements\WorkspaceCommercialLifecycleResolver;
use App\Services\Entitlements\WorkspaceSubscriptionResolver;
use Illuminate\Foundation\Testing\RefreshDatabase;
uses(RefreshDatabase::class);
it('summarizes a trial subscription as subscription-backed truth', function (): void {
$workspace = Workspace::factory()->create();
$trialEndsAt = now()->addDays(14)->startOfMinute();
WorkspaceSubscription::factory()->create([
'workspace_id' => (int) $workspace->getKey(),
'state' => 'trial',
'trial_ends_at' => $trialEndsAt,
'status_reason' => 'Trial access for onboarding.',
]);
$summary = app(WorkspaceSubscriptionResolver::class)->summary($workspace);
expect($summary)
->toMatchArray([
'workspace_id' => (int) $workspace->getKey(),
'subscription_present' => true,
'state' => 'trial',
'source' => 'workspace_subscription',
'fallback_status' => false,
'derived_lifecycle_state' => WorkspaceCommercialLifecycleResolver::STATE_TRIAL,
'needs_review' => false,
'status_reason' => 'Trial access for onboarding.',
'key_date_label' => 'Trial ends',
])
->and($summary['key_date']?->toDateTimeString())
->toBe($trialEndsAt->toDateTimeString());
});
it('marks stale cancel-at-period-end subscriptions for explicit review', function (): void {
$workspace = Workspace::factory()->create();
$periodStartsAt = now()->subDays(30)->startOfMinute();
$periodEndsAt = now()->subDay()->startOfMinute();
WorkspaceSubscription::factory()->create([
'workspace_id' => (int) $workspace->getKey(),
'state' => 'cancel_at_period_end',
'current_period_starts_at' => $periodStartsAt,
'current_period_ends_at' => $periodEndsAt,
'status_reason' => 'Cancellation takes effect at period end.',
]);
$summary = app(WorkspaceSubscriptionResolver::class)->summary($workspace);
expect($summary)
->toMatchArray([
'workspace_id' => (int) $workspace->getKey(),
'subscription_present' => true,
'state' => 'cancel_at_period_end',
'source' => 'workspace_subscription',
'fallback_status' => false,
'derived_lifecycle_state' => WorkspaceCommercialLifecycleResolver::STATE_ACTIVE_PAID,
'needs_review' => true,
'status_reason' => 'Cancellation takes effect at period end.',
'key_date_label' => 'Current period ends',
])
->and($summary['key_date']?->toDateTimeString())
->toBe($periodEndsAt->toDateTimeString());
});