Skip to content

willkwolf/microservices-pact-nodejs

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Microservices Pact Testing Project

¿Qué es este proyecto?

Imagina que tienes dos amigos: uno vende productos (Order Service) y otro maneja pagos (Payment Service). Cuando vendes algo, necesitas asegurarte de que el pago se procese correctamente. Pero ¿cómo pruebas que ambos "hablan el mismo idioma" sin romper nada?

Este proyecto demuestra Pact Testing - una forma de probar contratos entre microservicios. Es como un acuerdo escrito que dice: "Si me das estos datos, te devolveré estos otros". Si alguien cambia el acuerdo sin avisar, las pruebas fallan.

Arquitectura: Dos Servicios que Trabajan Juntos

Order Service (Vendedor)

  • Trabajo: Recibe pedidos de clientes, valida datos, guarda pedidos.
  • Comunica: Envía pedidos a Payment Service vía HTTP, y publica eventos a Kafka.

Payment Service (Cajero)

  • Trabajo: Procesa pagos cuando recibe notificaciones de pedidos.
  • Comunica: Recibe pedidos vía HTTP, consume eventos de Kafka para procesar pagos.

Dos Tipos de Comunicación

1. HTTP APIs (Probadas por Pact)

Síncrona: Como una llamada telefónica.

  • Order Service llama a Payment Service: "Crea este pedido"
  • Payment Service responde: "OK, aquí está el pedido creado"

Pact verifica: ¿La respuesta tiene todos los campos que Order Service espera?

2. Kafka Events (No probados por Pact)

Asíncrona: Como dejar un mensaje en el contestador.

  • Order Service publica: "Nuevo pedido creado"
  • Payment Service consume y procesa: "Voy a cobrar este pedido"

Por qué no Pact? Pact es para APIs HTTP. Kafka es comunicación interna.

El Flujo de Pruebas con Pact

Paso 1: El Consumidor Define Expectativas

Order Service (consumidor) dice: "Espero que cuando envíe estos datos, reciba esta respuesta".

// En realPact.test.js
await provider.addInteraction({
  uponReceiving: 'a request to create an order',
  withRequest: { /* datos que envío */ },
  willRespondWith: { /* datos que espero recibir */ }
});

Paso 2: Se Genera el Contrato

Las pruebas crean un archivo JSON (el "contrato") que dice exactamente qué debe pasar.

Paso 3: Se Publica al Pact Broker

Es como un notario que guarda el contrato. Ambos servicios pueden verlo.

Paso 4: El Proveedor Verifica

Payment Service (proveedor) lee el contrato y verifica: "¿Puedo cumplir con esto?"

Si no, ¡fallo! Alguien cambió el acuerdo sin avisar.

Cómo Ejecutar las Pruebas

1. Iniciar Servicios

# Terminal 1: Payment Service
cd payment-service && npm run dev

# Terminal 2: Pact Broker
cd pact-broker && docker-compose up -d

2. Ejecutar Pruebas del Consumidor

cd order-service && npm run test:pact

3. Publicar Contrato

cd order-service && node scripts/publish-pacts.js

4. Verificar en el Proveedor

cd payment-service && node scripts/verify-pacts.js

Ejemplo de Conflicto que Creamos

Agregamos un campo description a la respuesta esperada en el contrato. Pero Payment Service no lo devuelve. ¡Fallo!

Lección: Los cambios en contratos deben ser coordinados entre servicios.

Conceptos Clave Explicados Sencillamente

¿Qué es un Contrato?

Como un recibo de compra: especifica qué das y qué recibes. Si el recibo cambia, ambos deben acordar.

¿Por qué Pact?

En microservicios, cambiar un servicio puede romper otros. Pact detecta esto antes de deploy.

Consumidor vs Proveedor

  • Consumidor: Quien usa el servicio (Order Service usa Payment Service).
  • Proveedor: Quien provee el servicio (Payment Service).

¿Pact prueba todo?

No. Solo contratos HTTP. Para Kafka, necesitas otras pruebas (unitarias, integración).

Archivos Importantes

  • order-service/tests/pact/realPact.test.js: Define expectativas del consumidor.
  • payment-service/scripts/verify-pacts.js: Verifica que el proveedor cumpla.
  • order-service/src/services/orderService.js: Lógica de negocio + eventos Kafka.
  • pact-broker/: Almacén de contratos.

Dudas Comunes Resueltas

¿Por qué modificar OrderEvent no afectó Pact?

OrderEvent es para Kafka (interno). Pact es para APIs HTTP entre servicios.

¿Siempre modificar modelo primero?

Depende. Para APIs: actualiza proveedor, luego consumidor. Para interno: modelo primero.

¿Kafka qué hace aquí?

Desacopla servicios. Order Service crea pedido, publica evento. Payment Service reacciona automáticamente.

¡Ahora entiendes cómo Pact asegura que tus microservicios "hablen el mismo idioma"!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 93.2%
  • Shell 6.8%