feat(infra): auto-commit con 4 cambios
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+33
-1
@@ -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`
|
||||
Reference in New Issue
Block a user