Mock service para APIs de múltiples squads (Ticabank, CIAM, Atlas, Cards) con soporte completo para testing E2E.
- Node.js >= 18.0.0
- npm >= 9.0.0
# Clonar el repositorio
git clone https://github.com/elferjarenas/fwk-api-mocks.git
cd fwk-api-mocks
# Instalar dependencias
npm install
# Instalar hooks de Git (Husky)
npx husky install
# o
npm run prepare
# Compilar TypeScript
npm run build
# Iniciar servidor (con seed automático)
AUTO_SEED=true npm startEl servidor estará disponible en http://localhost:5050
# Instalar con hooks de Git
npm install
# Activar hooks de Husky (commitizen, pre-push)
npx husky install
# Modo desarrollo con hot-reload
npm run start:dev
# Modo desarrollo con seed automático
AUTO_SEED=true npm run start:dev
⚠️ Importante: Si hicistegit initdespués denpm install, debes ejecutarnpx husky installmanualmente para activar los hooks de Git (validación de commits y pre-push tests).
Este proyecto usa Husky + Commitizen + Commitlint para commits consistentes:
Después de clonar el repositorio o hacer git init, activa los hooks:
npx husky install
# o
npm run prepareEsto instalará automáticamente:
- ✅
commit-msg: Valida formato lowercase - ✅
prepare-commit-msg: Abre Commitizen si mensaje inválido - ✅
pre-push: Correnpm test(97 tests) antes de push
npm run commit # Abre menú interactivo con Commitizen
# o
git add . && npm run commit# ✅ CORRECTO
git commit -m "feat(ciam): agregar endpoint de oauth"
git commit -m "fix(ticabank): corregir validación en quote"
git commit -m "docs: actualizar readme con ejemplos"
# ❌ INCORRECTO (bloqueado por hooks)
git commit -m "FEAT(ciam): Agregar Endpoint" # Mayúsculas bloqueadas
git commit -m "Fix: problema" # Sin scopefeat: Nueva funcionalidadfix: Corrección de bugsdocs: Cambios en documentacióntest: Agregar o modificar testsrefactor: Refactorización de códigoperf: Mejoras de performancestyle: Cambios de formato (sin lógica)build: Cambios en build o dependenciasci: Cambios en CI/CDchore: Tareas de mantenimientorevert: Revertir commits
ciam: Endpoints CIAMticabank: Endpoints Ticabankatlas: Endpoints Atlascommon: Código compartidotests: Cambios en testsdeps: Actualización de dependenciasconfig: Configuración del proyecto
commit-msg: Valida formato lowercase
prepare-commit-msg: Abre Commitizen si mensaje inválido
pre-push: Corre npm test (103 tests) antes de push
git commit --no-verify -m "mensaje"
git push --no-verifynpm start # Iniciar servidor (producción)
npm run start:dev # Iniciar servidor (desarrollo con hot-reload)
npm run build # Compilar TypeScriptEl proyecto tiene 3 archivos de seed independientes:
data/seed-test.yml # Usuarios aislados para tests (DEFAULT)
# Cards V4, Atlas, CIAM tests específicos
# Evita contaminación de datos entre squads
data/seed-users.yml # Usuarios base compartidos
# Ticabank, CIAM, usuarios generales
data/seed-performance.yml # Usuarios para pruebas de carga
# Copia de seed-users para stress testing¿Cuándo usar cada uno?
- Tests automatizados:
seed-test.yml(DEFAULT - se usa automáticamente) - Desarrollo local:
SEED_TYPE=userspara usuarios generales - Pruebas de carga:
SEED_TYPE=performance
Ejemplo:
# Tests con usuarios aislados (DEFAULT)
AUTO_SEED=true npm run dev
# Desarrollo con usuarios base
AUTO_SEED=true SEED_TYPE=users npm run dev
# Performance testing
AUTO_SEED=true SEED_TYPE=performance npm run dev# El comando npm test automáticamente:
# 1. Compila TypeScript
# 2. Arranca el servidor con AUTO_SEED=true
# 3. Espera a que esté listo
# 4. Ejecuta los tests E2E
# 5. Detiene el servidor
npm test # Corre TODOS los tests (97 tests)
npm run test:all # Alias de npm test
npm run test:cov # Tests con cobertura✅ 97/97 tests passing - El script maneja automáticamente el ciclo de vida del servidor
✅ Todos los tests manejan el ciclo de vida del servidor automáticamente. Ya no es necesario arrancar el servidor manualmente.
npm run test:atlas # Solo Atlas (6 tests)
npm run test:cards # Solo Cards (12 tests)
npm run test:ciam # Solo CIAM (30 tests)
npm run test:ticabank # Solo Ticabank (49 tests)Resultado esperado: Todos los tests pasan al 100% tanto individualmente como agrupados.
✅ Atlas: 6/6 tests (100%)
✅ Cards: 12/12 tests (100%)
✅ CIAM: 30/30 tests (100%)
✅ Ticabank: 49/49 tests (100%)
✅ npm test: 97/97 tests (100%)
Obtiene la lista de tarjetas de un cliente con paginación automática (15 tarjetas por página).
Endpoint:
GET /bs-card-v4/customer-management/product-service/v4/cards
Headers requeridos:
branch-office-code: BR001
user-code: USER001
Query params:
personId: {IDC}000 (11 dígitos: IDC + 3 ceros)
pageNumber: 1 (opcional, default 1)
extraFields: true|false (opcional, incluye products con accounts)
Ejemplo curl:
# Lista básica
curl -X GET "http://localhost:5050/bs-card-v4/customer-management/product-service/v4/cards?personId=12345678000" \
-H "branch-office-code: BR001" \
-H "user-code: USER001"
# Con paginación y products
curl -X GET "http://localhost:5050/bs-card-v4/customer-management/product-service/v4/cards?personId=12345678000&pageNumber=1&extraFields=true" \
-H "branch-office-code: BR001" \
-H "user-code: USER001"Response exitoso (200):
[
{
"number": "4557881234567890",
"status": "00",
"statusDescription": "ACTIVA",
"expiryDate": "12/26",
"cardTypeDescription": "PHYSICAL",
"embossedName": "JUAN PEREZ",
"electronicCommerce": true,
"abroadUsage": true,
"products": [
{
"productDescription": "CUENTA AHORRO",
"formattedAccount": "194-12345678-0-00"
}
]
}
]Obtiene información detallada de una tarjeta específica.
Endpoint:
GET /bs-card-v4/customer-management/product-service/v4/cards/:cardId
Ejemplo curl:
curl -X GET "http://localhost:5050/bs-card-v4/customer-management/product-service/v4/cards/4557881234567890?extraFields=true" \
-H "branch-office-code: BR001" \
-H "user-code: USER001"Actualiza la configuración de uso de una tarjeta (ecommerce y/o extranjero).
Endpoint:
PATCH /bs-card-v4/customer-management/product-service/v4/cards/:cardId
Headers requeridos:
branch-office-code: BR001
user-code: USER001
Content-Type: application/json
Body (JSON):
{
"ecommerceEnabled": true,
"abroadUseEnabled": false
}Ejemplo curl:
curl -X PATCH "http://localhost:5050/bs-card-v4/customer-management/product-service/v4/cards/4557881234567890" \
-H "branch-office-code: BR001" \
-H "user-code: USER001" \
-H "Content-Type: application/json" \
-d '{"ecommerceEnabled": true, "abroadUseEnabled": false}'Response exitoso (204 No Content):
(cuerpo vacío)
Cards V4 soporta múltiples personalities para simular diferentes escenarios de error. Siguen el patrón estándar YPCARD### (9 dígitos):
| Personality | IDC | Status | Descripción |
|---|---|---|---|
YPCARD000 |
(cualquiera) | 200 | Success - flujo normal |
YPCARD001 |
11111111 | 401 | Token inválido o expirado |
YPCARD002 |
22222222 | 503 | Timeout de servicio |
YPCARD003 |
33333333 | 400 | IDC inválido |
YPCARD007 |
77777777 | 409 | Servicio externo no disponible |
YPCARD008 |
88888887 | 500 | Error en backend |
YPCARD004 |
44444445 | 500 | Servicio no disponible |
YPCARD005 |
55555556 | 500 | Circuit breaker abierto |
YPCARD006 |
66666666 | 503 | Circuit breaker abierto |
YPCARD009 |
99999997 | 400 | Datos incorrectos |
YPCARD010 |
99999998 | 400 | Tipo de tarjeta inválido |
Lógica de validación:
- Usuario sin personality → flujo normal (devuelve tarjetas si existen)
- Usuario con
YPCARD000→ flujo normal (success personality) - Usuario con
YPCARD001-010→ simula el error correspondiente - Usuario con personality de otro squad (YTIKABANK, YPCIAM) → retorna array vacío o 404
Nota: Las personalities son strings simples (no arrays). Un usuario solo tiene una personality activa a la vez.
Ejemplo de uso:
# Simular error 401
curl "http://localhost:5050/bs-card-v4/customer-management/product-service/v4/cards?personId=11111111000" \
-H "branch-office-code: BR001" \
-H "user-code: USER001"
# Usuario con YTIKABANK (otro squad) - devuelve array vacío
curl "http://localhost:5050/bs-card-v4/customer-management/product-service/v4/cards?personId=034636351000" \
-H "branch-office-code: BR001" \
-H "user-code: USER001"Las respuestas de lista incluyen headers de paginación:
items-pending: true|false
page-number: 2 (si hay más páginas)
La paginación es automática con 15 tarjetas por página.
Cuando extraFields=true, cada tarjeta incluye un array products con las cuentas asociadas en formato BCP:
"products": [
{
"productDescription": "CUENTA AHORRO",
"formattedAccount": "194-12345678-0-00"
}
]Formato de cuenta:
- AHORRO:
194-{accountNumber}-0-{checkDigit} - CORRIENTE:
193-{accountNumber}-0-{checkDigit} - MAESTRA:
191-{accountNumber}-1-{checkDigit}
fwk-api-mocks/
├── .husky/ # Git hooks (commitizen, commitlint)
├── data/ # Archivos YAML de seed
│ ├── seed-test.yml # Usuarios para tests (DEFAULT)
│ ├── seed-performance.yml # Usuarios para pruebas de carga
│ └── seed-test.yml.backup # Backup de configuración
├── docs/ # Documentación del proyecto
│ ├── EXECUTIVE-SUMMARY.md
│ ├── MIGRATION-GUIDE.md
│ ├── MIGRATION-SUMMARY.md
│ └── SERVICE-VIRTUALIZATION-ANALYSIS.md
├── infra/
│ └── helm/ # Configuraciones Kubernetes
│ ├── values.yaml
│ ├── performance/
│ ├── qa/
│ └── stg/
├── src/ # Código fuente TypeScript
│ ├── app.ts # Servidor principal Fastify
│ ├── atlas/ # Endpoints Atlas (Transfers)
│ │ ├── atlas.routes.ts
│ │ ├── constants/
│ │ │ └── api-codes.ts
│ │ ├── entities/
│ │ │ ├── transfer-request-dto.ts
│ │ │ └── transfer-response-dto.ts
│ │ ├── exceptions/
│ │ │ ├── atlas-exception.ts
│ │ │ └── exception-builder.ts
│ │ ├── helpers/
│ │ │ └── transfer.helper.ts
│ │ ├── messages/
│ │ │ └── response.ts
│ │ ├── utility/
│ │ │ └── personality.ts
│ │ └── validators/
│ │ └── transfer.validator.ts
│ ├── cards/ # Endpoints Cards V4
│ │ ├── cards.routes.ts
│ │ ├── constants/
│ │ │ ├── api-codes.ts
│ │ │ ├── parameters.ts
│ │ │ └── personality-mappings.ts
│ │ ├── entities/
│ │ │ └── card-dto.ts
│ │ ├── exceptions/
│ │ │ ├── cards-exception.ts
│ │ │ └── exception-builder.ts
│ │ ├── helpers/
│ │ │ ├── card-detail.helper.ts
│ │ │ ├── card-list.helper.ts
│ │ │ └── card-update.helper.ts
│ │ ├── messages/
│ │ │ ├── response.ts
│ │ │ └── templates.ts
│ │ ├── support/
│ │ │ └── account-formatter.ts
│ │ └── validators/
│ │ ├── card-detail.validator.ts
│ │ ├── card-list.validator.ts
│ │ └── card-update.validator.ts
│ ├── ciam/ # Endpoints CIAM (Authentication)
│ │ ├── ciam.routes.ts
│ │ ├── constants/
│ │ │ └── api-codes.ts
│ │ ├── entities/
│ │ │ ├── enrollment-dto.ts
│ │ │ └── authentication-dto.ts
│ │ ├── exceptions/
│ │ │ ├── ciam-exception.ts
│ │ │ └── exception-builder.ts
│ │ ├── helpers/
│ │ │ ├── identification-methods.helper.ts
│ │ │ ├── facial-verification.helper.ts
│ │ │ ├── facial-identifiers.helper.ts
│ │ │ └── oauth-token.helper.ts
│ │ ├── messages/
│ │ │ ├── response.ts
│ │ │ └── templates.ts
│ │ ├── utility/
│ │ │ └── personality.ts
│ │ └── validators/
│ │ └── facial-verification-validator.ts
│ ├── common/ # Código compartido
│ │ ├── api-types.ts
│ │ ├── base-personality-helper.ts
│ │ ├── exceptions.ts
│ │ ├── http-status-codes.ts
│ │ ├── personality-checker.ts
│ │ ├── personality-types.ts
│ │ ├── route-builder.ts
│ │ ├── testing.routes.ts
│ │ ├── user-service.ts
│ │ └── validators/
│ │ └── base-validator.ts
│ ├── ticabank/ # Endpoints Ticabank (Lending)
│ │ ├── ticabank.routes.ts
│ │ ├── constants/
│ │ │ ├── api-codes.ts
│ │ │ └── parameters.ts
│ │ ├── entities/
│ │ │ ├── offer-dto.ts
│ │ │ ├── quote-dto.ts
│ │ │ └── simulate-dto.ts
│ │ ├── exceptions/
│ │ │ ├── ticabank-exception.ts
│ │ │ └── exception-builder.ts
│ │ ├── helpers/
│ │ │ ├── offer.helper.ts
│ │ │ ├── paydate.helper.ts
│ │ │ ├── quote.helper.ts
│ │ │ ├── register.helper.ts
│ │ │ └── simulate.helper.ts
│ │ ├── messages/
│ │ │ ├── response.ts
│ │ │ └── templates.ts
│ │ ├── support/
│ │ │ └── offer-calculator.ts
│ │ ├── utility/
│ │ │ └── personality.ts
│ │ └── validators/
│ │ ├── offer.validator.ts
│ │ ├── quote.validator.ts
│ │ └── simulate.validator.ts
│ ├── repository/ # Gestión de datos en memoria
│ │ └── user-repository.ts
│ └── types/
│ └── user-types.ts
├── test/ # Tests E2E con Jest
│ ├── atlas/
│ │ └── transfer.e2e-spec.ts
│ ├── cards/
│ │ ├── cards-detail.e2e-spec.ts
│ │ └── cards-list.e2e-spec.ts
│ ├── ciam/
│ │ ├── authentication.e2e-spec.ts
│ │ ├── biometry.e2e-spec.ts
│ │ ├── enrollment.e2e-spec.ts
│ │ ├── facial-identifiers.e2e-spec.ts
│ │ └── oauth.e2e-spec.ts
│ ├── ticabank/
│ │ ├── offer.e2e-spec.ts
│ │ ├── paydate.e2e-spec.ts
│ │ ├── quote.e2e-spec.ts
│ │ ├── register.e2e-spec.ts
│ │ └── simulate.e2e-spec.ts
│ ├── config/
│ │ └── test-config.ts
│ ├── helpers/
│ │ └── testing-endpoints.helper.ts
│ ├── scripts/
│ │ └── update-test-endpoints.cjs
│ ├── global-setup.ts
│ ├── jest.config.json # Configuración principal
│ ├── jest-atlas.json # Config Atlas
│ ├── jest-cards.json # Config Cards
│ ├── jest-ciam.json # Config CIAM
│ ├── jest-ticabank.json # Config Ticabank
│ ├── run-tests.sh # Script wrapper tests
│ └── start-server-and-test.sh
├── commitlint.config.cjs # Configuración commitlint
├── package.json
├── tsconfig.json
└── README.md
| Squad | Endpoints | Helpers | Validators | Excepciones | Tests E2E |
|---|---|---|---|---|---|
| Atlas | 1 | 1 | 1 | 2 | 6 tests |
| Cards | 3 | 3 | 3 | 2 | 12 tests |
| CIAM | 8 | 4 | 1 | 2 | 30 tests |
| Ticabank | 5 | 5 | 3 | 2 | 49 tests |
| Common | 2 | 3 | 1 | 1 | - |
| TOTAL | 19 | 16 | 9 | 9 | 97 tests |
| Squad | Archivos | Tests | Endpoints | Estado |
|---|---|---|---|---|
| Atlas | 1 | 6 | 1/1 | ✅ 100% |
| Cards | 2 | 12 | 3/3 | ✅ 100% |
| CIAM | 5 | 30 | 8/8 | ✅ 100% |
| Ticabank | 5 | 49 | 5/5 | ✅ 100% |
| TOTAL | 13 | 97 | 17/17 | ✅ 100% |
Todos los tests incluyen:
- ✅ Inicio automático del servidor con
AUTO_SEED=true - ✅ Espera hasta que el servidor esté listo
- ✅ Ejecución de los tests E2E
- ✅ Cierre automático del servidor al finalizar
- ✅ Identificación específica de usuario mediante header
X-User-Email
# Todos los módulos funcionan INDIVIDUALMENTE y AGRUPADOS al 100%
npm run test:ticabank # 49/49 ✅
npm run test:ciam # 30/30 ✅
npm run test:cards # 12/12 ✅
npm run test:atlas # 6/6 ✅
npm test # 97/97 ✅- Runtime: Node.js >= 18.0.0 + TypeScript 5.x
- Framework Web: Fastify 4.x (alta performance)
- Testing: Jest + Supertest (E2E tests)
- Data Storage: In-memory repository con seed YAML
- Git Workflow: Husky + Commitizen + Commitlint
- CI/CD: GitHub Actions (validación automática)
{
"fastify": "^4.x",
"typescript": "^5.x",
"jest": "^29.x",
"supertest": "^7.x",
"yaml": "^2.x"
}| Squad | Método | Endpoint | Descripción |
|---|---|---|---|
| Atlas | POST | /api-transfer-testing/v1/transfer |
Realizar transferencia |
| Cards | GET | /bs-card-v4/customer-management/product-service/v4/cards |
Listar tarjetas |
| Cards | GET | /bs-card-v4/customer-management/product-service/v4/cards/:id |
Detalle de tarjeta |
| Cards | PATCH | /bs-card-v4/customer-management/product-service/v4/cards/:id |
Actualizar configuración |
| CIAM | GET | /channel/ciam/mobile-login/v1/identification-methods |
Métodos de identificación v1 |
| CIAM | GET | /channel/ciam/mobile-login/v2/identification-methods |
Métodos de identificación v2 |
| CIAM | POST | /channel/ciam/mobile-login/v1/identification-methods/facial-verification |
Verificación facial v1 |
| CIAM | POST | /channel/ciam/mobile-login/v2/identification-methods/facial-verification |
Verificación facial v2 |
| CIAM | POST | /cas/oidc/accessToken |
Token OIDC |
| CIAM | POST | /auth/oauth/v2/token |
Token OAuth |
| CIAM | GET | /ux-biom-mobile-facial-overview-v1/channel/biom/v1/mobile-facial-overview/facial-identifiers |
Identificadores faciales |
| Ticabank | POST | /creditos-ticabank/sales/customer-offer/v1/lead/consultar |
Consultar oferta |
| Ticabank | GET | /creditos-ticabank/servicing/servicing-order/v1/simulacion/obtener-dias-pago |
Obtener días de pago |
| Ticabank | GET | /creditos-ticabank/servicing/servicing-order/v1/simulacion/generar |
Generar simulación |
| Ticabank | POST | /creditos-ticabank/servicing/servicing-order/v1/simulacion/cotizar |
Cotizar préstamo |
| Ticabank | POST | /creditos-ticabank/servicing/servicing-order/v1/orden-servicio/registrar |
Registrar orden |
| Testing | POST | /testing/ChangeUserPersonality |
Cambiar personality de usuario |
| Testing | GET | /testing/health |
Health check |
Base URL: http://localhost:5050
Health Check:
curl http://localhost:5050/testing/health
# Response: {"status":"OK","service":"fwk-api-mocks"}- Crear carpeta en
src/nuevo-squad/ - Crear helpers, validators, messages según patrón existente
- Agregar rutas en
src/app.ts - Crear carpeta
test/nuevo-squad/con tests E2E - Crear
test/jest-nuevo-squad.jsonconfiguración - Agregar script en
package.json:"test:nuevo-squad": "jest --config ./test/jest-nuevo-squad.json"
# Stage 1: Tests rápidos (unit/integration)
npm run test:ticabank:personalities
# Stage 2: Tests de negocio
npm run test:ciam
npm run test:ticabank
# Stage 3: Tests completos (pre-deploy)
npm test- CIAM Endpoints - Documentación detallada de endpoints CIAM
- Ticabank Endpoints - Documentación detallada de endpoints Ticabank
- Personalities - Guía de personalities para testing
-
Fork y clonar el repositorio
git clone https://github.com/elferjarenas/fwk-api-mocks.git cd fwk-api-mocks npm install -
Crear branch desde
maingit checkout -b feat/nueva-funcionalidad
-
Desarrollar con TDD (Test-Driven Development)
- Escribir tests primero en
test/<squad>/ - Implementar código en
src/<squad>/ - Verificar que pasen:
npm run test:<squad>
- Escribir tests primero en
-
Hacer commits con Commitizen
npm run commit # o git add . && npm run commit
-
Verificar que todos los tests pasen
npm test # Debe ser 97/97 ✅
-
Push y Pull Request
git push origin feat/nueva-funcionalidad
Para agregar un nuevo módulo (ej: pagos):
-
Crear estructura de carpetas:
mkdir -p src/pagos/{helpers,validators,exceptions,messages,entities,constants} -
Crear archivo de rutas:
src/pagos/pagos.routes.tsimport type { FastifyInstance } from 'fastify'; import { RouteBuilder } from '../common/route-builder.js'; export function registerPagosRoutes(fastify: FastifyInstance) { const builder = new RouteBuilder(fastify); builder.post('/api/pagos/v1/realizar', async (body, request) => { // Implementación }); }
-
Registrar rutas en
src/app.ts:import { registerPagosRoutes } from './pagos/pagos.routes.js'; // En setupRoutes() registerPagosRoutes(fastify);
-
Crear tests:
test/pagos/pago.e2e-spec.ts -
Configuración Jest:
test/jest-pagos.json{ "displayName": "Pagos E2E Tests", "rootDir": "../", "testMatch": ["<rootDir>/test/pagos/**/*.e2e-spec.ts"] } -
Agregar scripts en
package.json:{ "test:pagos": "./test/run-tests.sh pagos" }
- Nombres de archivos: kebab-case (ej:
offer-calculator.ts) - Clases: PascalCase (ej:
OfferHelper) - Funciones: camelCase (ej:
calculateOffer()) - Constantes: UPPER_SNAKE_CASE (ej:
MAX_RETRIES) - Interfaces: PascalCase con sufijo (ej:
OfferDto,ValidationError)
Todos los commits y pushes son validados automáticamente:
- ✅ commit-msg: Valida formato de commit (commitlint)
- ✅ pre-push: Ejecuta
npm test(97 tests) - ✅ GitHub Actions: Validación en servidor al hacer PR
Este proyecto es de uso personal para Testing.
Mantenido por: Squad de Testing
Repositorio: github.com/elferjarenas/fwk-api-mocks
Última actualización: Junio 2026