Todos los artículos

Asegurar la Estructura Exacta de JSON de una Respuesta en Laravel 11.19

Julian Beaujardin
Julian Beaujardin July 31st, 2024

El equipo de Laravel lanzó la versión 11.19 esta semana, incluyendo la verificación de la estructura exacta de JSON, un método de constructor de consultas whereNone, un método Number::trim(), métodos de conveniencia para la verificación de HTML, y más.

Un colaborador destacado en Laravel 11.19 es Günther Debrauwer, quien contribuyó con cuatro pull requests al framework esta semana.

Agregar el Método de Prueba assertExactJsonStructure()

Günther Debrauwer contribuyó con assertExactJsonStructure() para asegurar que una respuesta de prueba siga completamente una estructura esperada:

/*
Dada la siguiente respuesta:
{
    "data": {
        "id": 1,
        "firstname": "Taylor",
        "lastname": "Otwell"
    }
}
*/

// Esto falla
$response->assertExactJsonStructure([
    'data' => [
        'firstname',
        'lastname',
    ],
]);

// Esto tiene éxito
$response->assertExactJsonStructure([
    'data' => [
        'id',
        'firstname',
        'lastname',
    ],
]);

El método assertJsonStructure() pasará en ambos ejemplos anteriores, por lo que puedes usar la versión exacta para asegurar que toda la forma de la respuesta coincida.

Agregar el Método whereNone al Constructor de Consultas

Einar Hansen contribuyó con whereNone para complementar los métodos whereAny y whereAll:

$users = DB::table('users')
    ->where('active', true)
    ->whereNone([
        'first_name',
        'last_name',
        'email',
    ], 'LIKE', 'einar%')
    ->get();
/*
SELECT *
FROM users
WHERE active = true AND NOT (
    first_name LIKE 'einar%' OR
    last_name LIKE 'einar%' OR
    email LIKE 'einar%'
)
*/

Consulta Pull Request #52260 para más detalles.

Agregar el Método de Prueba withoutHeader

Günther Debrauwer contribuyó con un método withoutHeader() al hacer solicitudes de prueba. Este método puede ser útil si tienes un encabezado predeterminado que deseas enviar con cada solicitud pero también quieres escribir una prueba cuando el encabezado no está presente:

$this->withoutHeader('Foo')->get(...);

Agregar los Métodos de Prueba assertSeeHtml

Günther Debrauwer contribuyó con tres nuevas afirmaciones de HTML que son azúcar sintáctico para assertSee() con escape deshabilitado:

$response->assertSeeHtml('<li>foo</li>');

$response->assertSeeHtmlInOrder([
    '<li>foo</li>', '<li>bar</li>', '<li>baz</li>'
]);

$response->assertDontSeeHtml('<li>foo</li>');

// Los nuevos métodos son equivalentes a usar los métodos `assertSee*` sin escapar el HTML:
$response->assertSee(value: '<li>foo</li>', escape: false);

Agregar el Método Number::trim()

Günther Debrauwer contribuyó con un método Number::trim() que recorta los dígitos 0 después del punto decimal de un número dado:

$this->assertSame(12, Number::trim(12));
$this->assertSame(120, Number::trim(120));
$this->assertSame(12, Number::trim(12.0));
$this->assertSame(12.3, Number::trim(12.3));
$this->assertSame(12.3, Number::trim(12.30));
$this->assertSame(12.3456789, Number::trim(12.3456789));
$this->assertSame(12.3456789, Number::trim(12.34567890000));

Un caso de uso en el Pull Request es que json_encode() convertirá un número flotante que no tiene dígitos después del punto decimal:

json_encode(['value' => 4.0, 'another' => 5.21340]);
// = "{"value":4,"another":5.2134}

Al verificar estos valores en una prueba, puedes usar Number::trim() para coincidir con este comportamiento.

Notas de la Versión

Puedes ver la lista completa de nuevas características y actualizaciones a continuación y la diferencia entre 11.18.0 y 11.19.0 en GitHub. Las siguientes notas de la versión son directamente del changelog.