feat(infra): auto-commit con 4 cambios

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-03 16:44:23 +02:00
parent 6aec0413bb
commit fa09ff9866
4 changed files with 136 additions and 10 deletions
@@ -1,7 +1,7 @@
---
id: "0167"
title: "fn run de library function Go ejecuta go test del paquete entero (arrastra tests flaky vecinos)"
status: pendiente
status: completado
type: enhancement
domain:
- registry-quality
@@ -120,6 +120,38 @@ conceptualmente pero rompe comportamiento documentado; evaluar si ese comportami
| Error: nombres de test con drift (si se elige B) | unit | `fn.Tests` con un nombre inexistente | NO produce falso-verde (se detecta "0 tests run" → fallo) |
| Tests impuros saneados | unit | `go test -run 'TestSSHTunnelOpenClose\|TestDockerContainerExec' ./functions/infra` repetido 5× | 5/5 PASS deterministas |
## Resolución (2026-06-03)
Implementada la combinación **C + B** recomendada.
### C — Tests impuros saneados (`functions/infra/`)
- `ssh_tunnel_test.go`: el puerto fijo `19876` pasa a **puerto efímero** (`freeTCPPort` pide `:0` al kernel). Elimina el `bind: address already in use` bajo concurrencia.
- `docker_container_exec_test.go`: el socket Unix deja de colgar de `t.TempDir()` (path largo con el nombre del subtest) y usa un **directorio corto** bajo `/tmp` (`os.MkdirTemp("/tmp", "dk")` + cleanup). Elimina el `bind: invalid argument` por exceder los ~108 bytes de `sun_path`.
- Verificado: `go test -run 'TestSSHTunnelOpenClose|TestDockerContainerExec' -count=5 ./functions/infra/``ok` (5×, determinista).
### B — `fn run` acota los tests a la función (`cmd/fn/run.go`)
- Para una library Go function con tests, el dispatcher ahora añade
`-run '^(<tests>)$'` con los nombres **extraídos por el indexer** (`unit_tests`,
vía `db.GetUnitTestsByFunction`), no los del frontmatter `.md` (que pueden driftar).
Así `fn run` ejecuta solo los tests de esa función, aislándola de tests flaky de
funciones vecinas del mismo paquete. Si no hay nombres extraídos, cae al paquete
entero (comportamiento previo).
- **Guard anti-falso-verde**: `cmdRun` refleja el output de un `go test -run` a un
buffer; si go test reporta `no tests to run` (que sale con exit 0), el run se trata
como **fallo** (exit 1 + mensaje pidiendo `fn index`). Evita que un drift de nombres
produzca un verde silencioso.
### Evidencia (DoD)
| Escenario | Resultado |
|---|---|
| Golden: `fn run find_unused_functions_go_infra` | Corre solo sus 2 tests (`TestFindUnusedFunctions_*`) en 0.06s, exit 0. No toca SSH/Docker. |
| Edge concurrente: 2 `fn run` del paquete `infra` en paralelo | Ambos exit 0, sin colisión de puerto. |
| Error/drift: `unit_tests` con nombre inexistente | `go test` da `[no tests to run]`; el guard lo intercepta → exit 1 con mensaje. NO falso-verde. |
| Tests saneados 5× | `ok` determinista. |
`go vet ./cmd/fn/` y `go test ./cmd/fn/` verdes tras los cambios.
## Notas
- Archivos clave: `cmd/fn/run.go` (dispatcher, líneas 145-194), `registry/parser.go`