[
  {
    "iterationIndex": 0,
    "results": [
      {
        "test": {
          "filename": "scenarios\\01-health.bru"
        },
        "request": {
          "method": "GET",
          "url": "http://127.0.0.1:8516/health",
          "headers": {
            "Accept": "application/json, text/plain, */*",
            "User-Agent": "bruno-runtime/4.3.0",
            "Accept-Encoding": "gzip, compress, deflate, br",
            "Host": "127.0.0.1:8516",
            "Connection": "keep-alive",
            "content-type": null
          }
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "headers": {
            "content-type": "application/json; charset=utf-8",
            "cache-control": "no-store",
            "x-workshop": "Bruno",
            "date": "Fri, 13 Nov 2026 08:57:43 GMT",
            "connection": "keep-alive",
            "keep-alive": "timeout=5",
            "transfer-encoding": "chunked"
          },
          "data": {
            "status": "ok",
            "service": "bruno-demo",
            "version": 1,
            "fixture": true
          },
          "url": "http://127.0.0.1/health",
          "responseTime": 10,
          "duration": 10,
          "size": 65
        },
        "error": null,
        "status": "pass",
        "assertionResults": [
          {
            "uid": "SuKrUaT5q2A-vi8erBHFH",
            "lhsExpr": "res.status",
            "rhsExpr": "eq 200",
            "rhsOperand": "200",
            "operator": "eq",
            "status": "pass"
          },
          {
            "uid": "AaSLpiyBfyXtvklElZ5bX",
            "lhsExpr": "res.body.status",
            "rhsExpr": "eq ok",
            "rhsOperand": "ok",
            "operator": "eq",
            "status": "pass"
          }
        ],
        "testResults": [
          {
            "description": "Health returns 200",
            "status": "pass",
            "uid": "cOgDYKIZko0Ux8SbwBf6y"
          },
          {
            "description": "Service identity is stable",
            "status": "pass",
            "uid": "PyPvjVkMtD5rI968WiqoE"
          },
          {
            "description": "Version is a number",
            "status": "pass",
            "uid": "XCGGfkzPaScXv8-JaoIBI"
          }
        ],
        "preRequestTestResults": [],
        "postResponseTestResults": [],
        "shouldStopRunnerExecution": false,
        "runDuration": 0.1556717,
        "name": "01 · Health и контракт",
        "suitename": "scenarios/01-health",
        "path": "scenarios\\01-health",
        "iterationIndex": 0
      },
      {
        "test": {
          "filename": "scenarios\\02-pagination.bru"
        },
        "request": {
          "method": "GET",
          "url": "http://127.0.0.1:8516/services?page=2&limit=2&active=true",
          "headers": {
            "Accept": "application/json, text/plain, */*",
            "User-Agent": "bruno-runtime/4.3.0",
            "Accept-Encoding": "gzip, compress, deflate, br",
            "Host": "127.0.0.1:8516",
            "Connection": "keep-alive",
            "content-type": null
          }
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "headers": {
            "content-type": "application/json; charset=utf-8",
            "cache-control": "no-store",
            "x-workshop": "Bruno",
            "date": "Fri, 13 Nov 2026 08:57:43 GMT",
            "connection": "keep-alive",
            "keep-alive": "timeout=5",
            "transfer-encoding": "chunked"
          },
          "data": {
            "items": [
              {
                "id": 4,
                "title": "Проверка отчётов",
                "active": true,
                "price": 7000
              },
              {
                "id": 5,
                "title": "Импорт каталога",
                "active": true,
                "price": 11000
              }
            ],
            "page": 2,
            "limit": 2,
            "total": 4
          },
          "url": "http://127.0.0.1/services?page=2&limit=2&active=true",
          "responseTime": 2,
          "duration": 2,
          "size": 195
        },
        "error": null,
        "status": "pass",
        "assertionResults": [],
        "testResults": [
          {
            "description": "Pagination returns 200",
            "status": "pass",
            "uid": "8_73yRvHHtD4PpQXnxOAZ"
          },
          {
            "description": "Second active page has IDs4and5",
            "status": "pass",
            "uid": "mWe62ov5K3jZ49icgV4n_"
          },
          {
            "description": "Total is4active services",
            "status": "pass",
            "uid": "7mK_TzcjHRDXSecug0iFS"
          }
        ],
        "preRequestTestResults": [],
        "postResponseTestResults": [],
        "shouldStopRunnerExecution": false,
        "runDuration": 0.0702424,
        "name": "02 · Параметры и пагинация",
        "suitename": "scenarios/02-pagination",
        "path": "scenarios\\02-pagination",
        "iterationIndex": 0
      },
      {
        "test": {
          "filename": "scenarios\\03-create.bru"
        },
        "request": {
          "method": "POST",
          "url": "http://127.0.0.1:8516/orders",
          "headers": {
            "Accept": "application/json, text/plain, */*",
            "User-Agent": "bruno-runtime/4.3.0",
            "Content-Length": "59",
            "Accept-Encoding": "gzip, compress, deflate, br",
            "Host": "127.0.0.1:8516",
            "Connection": "keep-alive",
            "content-type": "application/json"
          },
          "data": "{\"customer\":\"Учебная компания\",\"quantity\":3}"
        },
        "response": {
          "status": 201,
          "statusText": "Created",
          "headers": {
            "content-type": "application/json; charset=utf-8",
            "cache-control": "no-store",
            "x-workshop": "Bruno",
            "location": "/orders/100",
            "date": "Fri, 13 Nov 2026 08:57:43 GMT",
            "connection": "keep-alive",
            "keep-alive": "timeout=5",
            "transfer-encoding": "chunked"
          },
          "data": {
            "id": 100,
            "customer": "Учебная компания",
            "quantity": 3,
            "status": "draft",
            "fixture": true
          },
          "url": "http://127.0.0.1/orders",
          "responseTime": 3,
          "duration": 3,
          "size": 100
        },
        "error": null,
        "status": "pass",
        "assertionResults": [],
        "testResults": [
          {
            "description": "Create returns 201",
            "status": "pass",
            "uid": "UfrQlq37ysW_OGnHNoZGZ"
          },
          {
            "description": "ID saved for next request",
            "status": "pass",
            "uid": "CG6uP7HYygUSPBOfizSjk"
          },
          {
            "description": "Quantity is preserved",
            "status": "pass",
            "uid": "5k3f3j8D53NLPvws_tDXd"
          }
        ],
        "preRequestTestResults": [],
        "postResponseTestResults": [],
        "shouldStopRunnerExecution": false,
        "runDuration": 0.1389266,
        "name": "03 · Создать заявку из JSON",
        "suitename": "scenarios/03-create",
        "path": "scenarios\\03-create",
        "iterationIndex": 0
      },
      {
        "test": {
          "filename": "scenarios\\04-read-created.bru"
        },
        "request": {
          "method": "GET",
          "url": "http://127.0.0.1:8516/orders/100",
          "headers": {
            "Accept": "application/json, text/plain, */*",
            "User-Agent": "bruno-runtime/4.3.0",
            "Accept-Encoding": "gzip, compress, deflate, br",
            "Host": "127.0.0.1:8516",
            "Connection": "keep-alive",
            "content-type": null
          }
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "headers": {
            "content-type": "application/json; charset=utf-8",
            "cache-control": "no-store",
            "x-workshop": "Bruno",
            "date": "Fri, 13 Nov 2026 08:57:43 GMT",
            "connection": "keep-alive",
            "keep-alive": "timeout=5",
            "transfer-encoding": "chunked"
          },
          "data": {
            "id": 100,
            "customer": "Учебная компания",
            "quantity": 3,
            "status": "draft",
            "fixture": true
          },
          "url": "http://127.0.0.1/orders/100",
          "responseTime": 1,
          "duration": 1,
          "size": 100
        },
        "error": null,
        "status": "pass",
        "assertionResults": [],
        "testResults": [
          {
            "description": "Created order can be read",
            "status": "pass",
            "uid": "ah-sIaCUtkMebaOPRkxOx"
          },
          {
            "description": "Read ID matches runtime variable",
            "status": "pass",
            "uid": "hvIawktscA0NNO2XgOyL1"
          },
          {
            "description": "Order remains a draft",
            "status": "pass",
            "uid": "94a7R66DULQ_1kHILiuYp"
          }
        ],
        "preRequestTestResults": [],
        "postResponseTestResults": [],
        "shouldStopRunnerExecution": false,
        "runDuration": 0.0610255,
        "name": "04 · Цепочка по ID из ответа",
        "suitename": "scenarios/04-read-created",
        "path": "scenarios\\04-read-created",
        "iterationIndex": 0
      },
      {
        "test": {
          "filename": "scenarios\\05-validation.bru"
        },
        "request": {
          "method": "POST",
          "url": "http://127.0.0.1:8516/orders",
          "headers": {
            "Accept": "application/json, text/plain, */*",
            "User-Agent": "bruno-runtime/4.3.0",
            "Content-Length": "28",
            "Accept-Encoding": "gzip, compress, deflate, br",
            "Host": "127.0.0.1:8516",
            "Connection": "keep-alive",
            "content-type": "application/json"
          },
          "data": "{\"customer\":\"\",\"quantity\":0}"
        },
        "response": {
          "status": 422,
          "statusText": "Unprocessable Entity",
          "headers": {
            "content-type": "application/json; charset=utf-8",
            "cache-control": "no-store",
            "x-workshop": "Bruno",
            "date": "Fri, 13 Nov 2026 08:57:43 GMT",
            "connection": "keep-alive",
            "keep-alive": "timeout=5",
            "transfer-encoding": "chunked"
          },
          "data": {
            "error": "validation",
            "fields": {
              "customer": "Укажите имя от 2 до 80 символов",
              "quantity": "Количество от 1 до 10"
            }
          },
          "url": "http://127.0.0.1/orders",
          "responseTime": 2,
          "duration": 2,
          "size": 149
        },
        "error": null,
        "status": "pass",
        "assertionResults": [],
        "testResults": [
          {
            "description": "Invalid input returns422",
            "status": "pass",
            "uid": "7OnnMGFGO8PYe7gqS1Vsd"
          },
          {
            "description": "Customer error is useful",
            "status": "pass",
            "uid": "gNsF_Zj9ZhLKezomTQlOI"
          },
          {
            "description": "Quantity error is present",
            "status": "pass",
            "uid": "cqI5aQX2UQ4tIZzqg6Gso"
          }
        ],
        "preRequestTestResults": [],
        "postResponseTestResults": [],
        "shouldStopRunnerExecution": false,
        "runDuration": 0.0546344,
        "name": "05 · Ошибки полей422",
        "suitename": "scenarios/05-validation",
        "path": "scenarios\\05-validation",
        "iterationIndex": 0
      },
      {
        "test": {
          "filename": "scenarios\\06a-unauthorized.bru"
        },
        "request": {
          "method": "GET",
          "url": "http://127.0.0.1:8516/private",
          "headers": {
            "Accept": "application/json, text/plain, */*",
            "User-Agent": "bruno-runtime/4.3.0",
            "Accept-Encoding": "gzip, compress, deflate, br",
            "Host": "127.0.0.1:8516",
            "Connection": "keep-alive",
            "content-type": null
          }
        },
        "response": {
          "status": 401,
          "statusText": "Unauthorized",
          "headers": {
            "content-type": "application/json; charset=utf-8",
            "cache-control": "no-store",
            "x-workshop": "Bruno",
            "www-authenticate": "********",
            "date": "Fri, 13 Nov 2026 08:57:43 GMT",
            "connection": "keep-alive",
            "keep-alive": "timeout=5",
            "transfer-encoding": "chunked"
          },
          "data": {
            "error": "unauthorized"
          },
          "url": "http://127.0.0.1/private",
          "responseTime": 1,
          "duration": 1,
          "size": 24
        },
        "error": null,
        "status": "pass",
        "assertionResults": [],
        "testResults": [
          {
            "description": "Protected endpoint refuses missing token",
            "status": "pass",
            "uid": "Xb5N9lN_N-OgEfaq0_gWD"
          },
          {
            "description": "Authentication error is explicit",
            "status": "pass",
            "uid": "7qPF9T6xPPF_hDFl0T8Fn"
          }
        ],
        "preRequestTestResults": [],
        "postResponseTestResults": [],
        "shouldStopRunnerExecution": false,
        "runDuration": 0.0685797,
        "name": "06a · Нет токена401",
        "suitename": "scenarios/06a-unauthorized",
        "path": "scenarios\\06a-unauthorized",
        "iterationIndex": 0
      },
      {
        "test": {
          "filename": "scenarios\\06b-demo-session.bru"
        },
        "request": {
          "method": "POST",
          "url": "http://127.0.0.1:8516/session",
          "headers": {
            "Accept": "application/json, text/plain, */*",
            "User-Agent": "bruno-runtime/4.3.0",
            "Content-Length": "46",
            "Accept-Encoding": "gzip, compress, deflate, br",
            "Host": "127.0.0.1:8516",
            "Connection": "keep-alive",
            "content-type": "application/json"
          },
          "data": "{\"username\":\"demo\",\"password\":\"workshop-only\"}"
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "headers": {
            "content-type": "application/json; charset=utf-8",
            "cache-control": "no-store",
            "x-workshop": "Bruno",
            "date": "Fri, 13 Nov 2026 08:57:43 GMT",
            "connection": "keep-alive",
            "keep-alive": "timeout=5",
            "transfer-encoding": "chunked"
          },
          "data": {
            "accessToken": "aen-demo-token-not-a-secret",
            "tokenType": "Bearer",
            "scope": "demo:read",
            "fixture": true
          },
          "url": "http://127.0.0.1/session",
          "responseTime": 1,
          "duration": 1,
          "size": 101
        },
        "error": null,
        "status": "pass",
        "assertionResults": [],
        "testResults": [
          {
            "description": "Demo session returns200",
            "status": "pass",
            "uid": "v6yklj0WxQbL_PKbxctCY"
          },
          {
            "description": "Runtime demo token exists",
            "status": "pass",
            "uid": "73v0YUwffr2VW0M2R8t2o"
          }
        ],
        "preRequestTestResults": [],
        "postResponseTestResults": [],
        "shouldStopRunnerExecution": false,
        "runDuration": 0.1095389,
        "name": "06b · Учебная сессия",
        "suitename": "scenarios/06b-demo-session",
        "path": "scenarios\\06b-demo-session",
        "iterationIndex": 0
      },
      {
        "test": {
          "filename": "scenarios\\06c-authorized.bru"
        },
        "request": {
          "method": "GET",
          "url": "http://127.0.0.1:8516/private",
          "headers": {
            "Accept": "application/json, text/plain, */*",
            "User-Agent": "bruno-runtime/4.3.0",
            "Accept-Encoding": "gzip, compress, deflate, br",
            "Host": "127.0.0.1:8516",
            "Connection": "keep-alive",
            "Authorization": "Bearer ********",
            "content-type": null
          }
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "headers": {
            "content-type": "application/json; charset=utf-8",
            "cache-control": "no-store",
            "x-workshop": "Bruno",
            "date": "Fri, 13 Nov 2026 08:57:43 GMT",
            "connection": "keep-alive",
            "keep-alive": "timeout=5",
            "transfer-encoding": "chunked"
          },
          "data": {
            "user": "demo",
            "permissions": [
              "demo:read"
            ],
            "fixture": true
          },
          "url": "http://127.0.0.1/private",
          "responseTime": 1,
          "duration": 1,
          "size": 58
        },
        "error": null,
        "status": "pass",
        "assertionResults": [],
        "testResults": [
          {
            "description": "Demo Bearer opens endpoint",
            "status": "pass",
            "uid": "Prl1_wMWHKNkSwt_sK0sJ"
          },
          {
            "description": "Permission matches demo scope",
            "status": "pass",
            "uid": "dNkCJ1NavVupjxKj-W7ru"
          }
        ],
        "preRequestTestResults": [],
        "postResponseTestResults": [],
        "shouldStopRunnerExecution": false,
        "runDuration": 0.0621028,
        "name": "06c · Bearer из предыдущего ответа",
        "suitename": "scenarios/06c-authorized",
        "path": "scenarios\\06c-authorized",
        "iterationIndex": 0
      },
      {
        "test": {
          "filename": "scenarios\\07-rate-limit.bru"
        },
        "request": {
          "method": "GET",
          "url": "http://127.0.0.1:8516/rate-limited",
          "headers": {
            "Accept": "application/json, text/plain, */*",
            "User-Agent": "bruno-runtime/4.3.0",
            "Accept-Encoding": "gzip, compress, deflate, br",
            "Host": "127.0.0.1:8516",
            "Connection": "keep-alive",
            "content-type": null
          }
        },
        "response": {
          "status": 429,
          "statusText": "Too Many Requests",
          "headers": {
            "content-type": "application/json; charset=utf-8",
            "cache-control": "no-store",
            "x-workshop": "Bruno",
            "retry-after": "2",
            "date": "Fri, 13 Nov 2026 08:57:43 GMT",
            "connection": "keep-alive",
            "keep-alive": "timeout=5",
            "transfer-encoding": "chunked"
          },
          "data": {
            "error": "rate_limit",
            "retryAfterSeconds": 2,
            "fixture": true
          },
          "url": "http://127.0.0.1/rate-limited",
          "responseTime": 1,
          "duration": 1,
          "size": 59
        },
        "error": null,
        "status": "pass",
        "assertionResults": [],
        "testResults": [
          {
            "description": "Rate limited response is429",
            "status": "pass",
            "uid": "L5zBFGB83ohqAa28uSuBP"
          },
          {
            "description": "Retry-After is two seconds",
            "status": "pass",
            "uid": "JZaLrUAFBeNcxOmLAwW2L"
          },
          {
            "description": "Error is machine readable",
            "status": "pass",
            "uid": "BklPmteWG-ZHdJrMyFNRl"
          }
        ],
        "preRequestTestResults": [],
        "postResponseTestResults": [],
        "shouldStopRunnerExecution": false,
        "runDuration": 0.0608742,
        "name": "07 · Rate limit и Retry-After",
        "suitename": "scenarios/07-rate-limit",
        "path": "scenarios\\07-rate-limit",
        "iterationIndex": 0
      },
      {
        "test": {
          "filename": "scenarios\\08-contract-fixed.bru"
        },
        "request": {
          "method": "GET",
          "url": "http://127.0.0.1:8516/contract",
          "headers": {
            "Accept": "application/json, text/plain, */*",
            "User-Agent": "bruno-runtime/4.3.0",
            "Accept-Encoding": "gzip, compress, deflate, br",
            "Host": "127.0.0.1:8516",
            "Connection": "keep-alive",
            "content-type": null
          }
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "headers": {
            "content-type": "application/json; charset=utf-8",
            "cache-control": "no-store",
            "x-workshop": "Bruno",
            "date": "Fri, 13 Nov 2026 08:57:43 GMT",
            "connection": "keep-alive",
            "keep-alive": "timeout=5",
            "transfer-encoding": "chunked"
          },
          "data": {
            "status": "ready",
            "total": 42,
            "fixture": true
          },
          "url": "http://127.0.0.1/contract",
          "responseTime": 1,
          "duration": 1,
          "size": 44
        },
        "error": null,
        "status": "pass",
        "assertionResults": [],
        "testResults": [
          {
            "description": "Contract returns200",
            "status": "pass",
            "uid": "Vk2pVmuiJQ1-64F0-hID_"
          },
          {
            "description": "Total matches agreed contract",
            "status": "pass",
            "uid": "4RxzFebnb-6HGIMVgQFM_"
          }
        ],
        "preRequestTestResults": [],
        "postResponseTestResults": [],
        "shouldStopRunnerExecution": false,
        "runDuration": 0.0609643,
        "name": "08 · Исправленная проверка контракта",
        "suitename": "scenarios/08-contract-fixed",
        "path": "scenarios\\08-contract-fixed",
        "iterationIndex": 0
      }
    ],
    "summary": {
      "totalRequests": 10,
      "passedRequests": 10,
      "failedRequests": 0,
      "errorRequests": 0,
      "skippedRequests": 0,
      "skippedByBail": 0,
      "totalAssertions": 2,
      "passedAssertions": 2,
      "failedAssertions": 0,
      "totalTests": 26,
      "passedTests": 26,
      "failedTests": 0,
      "totalPreRequestTests": 0,
      "passedPreRequestTests": 0,
      "failedPreRequestTests": 0,
      "totalPostResponseTests": 0,
      "passedPostResponseTests": 0,
      "failedPostResponseTests": 0
    }
  }
]
