You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

157 lines
5.7 KiB
PHP

<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\ProcesoAdmision;
use Illuminate\Foundation\Testing\RefreshDatabase;
class ProcesoAdmisionPublicadosTest extends TestCase
{
use RefreshDatabase;
protected function setUp(): void
{
parent::setUp();
// Ensure the procesos_admision table exists
$this->artisan('migrate', ['--path' => 'database/migrations']);
// Create table if doesn't exist (for testing with SQLite)
\Illuminate\Support\Facades\Schema::dropIfExists('procesos_admision');
\Illuminate\Support\Facades\Schema::create('procesos_admision', function ($table) {
$table->id();
$table->string('titulo');
$table->string('subtitulo')->nullable();
$table->text('descripcion')->nullable();
$table->string('slug', 120)->unique();
$table->string('tipo_proceso', 60)->nullable();
$table->string('modalidad', 50)->nullable();
$table->boolean('publicado')->default(false);
$table->datetime('fecha_publicacion')->nullable();
$table->datetime('fecha_inicio_preinscripcion')->nullable();
$table->datetime('fecha_fin_preinscripcion')->nullable();
$table->datetime('fecha_inicio_inscripcion')->nullable();
$table->datetime('fecha_fin_inscripcion')->nullable();
$table->datetime('fecha_examen1')->nullable();
$table->datetime('fecha_examen2')->nullable();
$table->datetime('fecha_resultados')->nullable();
$table->datetime('fecha_inicio_biometrico')->nullable();
$table->datetime('fecha_fin_biometrico')->nullable();
$table->string('imagen_path', 500)->nullable();
$table->string('banner_path', 500)->nullable();
$table->string('brochure_path', 500)->nullable();
$table->string('link_preinscripcion', 500)->nullable();
$table->string('link_inscripcion', 500)->nullable();
$table->string('link_resultados', 500)->nullable();
$table->string('link_reglamento', 500)->nullable();
$table->enum('estado', ['nuevo', 'publicado', 'en_proceso', 'finalizado', 'cancelado'])->default('nuevo');
$table->timestamps();
});
}
/** @test */
public function publicados_endpoint_returns_only_published_processes(): void
{
// Create published processes
$published1 = ProcesoAdmision::create([
'titulo' => 'Proceso Publicado 1',
'slug' => 'proceso-publicado-1',
'publicado' => true,
'estado' => 'publicado',
]);
$published2 = ProcesoAdmision::create([
'titulo' => 'Proceso Publicado 2',
'slug' => 'proceso-publicado-2',
'publicado' => true,
'estado' => 'en_proceso',
]);
// Create unpublished processes
ProcesoAdmision::create([
'titulo' => 'Proceso No Publicado 1',
'slug' => 'proceso-no-publicado-1',
'publicado' => false,
'estado' => 'nuevo',
]);
ProcesoAdmision::create([
'titulo' => 'Proceso No Publicado 2',
'slug' => 'proceso-no-publicado-2',
'publicado' => false,
'estado' => 'finalizado',
]);
// Call the publicados endpoint
$response = $this->getJson('/api/procesos-admision/publicados');
// Assert response is successful
$response->assertStatus(200);
// Assert only published processes are returned
$response->assertJsonCount(2);
// Assert the returned processes are the published ones
$responseData = $response->json();
$returnedTitles = array_column($responseData, 'titulo');
$this->assertContains('Proceso Publicado 1', $returnedTitles);
$this->assertContains('Proceso Publicado 2', $returnedTitles);
$this->assertNotContains('Proceso No Publicado 1', $returnedTitles);
$this->assertNotContains('Proceso No Publicado 2', $returnedTitles);
}
/** @test */
public function publicados_endpoint_returns_empty_array_when_no_published_processes(): void
{
// Create only unpublished processes
ProcesoAdmision::create([
'titulo' => 'Proceso No Publicado',
'slug' => 'proceso-no-publicado',
'publicado' => false,
'estado' => 'nuevo',
]);
$response = $this->getJson('/api/procesos-admision/publicados');
$response->assertStatus(200);
$response->assertJsonCount(0);
$response->assertJson([]);
}
/** @test */
public function publicados_endpoint_returns_processes_ordered_by_id_desc(): void
{
// Create published processes
$first = ProcesoAdmision::create([
'titulo' => 'Primer Proceso',
'slug' => 'primer-proceso',
'publicado' => true,
]);
$second = ProcesoAdmision::create([
'titulo' => 'Segundo Proceso',
'slug' => 'segundo-proceso',
'publicado' => true,
]);
$third = ProcesoAdmision::create([
'titulo' => 'Tercer Proceso',
'slug' => 'tercer-proceso',
'publicado' => true,
]);
$response = $this->getJson('/api/procesos-admision/publicados');
$response->assertStatus(200);
$responseData = $response->json();
// Should be ordered by id desc (newest first)
$this->assertEquals('Tercer Proceso', $responseData[0]['titulo']);
$this->assertEquals('Segundo Proceso', $responseData[1]['titulo']);
$this->assertEquals('Primer Proceso', $responseData[2]['titulo']);
}
}