Skip to content

FelFake — Pruebas sin conexión real

FelFake elimina la dependencia con la API de Infile en tus pruebas. Disponible en los adaptadores Laravel y Symfony.

Configuración básica

php
use InfilePhp\Laravel\Testing\FelFake;

class FacturaTest extends TestCase
{
    protected function setUp(): void
    {
        parent::setUp();
        FelFake::succeed(); // Todas las llamadas exitosas
    }
}

Modos de operación

Siempre exitoso

php
FelFake::succeed();

Invoice::create()->forFinalConsumer()
    ->add(Item::product('Test')->unitPrice(100.00))
    ->issue();

FelFake::assertIssued(1);

Siempre fallido

php
FelFake::fail();

$this->expectException(InfileCertificationException::class);

Invoice::create()->forFinalConsumer()
    ->add(Item::product('Test')->unitPrice(100.00))
    ->issue();

Fallar N veces y luego tener éxito (prueba de reintentos)

php
FelFake::failTimes(2)->thenSucceed();

Invoice::create()->forFinalConsumer()
    ->add(Item::product('Test')->unitPrice(100.00))
    ->issue();

FelFake::assertRetries(2);
FelFake::assertIssued(1);
FelFake::assertFallbackActivated();

Aserciones disponibles

php
// ¿Cuántos DTEs se emitieron?
FelFake::assertIssued(3);

// ¿El DTE es del tipo correcto?
FelFake::assertType(DteType::FACT);

// ¿El receptor tiene el NIT correcto?
FelFake::assertRecipient('12345678');

// ¿Se activó el modo contingencia CAFE?
FelFake::assertFallbackActivated();

// ¿Se reintentó N veces?
FelFake::assertRetries(2);

// ¿Se anuló algún DTE?
FelFake::assertCancelled(1);

// ¿No se emitió nada?
FelFake::assertNothingIssued();

Ejemplo completo en Laravel

php
use InfilePhp\Core\Enums\DteType;
use InfilePhp\Laravel\Testing\FelFake;

class OrdenCompletadaTest extends TestCase
{
    public function test_emite_factura_al_completar_orden(): void
    {
        FelFake::succeed();

        $orden = Order::factory()->create(['nit' => '12345678', 'total' => 500.00]);

        $this->post("/api/ordenes/{$orden->id}/completar")
             ->assertOk();

        FelFake::assertIssued(1);
        FelFake::assertType(DteType::FACT);
        FelFake::assertRecipient('12345678');
    }

    public function test_reintenta_cuando_infile_falla_temporalmente(): void
    {
        FelFake::failTimes(2)->thenSucceed();

        $orden = Order::factory()->create(['total' => 200.00]);

        $this->post("/api/ordenes/{$orden->id}/completar")
             ->assertOk();

        FelFake::assertRetries(2);
        FelFake::assertIssued(1);
    }

    public function test_no_emite_factura_si_monto_es_cero(): void
    {
        FelFake::succeed();

        $orden = Order::factory()->create(['total' => 0.00]);

        $this->post("/api/ordenes/{$orden->id}/completar")
             ->assertOk();

        FelFake::assertNothingIssued();
    }
}

Licencia MIT