<?php

namespace Tests\Feature\Http;

use App\Http\Livewire\Application\ChangeBranch;
use App\Http\Livewire\Application\Deploy;
use App\Http\Livewire\Application\DeploymentScript;
use App\Http\Livewire\Application\LaravelApp;
use App\Jobs\Site\UpdateBranch;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Bus;
use Livewire\Livewire;
use Tests\TestCase;

class ApplicationTest extends TestCase
{
    use RefreshDatabase;

    public function test_visit_application()
    {
        $this->actingAs($this->user);

        $this->get(
            route('servers.sites.application', [
                'server' => $this->server,
                'site' => $this->site
            ])
        )
            ->assertOk()
            ->assertSeeLivewire(LaravelApp::class);
    }

    public function test_update_deployment_script()
    {
        $this->actingAs($this->user);

        Livewire::test(Deploy::class, ['site' => $this->site])
            ->assertDontSeeText('Deploy');

        Livewire::test(DeploymentScript::class, ['site' => $this->site])
            ->set('script', 'some script')
            ->call('save')
            ->assertSuccessful();

        $this->assertDatabaseHas('deployment_scripts', [
            'site_id' => $this->site->id,
            'content' => 'some script'
        ]);

        $this->site->refresh();

        Livewire::test(Deploy::class, ['site' => $this->site])
            ->assertSeeText('Deploy');
    }

    public function test_change_branch()
    {
        Bus::fake();

        $this->actingAs($this->user);

        Livewire::test(ChangeBranch::class, ['site' => $this->site])
            ->set('branch', 'master')
            ->call('change')
            ->assertSuccessful();

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