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']); } }