<?php

namespace Tests\Feature\API;

use App\Enums\CronjobStatus;
use App\Facades\SSH;
use App\Models\CronJob;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Laravel\Sanctum\Sanctum;
use Tests\TestCase;

class CronjobTest extends TestCase
{
    use RefreshDatabase;

    public function test_see_cronjobs_list()
    {
        Sanctum::actingAs($this->user, ['read', 'write']);

        /** @var CronJob $cronjob */
        $cronjob = CronJob::factory()->create([
            'server_id' => $this->server->id,
        ]);

        $this->json('GET', route('api.projects.servers.cron-jobs', [
            'project' => $this->server->project,
            'server' => $this->server,
        ]))
            ->assertSuccessful()
            ->assertJsonFragment([
                'command' => $cronjob->command,
                'frequency' => $cronjob->frequency,
            ]);
    }

    public function test_create_cronjob()
    {
        SSH::fake();

        Sanctum::actingAs($this->user, ['read', 'write']);

        $this->json('POST', route('api.projects.servers.cron-jobs.create', [
            'project' => $this->server->project,
            'server' => $this->server,
        ]), [
            'command' => 'ls -la',
            'user' => 'vito',
            'frequency' => '* * * * *',
        ])
            ->assertSuccessful()
            ->assertJsonFragment([
                'command' => 'ls -la',
                'user' => 'vito',
                'frequency' => '* * * * *',
                'status' => CronjobStatus::READY,
            ]);
    }

    public function test_delete_cronjob()
    {
        SSH::fake();

        Sanctum::actingAs($this->user, ['read', 'write']);

        /** @var CronJob $cronjob */
        $cronjob = CronJob::factory()->create([
            'server_id' => $this->server->id,
            'user' => 'vito',
        ]);

        $this->json('DELETE', route('api.projects.servers.cron-jobs.delete', [
            'project' => $this->server->project,
            'server' => $this->server,
            'cronJob' => $cronjob,
        ]))
            ->assertSuccessful()
            ->assertNoContent();
    }
}