Skip to content

chore: tests unitarios, CI con GitHub Actions y diagrama de arquitectura - #2

Merged
AZapata27 merged 1 commit into
masterfrom
chore/ci-tests-architecture
Oct 13, 2026
Merged

AZapata27 merged 1 commit into
masterfrom
chore/ci-tests-architecture

Conversation

@AZapata27

Copy link
Copy Markdown
Owner

Problema

El repo (proyecto fijado #1 del perfil) no tenía tests, CI ni un diagrama de arquitectura. Además, lint y build no pasaban:

  • lint: el .eslintrc.json raíz ignora **/* y ningún proyecto tenía su propio config → "All files are ignored".
  • build: versiones de Nx mezcladas (nx 18.0.4 + @nx/eslint-plugin ^22) y @swc/cli 0.7 (la salida cambió y el executor @nx/js:swc de Nx 18 marcaba el build como fallido aunque compilaba); además el type-check del executor SWC falla con TS6059 rootDir al importar las libs no-buildables (@app/common, @app/contracts).
  • No había lockfile versionado (package-lock.json estaba en .gitignore), así que no se podía hacer npm ci.

Qué cambia

Tests (71, todos unitarios con @nestjs/testing, sin Postgres/Kafka/Redis reales):

Proyecto Tests Qué cubren
auth-service 14 registro (evento user.registered en outbox), login con JWT real firmado/verificado, hash bcrypt del password y del refresh token, credenciales inválidas, usuario inactivo, refresh token falsificado/no coincidente, logout
ticket-service 18 creación, findOne/update/delete con NotFoundException, transiciones de estado (ticket.status.changed sólo si cambia), filtros y paginación, comentarios, @Roles(ADMIN, PROJECT_MANAGER) en delete
assignment-service 7 assign/unassign, conflicto por doble asignación, not-found, y el camino completo assignment → outbox_events → KafkaService.emit('assignment.events', ticket.assigned) usando el OutboxService real sobre un repositorio en memoria
notification-service 9 cada handler suscrito a su tópico (@EventPattern), cobertura de todos los KAFKA_TOPICS, manejo de eventos
gateway 11 prueba HTTP real (Nest + Passport JWT + guard global): 401 sin token / token malformado / firmado con otro secreto / expirado, 200 con token válido, userId del JWT propagado al proxy, rutas @Public(); proxy de tickets propagando status code de errores downstream
common (lib) 12 OutboxService (PENDING → SENT, reintentos, FAILED tras 5), JwtAuthGuard y RolesGuard

Configuración (cambios mínimos para que lint/typecheck/build pasen):

  • .eslintrc.json por proyecto (convención Nx) y allow en @nx/enforce-module-boundaries para los alias internos de cada app (@auth/*, @gateway/*, …), que son una convención documentada del repo.
  • Nx y plugins alineados a 18.3.5; @swc/cli ~0.3.12, @swc/core ~1.5.7, @swc-node/register ~1.9.1; @nestjs/testing como devDependency.
  • Builds SWC con skipTypeCheck: true (como ya tenía auth-service) y nuevo target typecheck (tsc --noEmit) por app, para no perder la verificación de tipos.
  • .swcrc excluye specs y jest.config del output.
  • Correcciones de tipos detectadas por typecheck: imports sin uso y TicketResponseDto con estimatedHours/sprintId/parentTicketId nullable (coinciden con la entidad).
  • package-lock.json versionado y .nvmrc con Node 22.

CI: .github/workflows/ci.yml (CI) en push a master y en PRs: npm ci + npx nx run-many -t lint typecheck test build. Usa NX_NO_CLOUD=true, no necesita secretos.

README: badge de CI y sección ## Arquitectura (diagrama) con un flowchart Mermaid (cliente → gateway JWT → servicios → su Postgres → outbox → tópicos Kafka reales → notification-service, Redis) y un diagrama de secuencia "asignar ticket → evento → notificación".

Cómo se usa

npm ci
npx nx run-many -t lint typecheck test build
# o por proyecto
npx nx test assignment-service

Casos borde / hallazgos (no corregidos en este PR)

  • El relay del outbox no está programado: OutboxService.processPendingEvents() existe pero nada lo invoca (@Cron/@Interval), así que hoy los eventos quedan PENDING en outbox_events y no llegan a Kafka. Quedó documentado en el README.
  • Redis está registrado en todos los servicios, pero ningún flujo lo usa todavía (sólo abre la conexión).
  • La salida del build SWC no es ejecutable tal cual: SWC no reescribe los alias (@app/common, @auth/...) ni incluye las libs en dist, así que node dist/.../main.js / nx serve fallarían en runtime. Arreglarlo implica cambiar la estrategia de build (p. ej. @nx/webpack o libs buildables) y queda para otro PR.
  • CommentsService.delete no verifica que quien borra sea el autor (el parámetro userId no se usa).
  • nx.json contiene nxCloudAccessToken (read-write) versionado en un repo público; conviene rotarlo/moverlo a variable de entorno. El CI lo ignora con NX_NO_CLOUD=true.
  • npm ci muestra un warning de peer (@swc-node/core pide @swc/core >= 1.13.3); no afecta lint/test/build.

Validación

Local (Windows 11, Node 22.16.0, npm ci desde cero, CI=true NX_NO_CLOUD=true):

npx nx run-many -t lint typecheck test build
NX   Successfully ran targets lint, typecheck, test, build for 7 projects

Tests por proyecto: auth-service 14, ticket-service 18, assignment-service 7, notification-service 9, gateway 11, common 12, contracts 0 (sin lógica) → 71 en verde.

🤖 Generated with Claude Code

- Unit tests with @nestjs/testing for auth, ticket, assignment,
  notification, gateway and the common lib (71 tests, no real
  Postgres/Kafka/Redis needed).
- Fix lint/typecheck: per-project .eslintrc.json, allow intra-app path
  aliases, remove unused imports, nullable TicketResponseDto fields.
- Align Nx packages to 18.3.5 and SWC tooling so `build` succeeds; add
  `typecheck` targets (tsc --noEmit) since SWC builds skip type-check;
  exclude specs from SWC output.
- Track package-lock.json and pin Node 22 in .nvmrc for reproducible CI.
- GitHub Actions CI (lint, typecheck, test, build) with README badge and
  Mermaid architecture + sequence diagrams.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@qodo-code-review

Copy link
Copy Markdown

ⓘ Qodo reviews are paused because your trial has ended. Ask your workspace admin to add credits to resume reviews. Manage billing

@AZapata27
AZapata27 merged commit c879696 into master Oct 13, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant