Saltar a contenido

Configuración de WireMock

Descripción

WireMock es un servicio de mock para APIs que permite simular endpoints HTTP durante el desarrollo y testing. Incluye una interfaz gráfica para gestionar los mocks de manera visual.

Configuración en Docker Compose

wiremock:
  image: holomekc/wiremock-gui
  container_name: wiremock
  ports:
    - "8080:8080"
  volumes:
    - ./wiremock/mappings:/home/wiremock/mappings
    - ./wiremock/__files:/home/wiremock/__files
  command: ["--verbose", "--global-response-templating"]
  environment:
    VIRTUAL_HOST: wiremock.seekdev.com
    VIRTUAL_PORT: 8080
    LETSENCRYPT_HOST: wiremock.seekdev.com
    LETSENCRYPT_EMAIL: jgarcia@seek.pe

Acceso

Estructura de Archivos

wiremock/
├── mappings/          # Definiciones de mocks
│   ├── api-users.json
│   └── api-products.json
└── __files/          # Archivos de respuesta
    ├── users.json
    └── products.json

Creación de Mocks

Ejemplo de Mapping

{
  "request": {
    "method": "GET",
    "url": "/api/users"
  },
  "response": {
    "status": 200,
    "headers": {
      "Content-Type": "application/json"
    },
    "bodyFileName": "users.json"
  }
}

Respuesta con Template

{
  "request": {
    "method": "POST",
    "url": "/api/users",
    "bodyPatterns": [
      {
        "matchesJsonPath": "$.name"
      }
    ]
  },
  "response": {
    "status": 201,
    "headers": {
      "Content-Type": "application/json"
    },
    "jsonBody": {
      "id": "{{randomValue length=8 type='ALPHANUMERIC'}}",
      "name": "{{jsonPath request.body '$.name'}}",
      "created": "{{now format='yyyy-MM-dd'}}"
    }
  }
}

Uso en Desarrollo

Configuración de Cliente

// Configuración para desarrollo
const API_BASE_URL = process.env.NODE_ENV === 'development' 
  ? 'https://wiremock.seekdev.com' 
  : 'https://api.production.com';

Testing

// Ejemplo con Jest
describe('User API', () => {
  beforeEach(() => {
    // Configurar WireMock para el test
    fetch('https://wiremock.seekdev.com/__admin/mappings', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(mockMapping)
    });
  });

  test('should create user', async () => {
    const response = await fetch(`${API_BASE_URL}/api/users`, {
      method: 'POST',
      body: JSON.stringify({ name: 'John Doe' })
    });
    expect(response.status).toBe(201);
  });
});

Características Avanzadas

Response Templating

WireMock soporta templates para respuestas dinámicas:

  • {{randomValue}}: Valores aleatorios
  • {{now}}: Fechas y horas
  • {{jsonPath}}: Extracción de datos del request
  • {{request}}: Acceso a datos del request

Scenarios

{
  "scenarioName": "User Creation Flow",
  "requiredScenarioState": "Started",
  "newScenarioState": "User Created",
  "request": {
    "method": "POST",
    "url": "/api/users"
  },
  "response": {
    "status": 201,
    "jsonBody": {
      "message": "User created successfully"
    }
  }
}

Monitoreo

WireMock está integrado con el stack de monitoreo:

  • Logs: Disponibles en el contenedor
  • Métricas: HTTP requests y responses
  • Alertas: Para fallos en el servicio

Mejores Prácticas

  1. Organización: Mantener mappings organizados por dominio
  2. Documentación: Documentar cada mock con su propósito
  3. Versionado: Mantener versiones de los mappings
  4. Testing: Validar que los mocks funcionan correctamente
  5. Cleanup: Limpiar mocks no utilizados