<?php

use App\Livewire\BulkOperationProgress;
use App\Models\OperationRun;
use App\Models\Tenant;
use Filament\Facades\Filament;
use Livewire\Livewire;

it('keeps the Ops UX progress widget DB-only (no outbound HTTP) and tenant-scoped', function () {
    $tenantA = Tenant::factory()->create();
    $tenantB = Tenant::factory()->create();

    [$user] = createUserWithTenant($tenantA, role: 'owner');

    $user->tenants()->syncWithoutDetaching([
        $tenantB->getKey() => ['role' => 'owner'],
    ]);

    OperationRun::factory()->create([
        'tenant_id' => $tenantA->getKey(),
        'type' => 'policy.sync',
        'status' => 'running',
        'outcome' => 'pending',
        'initiator_name' => 'TenantA',
    ]);

    OperationRun::factory()->create([
        'tenant_id' => $tenantB->getKey(),
        'type' => 'inventory_sync',
        'status' => 'running',
        'outcome' => 'pending',
        'initiator_name' => 'TenantB',
    ]);

    $this->actingAs($user);

    Filament::setTenant($tenantA, true);

    assertNoOutboundHttp(function () {
        Livewire::test(BulkOperationProgress::class)
            ->call('refreshRuns')
            ->assertSet('disabled', false)
            ->assertSee('Policy sync')
            ->assertDontSee('Inventory sync');
    });
})->group('ops-ux');

it('registers Alpine cleanup for the Ops UX poller to avoid stale listeners across re-renders', function () {
    $contents = file_get_contents(resource_path('views/livewire/bulk-operation-progress.blade.php'));

    expect($contents)->toContain('new MutationObserver');
    expect($contents)->toContain('teardownObserver');
})->group('ops-ux');
