Chain Mock Architecture

Postman HTTP Interceptor Library

v2.2.4


Presiona ESPACIO para continuar

Agenda

1 El Problema
2 La Solución: Chain Mock
3 Funcionamiento de la Librería
4 Demo: Escenario 1
5 Demo: Escenario 2
6 Configuración e Integración

El Problema

Arquitectura típica de microservicios:

UX Layer
Domain
Core Bank
El Core Bank no está disponible
El Domain está en desarrollo
Necesitamos respuestas controladas

La Solución: Chain Mock

Cada servicio puede ser mockeado independientemente:

UX
Domain
Core
interceptar
Mock UX
Mock Domain
Mock Core

Funcionamiento de la Librería

Arquitectura interna y componentes

Componentes de la Librería

PostmanInterceptorHelper
Orquestador principal.
Decide cuándo interceptar.
PostmanInterceptorProperties
Configuración del interceptor
(ambiente, whitelist, apps)
ChainMockAppProperties
Config por aplicación
(URL real → URL mock)
HeaderSetter
Interface funcional
para setear headers
BaseUrlSetter
Interface funcional
para cambiar URL base
GlobalRequestAccessor
Acceso a headers
del request entrante

¿Cómo funciona?

HTTP Client (OkHttp, Retrofit, Apache HttpClient)
Request Original Interceptor Request Modificado
PostmanInterceptorHelper
isEnabled() interceptToMockServer() ResultRequest
Acciones
Cambiar URL Base Agregar x-api-key Propagar Headers

Flujo de Decisión: isEnabled()

¿Ambiente != prod?
¿Ambiente en whitelist?
¿start-app == mi app?
return true

Seguridad por defecto

Si cualquier condición falla, el interceptor se desactiva y el request continúa normal.

Headers siempre propagados

Aunque no se intercepte, los headers x-chain-mock-* siempre se reenvían.

Flujo: interceptToMockServer()

1 Obtener lista de apps desde header x-chain-mock-apps
2 Parsear URL base del request entrante con UrlParser
3 Buscar configuración de mock para esa URL base
4 Cambiar URL base a postmanMockBaseUrl
5 Agregar header x-api-key de la config
6 Propagar todos los headers de Postman

Interfaces Funcionales

La librería es framework-agnostic gracias a interfaces funcionales:

HeaderSetter

// Lambda HeaderSetter s = (h, v) -> req.header(h, v); // Method reference HeaderSetter s = req::header;

BaseUrlSetter

// Cambiar URL base BaseUrlSetter s = url -> { HttpUrl u = HttpUrl .parse(url); builder.url(u); };

GlobalRequestAccessor

// Acceder headers GlobalRequestAccessor a = header -> request .getHeader(header);

Headers de Control

x-chain-mock-start-app us-ux-payment-toh

Define quién inicia la cadena de mocks

x-chain-mock-apps us-domain-payment-toh

Lista de servicios que serán mockeados

Solo el servicio cuyo nombre coincide con start-app activa la interceptación

Servicios del Demo

Servicio App Name Puerto Rol
UX Layer us-ux-payment-toh 8080 Capa de presentación
Domain Layer us-domain-payment-toh 8081 Lógica de negocio
Core Bank core-bank Externo Core
01

Mockear Domain desde UX

El UX llama al Mock en lugar del Domain real

Escenario 1: Headers

x-chain-mock-start-app: us-ux-payment-toh
x-chain-mock-apps: us-domain-payment-toh

El UX activa la interceptación porque start-app coincide con su nombre

Escenario 1: Flujo

Cliente / Postman
us-ux-payment-toh
Intercepta
↓ redirige
Mock Domain (pstmn.io)
us-domain-payment-toh
No se llama
02

Mockear Core-Bank desde Domain

El Domain llama al Mock en lugar del Core-Bank real

Escenario 2: Headers

x-chain-mock-start-app: us-domain-payment-toh
x-chain-mock-apps: core-bank

El Domain activa la interceptación. El UX solo propaga los headers.

Escenario 2: Flujo

Cliente / Postman
us-ux-payment-toh
Propaga
us-domain-payment-toh
Intercepta
↓ redirige
Mock Core-Bank (pstmn.io)

Comparación

Escenario 1

start-app: us-ux-payment-toh
chain-apps: us-domain-payment-toh
UX MOCK

Escenario 2

start-app: us-domain-payment-toh
chain-apps: core-bank
UX DOM MOCK

Configuración

application.yml

# Configuración del UX app: environment: dev name: us-ux-payment-toh postman: whitelist: environments: dev,test,qa chain: mock: apps: us-domain-payment-toh: name: us-domain-payment-toh not-mock-base-url: http://localhost:8081 postman-mock-base-url: https://abc.mock.pstmn.io postman-api-key: PMAK-xxx

application.properties

# Configuración del UX app.environment=dev app.name=us-ux-payment-toh postman.whitelist.environments=dev,test,qa # Mock para Domain chain.mock.apps.us-domain-payment-toh.name=us-domain-payment-toh chain.mock.apps.us-domain-payment-toh.not-mock-base-url=http://localhost:8081 chain.mock.apps.us-domain-payment-toh.postman-mock-base-url=https://abc.mock.pstmn.io chain.mock.apps.us-domain-payment-toh.postman-api-key=PMAK-xxx

Headers que siempre se propagan

Estos headers se reenvían aunque la interceptación NO esté activa:

x-chain-mock-start-app x-chain-mock-apps x-mock-response-id x-mock-response-name x-mock-response-code

Esto permite que la cadena de mocks funcione a través de múltiples servicios

Demo Time!

Veamos la magia en acción

01

Mockear Domain

desde UX

02

Mockear Core-Bank

desde Domain

Vamos a Postman...

Troubleshooting

Problema Verificar
No intercepta ¿x-chain-mock-start-app == app.name?
Error de configuración ¿Existe entrada en chain.mock.apps para el destino?
401 Unauthorized ¿La API Key de Postman es correcta?
URL incorrecta ¿not-mock-base-url coincide con la URL real?

Resumen

1 x-chain-mock-start-app define quién activa la interceptación
2 x-chain-mock-apps define qué servicios serán mockeados
3 Solo el servicio cuyo nombre coincide con start-app intercepta
4 Los headers siempre se propagan a través de toda la cadena

¿Preguntas?

lib-postman-http-interceptor v2.2.4

docs/guia-implementacion.md

docs/ejemplos-integracion.md