<?php

namespace Tests\Feature\API;

use App\Models\Permission;
use App\Models\Role;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Support\Facades\Auth;
use Tests\Feature\TestCase;

class RoleTest extends TestCase
{
    public function test_role_list()
    {
        Role::factory(30)->create();

        $response = $this->get(route('role.index'));

        $response->assertStatus(200)
            ->assertJsonStructure([
                'data' => [
                    '*' => [
                        'id',
                        'name',
                        'description',
                    ]
                ]
            ]);
    }

    public function test_role_create(): void
    {
        $form = Role::factory()->make();

        $response = $this->post(route('role.store'), $form->toArray());

        $response->assertStatus(201);
    }

    public function test_role_update(): void
    {
        $role = Role::factory()->create();

        $form = Role::factory()->make();

        $response = $this->put(route('role.update', ['role' => $role->id]), $form->toArray());

        $response->assertStatus(204);

        $newRole = Role::find($role->id);

        $this->assertEquals($form->name, $newRole->name);
    }

    public function test_role_delete(): void
    {
        $role = Role::factory()->create();

        $response = $this->delete(route('role.destroy', ['role' => $role->id]));

        $response->assertStatus(204);

        $this->assertNull(Role::find($role->id));
    }

    public function test_role_permission_list(): void
    {
        $response = $this->get(route('role.permissions', ['role' => Auth::user()->role_id]));

        $response->assertStatus(200)->assertJsonCount(Permission::query()->count(), 'data');
    }

    public function test_role_assign_permission(): void
    {
        $role = Role::factory()->create();

        $permissions = Permission::pluck('name')->toArray();

        $response = $this->put(route('role.assign-permissions', ['role' => $role->id]), [
            'permissions' => $permissions
        ]);

        $response->assertStatus(204);

        $this->assertCount(count($permissions), $role->refresh()->permissions);
    }
}