update
Some checks failed
Tests / lint (push) Has been cancelled
Tests / test (push) Has been cancelled
Tests / test-postgres (push) Has been cancelled

This commit is contained in:
2026-08-21 09:14:51 +02:00
parent 618d3a56ad
commit c8ba8d7b14
5 changed files with 388 additions and 105 deletions

View File

@@ -1274,13 +1274,18 @@ a leer ese documento y no este código.
Dos cosas lo sujetan:
**Un test de contrato** ([`PublicApiContractTest`](tests/Feature/Api/PublicApiContractTest.php))
que llama a cada endpoint público con datos sembrados y compara la respuesta con
el esquema del `openapi.yaml`, clave a clave. La regla es asimétrica a
propósito: **todo lo que la API manda tiene que estar documentado** —siempre—, y
lo que el documento promete tiene que llegar en los endpoints de detalle, salvo
lo que está marcado `nullable`, que es como este documento dice «puede no
estar».
**Dos tests de contrato**, uno por mitad de la API, comparten la comparación en
sí ([`VerifiesOpenApiContract`](tests/VerifiesOpenApiContract.php)) porque la
pregunta es la misma dos veces: si la forma que el documento promete es la que
la API manda. Lo que cambia es todo lo que rodea la pregunta, no la
comparación.
[`PublicApiContractTest`](tests/Feature/Api/PublicApiContractTest.php) llama a
cada endpoint público con datos sembrados y compara la respuesta con el esquema
del `openapi.yaml`, clave a clave. La regla es asimétrica a propósito: **todo lo
que la API manda tiene que estar documentado** —siempre—, y lo que el documento
promete tiene que llegar en los endpoints de detalle, salvo lo que está marcado
`nullable`, que es como este documento dice «puede no estar».
Al escribirlo aparecieron cuatro desajustes que llevaban ahí un tiempo:
`meta_title` y `meta_description` sin documentar en proyectos y servicios,
@@ -1292,6 +1297,19 @@ era la API: el alt vive dentro de la imagen, que es donde lo necesita un `<img>`
y dos nombres para el mismo texto es cómo un frontend acaba leyendo el que
resulta ser el accidental.
[`AdminApiContractTest`](tests/Feature/Api/AdminApiContractTest.php) hace lo
mismo con `/v1/*`, autenticado como `super_admin` para que un permiso de menos
nunca se confunda con una forma equivocada, y añade una comprobación que la
pública no necesita: el **sobre de paginación** (`links`, `meta`) de cada
listado contra lo documentado, y que `/v1/roles` —el único listado que Laravel
no pagina— no lleve ninguno de los dos. Escribirlo encontró cuatro desajustes
más: `featured_image_alt` sin documentar en absoluto en la respuesta de página
(la petición de escritura sí lo tenía, con otra forma), `permissions` de
usuario documentado solo en prosa en vez de con `nullable: true`, y el sobre de
paginación real de Laravel —que manda `from`, `to`, `path` y un `links` de
primer nivel— documentado con la mitad de esas claves y sin ese `links` en
absoluto.
**Tipos generados** para el otro lado:
```bash
@@ -1346,7 +1364,7 @@ php artisan site:maintenance --up
## Tests
```bash
php artisan test # 391 tests, 1121 aserciones
php artisan test # 394 tests, 1128 aserciones
```
En cada push y cada pull request, [`.github/workflows/tests.yml`](.github/workflows/tests.yml)
@@ -1569,7 +1587,7 @@ docker compose -f docker-compose.test.yml run --rm test
Levanta un Postgres en memoria, corre la suite entera contra él y lo tira. Es la
comprobación que convierte «debería funcionar» en «funciona», y conviene hacerla
antes del primer despliegue. **391 tests en verde contra Postgres 17.**
antes del primer despliegue. **394 tests en verde contra Postgres 17.**
Usa una etapa propia de la imagen: la de producción se construye con `--no-dev`
y ahí no está ni el runner de tests.