<?php

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
use Illuminate\Support\Facades\File;
use Spatie\Permission\PermissionRegistrar;

abstract class TestCase extends BaseTestCase
{
    protected function setUp(): void
    {
        parent::setUp();

        // Las vistas compiladas de los tests van a su propio directorio, para no
        // competir con el servidor web (Laragon sirviendo el panel a la vez escribe
        // y borra en storage/framework/views). La ruta se fija aquí y no en
        // phpunit.xml porque tiene que ser ABSOLUTA: con un valor relativo,
        // `filemtime()` falla en cuanto el directorio de trabajo del proceso no es
        // la raíz del proyecto. Ver known-issues MGR-019.
        $compiled = storage_path('framework/testing/views');
        File::ensureDirectoryExists($compiled);
        config(['view.compiled' => $compiled]);

        // Spatie Permission cachea el mapa de roles y permisos, y en los tests el
        // caché es `array` (ver phpunit.xml), o sea que vive en memoria del proceso
        // y sobrevive de un test al siguiente, mientras RefreshDatabase sí vacía las
        // tablas. Vaciarlo antes de cada test los hace independientes del orden.
        app(PermissionRegistrar::class)->forgetCachedPermissions();

        // Y por lo mismo, el catálogo de usos del entorno: `Env::catalogo()` se cachea
        // **para siempre** —cambia tres veces al año y lo lee cada `render()`—, así que un
        // test que añada o borre un uso dejaría su catálogo cacheado para el siguiente,
        // que ya tiene la base vacía. Los tests dependerían del orden.
        \App\Models\Environments\Env::olvidarCatalogo();
    }
}
