[CAT-002 / Infra] TestWebApplicationFactory: desacoplar RSA singleton para permitir override scoped en e2e #36

Closed
opened 2026-04-19 11:52:28 +00:00 by dmolinari · 0 comments
Owner

Contexto

Detectado durante sdd-verify de CAT-002 (Regla de Oro Rama vs Hoja, PR #35).

TestWebApplicationFactory registra el proveedor de claves RSA (JWT signing) como singleton sellado, lo que impide que un test individual haga override de dependencies Scoped vía ConfigureTestServices. En CAT-002 esto se manifestó en la imposibilidad de inyectar un FakeAvisoQueryRepository por test para forzar el path HTTP POST /rubros409 Conflict cuando el padre tiene avisos.

La cobertura actual de ese path es compositiva (handler unit + ExceptionFilter unit + DI wiring test del /arbol) — funcionalmente correcta, pero no end-to-end.

Impacto

No es un problema solo de CAT-002. Cualquier UDT futuro que necesite override DI scoped en e2e va a topar con lo mismo:

  • PRD-002 (Producto CRUD): testear el binding real IAvisoQueryRepositoryAvisoQueryRepository vs stub.
  • VTA-001..005 (órdenes de venta): overrides de gateways AFIP/IMAC en e2e.
  • FAC-001..006 (facturación): overrides de servicios externos.
  • Cualquier test que necesite stub determinístico de dependencias.

Tarea

Refactor de tests/SIGCM2.Api.Tests/Infrastructure/TestWebApplicationFactory.cs:

  1. Desacoplar el singleton RSA — opciones: (a) mover la generación de clave a un IKeyProvider scoped con default registrado en el factory, (b) sellar el RSA singleton pero aceptar overrides scoped de otros servicios, (c) pattern WithWebHostBuilder(b => b.ConfigureTestServices(...)) habilitado vía collection fixture no sellada.
  2. Agregar test de referencia que demuestre override funcionando (puede ser mock de IAvisoQueryRepository para cubrir el 409 path de CAT-002).
  3. Re-activar e2e 409 test en RubrosControllerTests que hoy está como Skip o no existe.

Criterios de aceptación

  • Un test puede inyectar una implementación custom de IAvisoQueryRepository (o cualquier scoped dependency) sin romper JWT signing ni los 254 tests Api existentes.
  • Test e2e CreateRubro_Returns409_WhenParentHasAvisos pasa.
  • Patrón documentado con XML doc en TestWebApplicationFactory para uso futuro.

Prioridad

Antes de PRD-002 (CAT-003 no lo necesita porque no toca IAvisoQueryRepository).

Artifacts

  • Verify report CAT-002 (engram): sdd/cat-002-regla-oro-rama-vs-hoja/verify-report — W1
  • Archive report CAT-002 (engram): sdd/cat-002-regla-oro-rama-vs-hoja/archive-report
  • PR #35: #35
## Contexto Detectado durante `sdd-verify` de CAT-002 (Regla de Oro Rama vs Hoja, PR #35). `TestWebApplicationFactory` registra el proveedor de claves RSA (JWT signing) como **singleton sellado**, lo que impide que un test individual haga override de dependencies `Scoped` vía `ConfigureTestServices`. En CAT-002 esto se manifestó en la imposibilidad de inyectar un `FakeAvisoQueryRepository` por test para forzar el path HTTP `POST /rubros` → **409 Conflict** cuando el padre tiene avisos. La cobertura actual de ese path es **compositiva** (handler unit + `ExceptionFilter` unit + DI wiring test del `/arbol`) — funcionalmente correcta, pero no end-to-end. ## Impacto No es un problema solo de CAT-002. Cualquier UDT futuro que necesite override DI scoped en e2e va a topar con lo mismo: - **PRD-002** (Producto CRUD): testear el binding real `IAvisoQueryRepository` → `AvisoQueryRepository` vs stub. - **VTA-001..005** (órdenes de venta): overrides de gateways AFIP/IMAC en e2e. - **FAC-001..006** (facturación): overrides de servicios externos. - Cualquier test que necesite stub determinístico de dependencias. ## Tarea Refactor de `tests/SIGCM2.Api.Tests/Infrastructure/TestWebApplicationFactory.cs`: 1. Desacoplar el singleton RSA — opciones: (a) mover la generación de clave a un `IKeyProvider` scoped con default registrado en el factory, (b) sellar el RSA singleton pero aceptar overrides scoped de otros servicios, (c) pattern `WithWebHostBuilder(b => b.ConfigureTestServices(...))` habilitado vía collection fixture no sellada. 2. Agregar test de referencia que demuestre override funcionando (puede ser mock de `IAvisoQueryRepository` para cubrir el 409 path de CAT-002). 3. Re-activar e2e 409 test en `RubrosControllerTests` que hoy está como `Skip` o no existe. ## Criterios de aceptación - [ ] Un test puede inyectar una implementación custom de `IAvisoQueryRepository` (o cualquier scoped dependency) sin romper JWT signing ni los 254 tests Api existentes. - [ ] Test e2e `CreateRubro_Returns409_WhenParentHasAvisos` pasa. - [ ] Patrón documentado con XML doc en `TestWebApplicationFactory` para uso futuro. ## Prioridad Antes de PRD-002 (CAT-003 no lo necesita porque no toca `IAvisoQueryRepository`). ## Artifacts - Verify report CAT-002 (engram): `sdd/cat-002-regla-oro-rama-vs-hoja/verify-report` — W1 - Archive report CAT-002 (engram): `sdd/cat-002-regla-oro-rama-vs-hoja/archive-report` - PR #35: https://repo.eldiaservicios.com/dmolinari/SIG-CM2.0/pulls/35
dmolinari added the followup label 2026-04-19 11:52:28 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dmolinari/SIG-CM2.0#36