set('tenantpilot.baselines.full_content_capture.enabled', true); [$user, $tenant] = createUserWithTenant(role: 'readonly'); $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(), ]); $profile->update(['active_snapshot_id' => (int) $snapshot->getKey()]); BaselineTenantAssignment::factory()->create([ 'workspace_id' => (int) $tenant->workspace_id, 'tenant_id' => (int) $tenant->getKey(), 'baseline_profile_id' => (int) $profile->getKey(), ]); session()->put(WorkspaceContext::SESSION_KEY, (int) $tenant->workspace_id); Livewire::actingAs($user) ->test(ViewBaselineProfile::class, ['record' => $profile->getKey()]) ->assertActionVisible('compareNow') ->assertActionHasLabel('compareNow', 'Compare now (full content)') ->assertActionDisabled('compareNow') ->callAction('compareNow', data: ['target_tenant_id' => (int) $tenant->getKey()]) ->assertStatus(200); Queue::assertNotPushed(CompareBaselineToTenantJob::class); }); it('starts baseline compare successfully for authorized workspace members', 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, ]); $snapshot = BaselineSnapshot::factory()->create([ 'workspace_id' => (int) $tenant->workspace_id, 'baseline_profile_id' => (int) $profile->getKey(), ]); $profile->update(['active_snapshot_id' => (int) $snapshot->getKey()]); BaselineTenantAssignment::factory()->create([ 'workspace_id' => (int) $tenant->workspace_id, 'tenant_id' => (int) $tenant->getKey(), 'baseline_profile_id' => (int) $profile->getKey(), ]); session()->put(WorkspaceContext::SESSION_KEY, (int) $tenant->workspace_id); Livewire::actingAs($user) ->test(ViewBaselineProfile::class, ['record' => $profile->getKey()]) ->assertActionVisible('compareNow') ->assertActionHasLabel('compareNow', 'Compare now (full content)') ->assertActionEnabled('compareNow') ->callAction('compareNow', data: ['target_tenant_id' => (int) $tenant->getKey()]) ->assertStatus(200); Queue::assertPushed(CompareBaselineToTenantJob::class); $run = OperationRun::query() ->where('tenant_id', (int) $tenant->getKey()) ->where('type', 'baseline_compare') ->latest('id') ->first(); expect($run)->not->toBeNull(); expect($run?->status)->toBe('queued'); }); it('does not start full-content baseline compare when rollout is disabled', function (): void { Queue::fake(); config()->set('tenantpilot.baselines.full_content_capture.enabled', false); [$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(), ]); $profile->update(['active_snapshot_id' => (int) $snapshot->getKey()]); BaselineTenantAssignment::factory()->create([ 'workspace_id' => (int) $tenant->workspace_id, 'tenant_id' => (int) $tenant->getKey(), 'baseline_profile_id' => (int) $profile->getKey(), ]); session()->put(WorkspaceContext::SESSION_KEY, (int) $tenant->workspace_id); Livewire::actingAs($user) ->test(ViewBaselineProfile::class, ['record' => $profile->getKey()]) ->assertActionVisible('compareNow') ->assertActionHasLabel('compareNow', 'Compare now (full content)') ->assertActionEnabled('compareNow') ->callAction('compareNow', data: ['target_tenant_id' => (int) $tenant->getKey()]) ->assertNotified('Cannot start comparison') ->assertStatus(200); Queue::assertNotPushed(CompareBaselineToTenantJob::class); expect(OperationRun::query()->where('type', 'baseline_compare')->count())->toBe(0); });