<?php

namespace Tests\Feature\Http;

use App\Enums\ServiceStatus;
use App\Http\Livewire\Services\ServicesList;
use App\Jobs\Service\Manage;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Bus;
use Livewire\Livewire;
use Tests\TestCase;

class ServicesTest extends TestCase
{
    use RefreshDatabase;

    public function test_see_services_list(): void
    {
        $this->actingAs($this->user);

        Livewire::test(ServicesList::class, ['server' => $this->server])
            ->assertSee([
                'nginx',
                'php',
                'supervisor',
                'redis',
                'ufw',
                'php'
            ]);
    }

    /**
     * @dataProvider data
     */
    public function test_restart_service(string $name): void
    {
        $service = $this->server->services()->where('name', $name)->first();

        Bus::fake();

        Livewire::test(ServicesList::class, ['server' => $this->server])
            ->call('restart', $service->id)
            ->assertSuccessful();

        Bus::assertDispatched(Manage::class);
    }

    /**
     * @dataProvider data
     */
    public function test_stop_service(string $name): void
    {
        $service = $this->server->services()->where('name', $name)->first();

        Bus::fake();

        Livewire::test(ServicesList::class, ['server' => $this->server])
            ->call('stop', $service->id)
            ->assertSuccessful();

        Bus::assertDispatched(Manage::class);
    }

    /**
     * @dataProvider data
     */
    public function test_start_service(string $name): void
    {
        $service = $this->server->services()->where('name', $name)->first();

        $service->status = ServiceStatus::STOPPED;
        $service->save();

        Bus::fake();

        Livewire::test(ServicesList::class, ['server' => $this->server])
            ->call('start', $service->id)
            ->assertSuccessful();

        Bus::assertDispatched(Manage::class);
    }

    public static function data(): array
    {
        return [
            ['nginx'],
            ['php'],
            ['supervisor'],
            ['redis'],
            ['ufw'],
            ['php'],
        ];
    }
}