set('tenantpilot.baselines.full_content_capture.enabled', true); [$user, $tenant] = createUserWithTenant(role: 'owner'); $profile = BaselineProfile::factory()->active()->create([ 'workspace_id' => (int) $tenant->workspace_id, 'capture_mode' => BaselineCaptureMode::FullContent->value, ]); $snapshot = BaselineSnapshot::factory()->create([ 'workspace_id' => (int) $tenant->workspace_id, 'baseline_profile_id' => (int) $profile->getKey(), 'captured_at' => now()->subMinute(), ]); $token = BaselineEvidenceResumeToken::encode(['offset' => 1]); $run = OperationRun::factory()->for($tenant)->create([ 'type' => OperationRunType::BaselineCompare->value, 'status' => OperationRunStatus::Completed->value, 'outcome' => OperationRunOutcome::PartiallySucceeded->value, 'user_id' => (int) $user->getKey(), 'context' => [ 'baseline_profile_id' => (int) $profile->getKey(), 'baseline_snapshot_id' => (int) $snapshot->getKey(), 'effective_scope' => ['policy_types' => ['deviceConfiguration'], 'foundation_types' => []], 'capture_mode' => BaselineCaptureMode::FullContent->value, 'baseline_compare' => [ 'resume_token' => $token, ], ], ]); Livewire::actingAs($user) ->test(TenantlessOperationRunViewer::class, ['run' => $run]) ->assertActionVisible('resumeCapture') ->callAction('resumeCapture') ->assertDispatchedTo(BulkOperationProgress::class, OpsUxBrowserEvents::RunEnqueued, tenantId: (int) $tenant->getKey()) ->assertStatus(200); Queue::assertPushed(CompareBaselineToTenantJob::class); $resumed = OperationRun::query() ->where('managed_environment_id', (int) $tenant->getKey()) ->where('type', OperationRunType::BaselineCompare->value) ->where('status', OperationRunStatus::Queued->value) ->latest('id') ->first(); expect($resumed)->not->toBeNull(); $context = is_array($resumed?->context) ? $resumed->context : []; expect($context['baseline_compare']['resume_token'] ?? null)->toBe($token); $this->assertDatabaseHas('notifications', [ 'notifiable_id' => $user->getKey(), 'notifiable_type' => $user->getMorphClass(), 'type' => OperationRunQueued::class, 'data->format' => 'filament', 'data->title' => 'Baseline compare queued', ]); }); it('notifies and refreshes operation activity after resuming a baseline capture run', function (): void { Queue::fake(); config()->set('tenantpilot.baselines.full_content_capture.enabled', true); [$user, $tenant] = createUserWithTenant(role: 'owner'); $profile = BaselineProfile::factory()->active()->create([ 'workspace_id' => (int) $tenant->workspace_id, 'capture_mode' => BaselineCaptureMode::FullContent->value, ]); $token = BaselineEvidenceResumeToken::encode(['offset' => 1]); $run = OperationRun::factory()->for($tenant)->create([ 'type' => OperationRunType::BaselineCapture->value, 'status' => OperationRunStatus::Completed->value, 'outcome' => OperationRunOutcome::PartiallySucceeded->value, 'user_id' => (int) $user->getKey(), 'context' => [ 'baseline_profile_id' => (int) $profile->getKey(), 'source_environment_id' => (int) $tenant->getKey(), 'effective_scope' => ['policy_types' => ['deviceConfiguration'], 'foundation_types' => []], 'capture_mode' => BaselineCaptureMode::FullContent->value, 'baseline_capture' => [ 'resume_token' => $token, ], ], ]); Livewire::actingAs($user) ->test(TenantlessOperationRunViewer::class, ['run' => $run]) ->assertActionVisible('resumeCapture') ->callAction('resumeCapture') ->assertDispatchedTo(BulkOperationProgress::class, OpsUxBrowserEvents::RunEnqueued, tenantId: (int) $tenant->getKey()) ->assertStatus(200); Queue::assertPushed(CaptureBaselineSnapshotJob::class); $resumed = OperationRun::query() ->where('managed_environment_id', (int) $tenant->getKey()) ->where('type', OperationRunType::BaselineCapture->value) ->where('status', OperationRunStatus::Queued->value) ->latest('id') ->first(); expect($resumed)->not->toBeNull(); $context = is_array($resumed?->context) ? $resumed->context : []; expect($context['baseline_capture']['resume_token'] ?? null)->toBe($token); $notification = $user->notifications() ->where('type', OperationRunQueued::class) ->latest('id') ->first(); expect($notification)->not->toBeNull() ->and(data_get($notification?->data, 'title'))->toBe('Baseline capture queued') ->and(data_get($notification?->data, 'actions.0.url'))->toBe(OperationRunLinks::view($resumed, $tenant)) ->and(data_get($notification?->data, 'actions.0.target'))->toBe('admin_operation_run'); });