{
  "info": {
    "_postman_id": "90d0890b-f12f-4f7e-9689-042ee571f667",
    "name": "FactrAPI | Pruebas seguras",
    "description": "Comprobaciones de salud y consultas de solo lectura para FactrAPI. Configura una API key de pruebas o certificación antes de ejecutar las solicitudes protegidas. Esta colección no crea documentos, consume e-NCF ni envía operaciones a la DGII.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    { "key": "baseUrl", "value": "http://localhost:3000", "type": "string" },
    { "key": "apiKey", "value": "", "type": "string" },
    { "key": "opsToken", "value": "", "type": "string" },
    { "key": "correlationId", "value": "postman-factrapi-prueba", "type": "string" }
  ],
  "item": [
    {
      "name": "01 · Salud y documentación",
      "item": [
        {
          "name": "Comprobar que la API está activa",
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/health", "host": ["{{baseUrl}}"], "path": ["health"] },
            "description": "Comprobación pública de vida del proceso. No requiere API key."
          },
          "event": [{
            "listen": "test",
            "script": {
              "type": "text/javascript",
              "exec": [
                "pm.test('Responde HTTP 200', function () { pm.response.to.have.status(200); });",
                "pm.test('El proceso indica estado ok', function () { pm.expect(pm.response.json().status).to.eql('ok'); });"
              ]
            }
          }]
        },
        {
          "name": "Comprobar dependencias listas",
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/ready", "host": ["{{baseUrl}}"], "path": ["ready"] },
            "description": "Comprueba PostgreSQL, Redis y almacenamiento. Un 503 indica qué dependencia no está disponible."
          },
          "event": [{
            "listen": "test",
            "script": {
              "type": "text/javascript",
              "exec": [
                "pm.test('Responde HTTP 200', function () { pm.response.to.have.status(200); });",
                "pm.test('Las dependencias están listas', function () { var body = pm.response.json(); pm.expect(body.status).to.eql('ready'); pm.expect(body.checks).to.be.an('object'); });"
              ]
            }
          }]
        },
        {
          "name": "Consultar contrato OpenAPI (desarrollo)",
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/docs-json", "host": ["{{baseUrl}}"], "path": ["docs-json"] },
            "description": "Disponible en desarrollo. En producción requiere OPENAPI_ENABLED=true."
          },
          "event": [{
            "listen": "test",
            "script": {
              "type": "text/javascript",
              "exec": [
                "pm.test('Responde HTTP 200', function () { pm.response.to.have.status(200); });",
                "pm.test('Incluye rutas OpenAPI', function () { var body = pm.response.json(); pm.expect(body.openapi).to.be.a('string'); pm.expect(body.paths).to.be.an('object'); });"
              ]
            }
          }]
        }
      ]
    },
    {
      "name": "02 · Consultas con API key",
      "item": [
        {
          "name": "Consultar empresa y permisos de la clave",
          "request": {
            "method": "GET",
            "header": [
              { "key": "x-api-key", "value": "{{apiKey}}", "type": "text" },
              { "key": "X-Correlation-ID", "value": "{{correlationId}}", "type": "text" }
            ],
            "url": { "raw": "{{baseUrl}}/api/v1/empresa", "host": ["{{baseUrl}}"], "path": ["api", "v1", "empresa"] },
            "description": "Requiere una API key de prueba o certificación. Devuelve la empresa asociada, el ambiente y los scopes de la clave."
          },
          "event": [{
            "listen": "test",
            "script": {
              "type": "text/javascript",
              "exec": [
                "pm.test('Responde HTTP 200', function () { pm.response.to.have.status(200); });",
                "pm.test('Incluye datos y metadatos de FactrAPI', function () { var body = pm.response.json(); pm.expect(body.data).to.be.an('object'); pm.expect(body.data.company).to.be.an('object'); pm.expect(body.data.apiKey).to.be.an('object'); pm.expect(body.meta.correlationId).to.be.a('string'); });"
              ]
            }
          }]
        },
        {
          "name": "Listar tipos de catálogos DGII",
          "request": {
            "method": "GET",
            "header": [
              { "key": "x-api-key", "value": "{{apiKey}}", "type": "text" },
              { "key": "X-Correlation-ID", "value": "{{correlationId}}", "type": "text" }
            ],
            "url": { "raw": "{{baseUrl}}/api/v1/catalogos", "host": ["{{baseUrl}}"], "path": ["api", "v1", "catalogos"] },
            "description": "Requiere el scope documents:read. Es una consulta de solo lectura."
          },
          "event": [{
            "listen": "test",
            "script": {
              "type": "text/javascript",
              "exec": [
                "pm.test('Responde HTTP 200', function () { pm.response.to.have.status(200); });",
                "pm.test('Devuelve la envoltura estándar', function () { var body = pm.response.json(); pm.expect(body.data).to.exist; pm.expect(body.meta.timestamp).to.be.a('string'); });"
              ]
            }
          }]
        },
        {
          "name": "Listar documentos recientes",
          "request": {
            "method": "GET",
            "header": [
              { "key": "x-api-key", "value": "{{apiKey}}", "type": "text" },
              { "key": "X-Correlation-ID", "value": "{{correlationId}}", "type": "text" }
            ],
            "url": { "raw": "{{baseUrl}}/api/v1/documentos?limit=10", "host": ["{{baseUrl}}"], "path": ["api", "v1", "documentos"], "query": [{ "key": "limit", "value": "10" }] },
            "description": "Requiere el scope documents:read. Solo consulta documentos de la empresa de la API key."
          },
          "event": [{
            "listen": "test",
            "script": {
              "type": "text/javascript",
              "exec": [
                "pm.test('Responde HTTP 200', function () { pm.response.to.have.status(200); });",
                "pm.test('Devuelve una lista paginada', function () { var body = pm.response.json(); pm.expect(body.data.items).to.be.an('array'); pm.expect(body.data).to.have.property('nextCursor'); });"
              ]
            }
          }]
        },
        {
          "name": "Consultar salud de la DGII (operaciones)",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Authorization", "value": "Bearer {{opsToken}}", "type": "text" },
              { "key": "X-Correlation-ID", "value": "{{correlationId}}", "type": "text" }
            ],
            "url": { "raw": "{{baseUrl}}/internal/health/dgii", "host": ["{{baseUrl}}"], "path": ["internal", "health", "dgii"] },
            "description": "Requiere OPS_TOKEN. Consulta la conectividad DGII por ambiente; no envía documentos."
          },
          "event": [{
            "listen": "test",
            "script": {
              "type": "text/javascript",
              "exec": [
                "pm.test('Responde HTTP 200', function () { pm.response.to.have.status(200); });",
                "pm.test('Incluye el estado de los ambientes', function () { var body = pm.response.json(); pm.expect(body.status).to.be.oneOf(['UP', 'DEGRADED', 'DOWN']); pm.expect(body.environments).to.be.an('array'); });"
              ]
            }
          }]
        }
      ]
    }
  ]
}
