# Sprint 2 — Etapa 6: Fixes post-validación + Tests Sprint 2

> **Tipo:** correcciones menores de texto/layout + tests unitarios. Sin features nuevas, sin cambios de dominio.
> **Objetivo:** cerrar los dos hallazgos de la validación visual de Etapa 5 y agregar tests que cubran el comportamiento nuevo del PDF de recursos (condicional de página, drawResourcesSection).
> **Resultado esperado:** PDF sin typos de acentos, columna "Costo esp." no truncada, suite de tests verde que incluye cobertura de la nueva sección de recursos. Validación visual del director requerida antes del OK formal.

---

## Archivos a modificar

```
src/lib/export/pdf-sections.ts                         ← fix acentos + ancho columna
tests/lib/export/pdf-resources-section.test.ts         ← NUEVO — tests de drawResourcesSection
```

Opcionalmente, extender `tests/lib/export/pdf-export.test.ts` con 2 tests de comportamiento
condicional (ver Feature 2). Si lo considerás más limpio, crear un archivo separado
`tests/lib/export/pdf-export-sprint2.test.ts`.

Si durante la implementación necesitás tocar cualquier otro archivo, **detenete y reportá
el conflicto antes de proceder**.

---

## Fix 1 — Acentos faltantes en drawResourcesSection

En `pdf-sections.ts`, función `drawResourcesSection`, el subtítulo dice:
```
"Costo por ejecucion, ponderado por probabilidad de ejecucion de cada actividad."
```

Corregir a:
```
"Costo por ejecución, ponderado por probabilidad de ejecución de cada actividad."
```

Verificar con grep que no queden otras ocurrencias de "ejecucion" (sin tilde) en el archivo.

---

## Fix 2 — Columna "Costo esp." truncada en drawResourcesSection

La última columna del header aparece como "Costo esp. (U..." porque `cellWidth: 26` es
insuficiente para "Costo esp. (USD)".

**Solución preferida:** cambiar el header a `'Esp. (USD)'` (abreviado) manteniendo `cellWidth: 26`.
Esto es más legible a 7.5pt en una celda angosta que forzar más ancho.

Si la moneda es variable (no siempre USD), usar `\`Esp. (${currency})\`` en lugar del string hardcodeado.
Revisar si las otras columnas ya usan `currency` en el header — ser consistente.

---

## Feature 2 — Tests unitarios: drawResourcesSection y página condicional

### 2.1 Tests para drawResourcesSection

Crear `tests/lib/export/pdf-resources-section.test.ts`.

El mock de jsPDF es el mismo patrón que usa `pdf-export.test.ts` — reusar o importar el
fixture. El mock de `autoTable` es `vi.fn()`.

**Tests requeridos:**

```typescript
describe('drawResourcesSection', () => {

  it('no lanza error con actividades que tienen recursos', () => {
    // result con al menos una actividad con resourceCostBreakdown no vacío
    // resources con el recurso referenciado
    // activities con el assignedResource correspondiente
    // Verificar: no lanza, autoTable fue llamado
  })

  it('no llama a autoTable si todas las actividades tienen resourceCostBreakdown vacío', () => {
    // result con perActivity donde todos tienen resourceCostBreakdown: []
    // Verificar: autoTable NO fue llamado (la función retorna early)
  })

  it('el header de autoTable incluye la moneda correcta', () => {
    // Llamar con currency: 'PYG'
    // Verificar que el primer arg de autoTable.head contiene 'PYG'
  })

  it('llama a autoTable por cada actividad con recursos (una tabla total, no una por actividad)', () => {
    // result con 2 actividades con recursos
    // Verificar: autoTable fue llamado exactamente 1 vez (la tabla agrupa todo)
  })

})
```

### 2.2 Tests de comportamiento condicional en exportToPdf

Extender el describe existente en `pdf-export.test.ts` (o en nuevo archivo):

```typescript
describe('exportToPdf — página condicional de recursos (Sprint 2)', () => {

  it('NO llama a drawResourcesSection cuando ninguna actividad tiene recursos', async () => {
    // mockSimulation con perActivity donde resourceCostBreakdown: [] en todas
    // Verificar: autoTable llamado exactamente 1 vez (solo la tabla principal de actividades)
  })

  it('llama a autoTable dos veces cuando hay actividades con recursos', async () => {
    // mockSimulation con al menos una actividad con resourceCostBreakdown no vacío
    // resources con el recurso referenciado
    // Verificar: autoTable llamado al menos 2 veces (tabla principal + tabla de recursos)
  })

  it('addPage se llama una vez más cuando hay recursos (página extra)', async () => {
    const addPageCallsWithout = /* llamar sin recursos, contar addPage.mock.calls.length */
    const addPageCallsWith = /* llamar con recursos, contar addPage.mock.calls.length */
    expect(addPageCallsWith).toBe(addPageCallsWithout + 1)
  })

})
```

**Nota sobre el mock:** El mock de `jsPDF` en `pdf-export.test.ts` hace `vi.clearAllMocks()` en
`beforeEach`, así que los contadores se resetean entre tests. Asegurate de resetear también
el mock de `autoTable` si lo extendés en el mismo archivo.

---

## Verificaciones obligatorias antes de reportar

### 1. Verificación de scope con git diff — OBLIGATORIO
```bash
git diff --name-only HEAD
```

El resultado debe contener únicamente:
```
src/lib/export/pdf-sections.ts
tests/lib/export/pdf-resources-section.test.ts
tests/lib/export/pdf-export.test.ts               ← si se extendió este archivo
tests/lib/export/pdf-export-sprint2.test.ts        ← si se creó archivo nuevo
```

Si aparece cualquier archivo no listado → revertirlo y documentarlo.

**Nota:** `src/features/workspace/WorkspacePage.tsx`, `src/lib/export/pdf-export.ts` y
`src/lib/export/pdf-sections-roi.ts` probablemente aparezcan en el diff porque son cambios
de Etapas 4 y 5 que aún no han sido commiteados. Eso es correcto — no revertirlos.

### 2. Build limpio
```bash
npm run build
```

### 3. Tests — todos verdes incluyendo los nuevos
```bash
npm run test
```

El reporte debe indicar cuántos tests se agregaron respecto de los 541 anteriores.

### 4. Smoke test visual del fix de acentos

Exportar un PDF de escenario con recursos y verificar que la página 4 muestra:
- "Costo por ejecución" (con tilde, dos veces) en el subtítulo
- El header de la última columna no truncado ("Esp. (USD)" o similar)

---

## Alcance estricto — lo que NO entra en esta etapa

- ❌ Features nuevas de ningún tipo
- ❌ Cambios en dominio, store, o componentes React
- ❌ Tests E2E de Playwright (los existentes son suficientes para Sprint 2)
- ❌ Cambios en pdf-export.ts o pdf-sections-roi.ts (Etapa 5 ya los cerró)
- ❌ Refactors de código existente que no estén relacionados con los dos fixes

---

## Reporte esperado al terminar

```
## Etapa 6 completada

### Archivos modificados
- src/lib/export/pdf-sections.ts — fix acentos + fix header columna
- tests/lib/export/pdf-resources-section.test.ts — NUEVO (X tests)
- tests/lib/export/pdf-export.test.ts — extendido (X tests nuevos) / pdf-export-sprint2.test.ts — NUEVO

### Fixes aplicados
- Acentos: "ejecución" corregido (2 ocurrencias en drawResourcesSection)
- Columna: header cambiado a "Esp. (USD)" — ya no se trunca

### Tests agregados
- pdf-resources-section.test.ts: X tests — [descripción breve]
- pdf-export.test.ts / sprint2: X tests — comportamiento condicional

### Verificaciones
- git diff --name-only HEAD: [lista] ✅
- npm run build: ✅
- npm run test: [nuevo total]/[anterior] tests verdes ✅
- Smoke test visual: [descripción breve del fix visual confirmado]

### Conflictos de scope
[ninguno / lista con razones]
```
