{
  "stats": {
    "suites": 248,
    "tests": 744,
    "passes": 744,
    "pending": 0,
    "failures": 0,
    "start": "2020-06-21T18:10:18.827Z",
    "end": "2020-06-21T18:12:31.086Z",
    "duration": 132259,
    "testsRegistered": 744,
    "passPercent": 100,
    "pendingPercent": 0,
    "other": 0,
    "hasOther": false,
    "skipped": 0,
    "hasSkipped": false,
    "passPercentClass": "success",
    "pendingPercentClass": "danger"
  },
  "suites": {
    "uuid": "8995d97c-05d7-40a3-a779-1712473a4c68",
    "title": "",
    "fullFile": "",
    "file": "",
    "beforeHooks": [],
    "afterHooks": [],
    "tests": [],
    "suites": [
      {
        "uuid": "857fa333-ae3b-4191-9edc-9d3804c1a1a8",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "b57c5a73-11f3-42da-95f6-471545185839",
            "title": "> [bibox] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bibox-test.js",
            "file": "/test/generated/bibox-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bibox] connect",
                "fullTitle": " > [bibox] without API keys > [bibox] connect",
                "timedOut": false,
                "duration": 334,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "61fdacc2-2213-4752-97f5-1e2f2bb6166e",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bibox] markets",
                "fullTitle": " > [bibox] without API keys > [bibox] markets",
                "timedOut": false,
                "duration": 792,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ab7e4108-7202-4533-8d8e-f73aaaff6a28",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bibox] ticker",
                "fullTitle": " > [bibox] without API keys > [bibox] ticker",
                "timedOut": false,
                "duration": 37,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "cc42085c-49f5-4898-ab8c-2e2dacead0ff",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bibox] tickers",
                "fullTitle": " > [bibox] without API keys > [bibox] tickers",
                "timedOut": false,
                "duration": 1626,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "4cf12567-2701-49eb-8abf-0f5284a2b8a4",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bibox] orderBook",
                "fullTitle": " > [bibox] without API keys > [bibox] orderBook",
                "timedOut": false,
                "duration": 26,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "54f5346a-df9a-41ad-9bf4-2b4bc19d7f60",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bibox] trades",
                "fullTitle": " > [bibox] without API keys > [bibox] trades",
                "timedOut": false,
                "duration": 17,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "eeee0fe6-9d79-4372-a761-c28194c765fb",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "61fdacc2-2213-4752-97f5-1e2f2bb6166e",
              "ab7e4108-7202-4533-8d8e-f73aaaff6a28",
              "cc42085c-49f5-4898-ab8c-2e2dacead0ff",
              "4cf12567-2701-49eb-8abf-0f5284a2b8a4",
              "54f5346a-df9a-41ad-9bf4-2b4bc19d7f60",
              "eeee0fe6-9d79-4372-a761-c28194c765fb"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 2832,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "5c074f2a-7dca-417a-928b-39f240e025d1",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "a1f0b883-ce88-4169-9827-486050945288",
            "title": "> [binanceje] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/binanceje-test.js",
            "file": "/test/generated/binanceje-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [binanceje] connect",
                "fullTitle": " > [binanceje] without API keys > [binanceje] connect",
                "timedOut": false,
                "duration": 187,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a2fc4fec-d352-49aa-9ac9-a07163b400ed",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [binanceje] markets",
                "fullTitle": " > [binanceje] without API keys > [binanceje] markets",
                "timedOut": false,
                "duration": 619,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1a78b2fb-e369-44c1-b803-79fe7c81a876",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [binanceje] ticker",
                "fullTitle": " > [binanceje] without API keys > [binanceje] ticker",
                "timedOut": false,
                "duration": 725,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0be32d12-f80f-438b-88d5-27fd93a06879",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [binanceje] tickers",
                "fullTitle": " > [binanceje] without API keys > [binanceje] tickers",
                "timedOut": false,
                "duration": 726,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "39055945-6e0e-4b35-a72d-12073e231fbb",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [binanceje] orderBook",
                "fullTitle": " > [binanceje] without API keys > [binanceje] orderBook",
                "timedOut": false,
                "duration": 484,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0515b508-f16c-4a34-a90a-ff64040b5662",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [binanceje] trades",
                "fullTitle": " > [binanceje] without API keys > [binanceje] trades",
                "timedOut": false,
                "duration": 715,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "29335a2d-fab9-4060-9a59-efb31debda7e",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "a2fc4fec-d352-49aa-9ac9-a07163b400ed",
              "1a78b2fb-e369-44c1-b803-79fe7c81a876",
              "0be32d12-f80f-438b-88d5-27fd93a06879",
              "39055945-6e0e-4b35-a72d-12073e231fbb",
              "0515b508-f16c-4a34-a90a-ff64040b5662",
              "29335a2d-fab9-4060-9a59-efb31debda7e"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 3456,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "9181e562-a2c2-4c88-9406-943dffa88af1",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "9737f136-518d-4247-9498-69d39fca4d63",
            "title": "> [binance] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/binance-test.js",
            "file": "/test/generated/binance-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [binance] connect",
                "fullTitle": " > [binance] without API keys > [binance] connect",
                "timedOut": false,
                "duration": 233,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ba59917e-2353-4874-89d2-c1e5b92501a5",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [binance] markets",
                "fullTitle": " > [binance] without API keys > [binance] markets",
                "timedOut": false,
                "duration": 675,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "979c88e3-361e-4b7e-bac9-cd7119ae0d57",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [binance] ticker",
                "fullTitle": " > [binance] without API keys > [binance] ticker",
                "timedOut": false,
                "duration": 856,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "4ddcd9f3-6910-4117-be6a-2f393ad11457",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [binance] tickers",
                "fullTitle": " > [binance] without API keys > [binance] tickers",
                "timedOut": false,
                "duration": 843,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "519237e7-214b-4446-88b1-39e3ae4c470f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [binance] orderBook",
                "fullTitle": " > [binance] without API keys > [binance] orderBook",
                "timedOut": false,
                "duration": 305,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "d6b5c808-0c10-4fc6-b527-26ce6f0531c6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [binance] trades",
                "fullTitle": " > [binance] without API keys > [binance] trades",
                "timedOut": false,
                "duration": 776,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e6d27aab-7ccb-42df-bcff-7c091e3124c2",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "ba59917e-2353-4874-89d2-c1e5b92501a5",
              "979c88e3-361e-4b7e-bac9-cd7119ae0d57",
              "4ddcd9f3-6910-4117-be6a-2f393ad11457",
              "519237e7-214b-4446-88b1-39e3ae4c470f",
              "d6b5c808-0c10-4fc6-b527-26ce6f0531c6",
              "e6d27aab-7ccb-42df-bcff-7c091e3124c2"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 3688,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "d6b71d47-f4f8-4d17-b72b-f34c4145d96b",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "b47456d7-0584-46d6-9a47-857be0720013",
            "title": "> [acx] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/acx-test.js",
            "file": "/test/generated/acx-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [acx] connect",
                "fullTitle": " > [acx] without API keys > [acx] connect",
                "timedOut": false,
                "duration": 520,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b0e7bd3e-4ac3-4024-8fb5-21092b405e63",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [acx] markets",
                "fullTitle": " > [acx] without API keys > [acx] markets",
                "timedOut": false,
                "duration": 1016,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e241288c-e660-4bf5-beac-414c3d2d726a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [acx] ticker",
                "fullTitle": " > [acx] without API keys > [acx] ticker",
                "timedOut": false,
                "duration": 1218,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "40aad70a-5377-477f-808e-daf16acf6712",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [acx] tickers",
                "fullTitle": " > [acx] without API keys > [acx] tickers",
                "timedOut": false,
                "duration": 1053,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "73fdcf86-b01b-45ad-88ac-8c9b3e3f83e6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [acx] orderBook",
                "fullTitle": " > [acx] without API keys > [acx] orderBook",
                "timedOut": false,
                "duration": 947,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b1f4ef5a-fff3-40fc-a079-8088baf2f82e",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [acx] trades",
                "fullTitle": " > [acx] without API keys > [acx] trades",
                "timedOut": false,
                "duration": 1030,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a93d1c34-39e8-47e5-aec8-99a1c152d56b",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "b0e7bd3e-4ac3-4024-8fb5-21092b405e63",
              "e241288c-e660-4bf5-beac-414c3d2d726a",
              "40aad70a-5377-477f-808e-daf16acf6712",
              "73fdcf86-b01b-45ad-88ac-8c9b3e3f83e6",
              "b1f4ef5a-fff3-40fc-a079-8088baf2f82e",
              "a93d1c34-39e8-47e5-aec8-99a1c152d56b"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5784,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "82316f3a-fab1-4284-a1aa-7fd9d26b7e06",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "88e77ebe-7543-47cd-a2ae-683acfd5ef01",
            "title": "> [binanceus] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/binanceus-test.js",
            "file": "/test/generated/binanceus-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [binanceus] connect",
                "fullTitle": " > [binanceus] without API keys > [binanceus] connect",
                "timedOut": false,
                "duration": 42,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ce3bd3d8-abe1-41b9-9bdb-df47e5a16101",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [binanceus] markets",
                "fullTitle": " > [binanceus] without API keys > [binanceus] markets",
                "timedOut": false,
                "duration": 393,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "abeb360b-39a6-4dff-b18c-1070885ae909",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [binanceus] ticker",
                "fullTitle": " > [binanceus] without API keys > [binanceus] ticker",
                "timedOut": false,
                "duration": 804,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8be5442e-84ed-491b-8cfb-ab20ef7ac9a5",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [binanceus] tickers",
                "fullTitle": " > [binanceus] without API keys > [binanceus] tickers",
                "timedOut": false,
                "duration": 529,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "684a2402-2fdf-46bb-8450-b92c77878a77",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [binanceus] orderBook",
                "fullTitle": " > [binanceus] without API keys > [binanceus] orderBook",
                "timedOut": false,
                "duration": 502,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "feeb76e3-142a-49b6-91ee-278d635a20dd",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [binanceus] trades",
                "fullTitle": " > [binanceus] without API keys > [binanceus] trades",
                "timedOut": false,
                "duration": 488,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "21b9cd01-09a3-472c-a6bd-7cbc4360d3c7",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "ce3bd3d8-abe1-41b9-9bdb-df47e5a16101",
              "abeb360b-39a6-4dff-b18c-1070885ae909",
              "8be5442e-84ed-491b-8cfb-ab20ef7ac9a5",
              "684a2402-2fdf-46bb-8450-b92c77878a77",
              "feeb76e3-142a-49b6-91ee-278d635a20dd",
              "21b9cd01-09a3-472c-a6bd-7cbc4360d3c7"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 2758,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "35496120-5046-4762-b000-abae561c20a3",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "46a89363-4492-45cc-854f-6ab8e9a1f830",
            "title": "> [bigone] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bigone-test.js",
            "file": "/test/generated/bigone-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bigone] connect",
                "fullTitle": " > [bigone] without API keys > [bigone] connect",
                "timedOut": false,
                "duration": 277,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "d95af9dd-a265-4a33-b079-62ece0e37c1b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bigone] markets",
                "fullTitle": " > [bigone] without API keys > [bigone] markets",
                "timedOut": false,
                "duration": 714,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "647544a1-175c-4014-a836-4b86e868588a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bigone] ticker",
                "fullTitle": " > [bigone] without API keys > [bigone] ticker",
                "timedOut": false,
                "duration": 1837,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f95ab954-f573-4470-9847-ed875e0840a6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bigone] tickers",
                "fullTitle": " > [bigone] without API keys > [bigone] tickers",
                "timedOut": false,
                "duration": 1373,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "7172ba23-61ae-4375-a2c6-5f624f0b07c0",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bigone] orderBook",
                "fullTitle": " > [bigone] without API keys > [bigone] orderBook",
                "timedOut": false,
                "duration": 1073,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "62ac2875-5dda-4777-82de-94af39a2d1f0",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bigone] trades",
                "fullTitle": " > [bigone] without API keys > [bigone] trades",
                "timedOut": false,
                "duration": 1277,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "fd134389-9f50-4cdb-b97a-474ca2dddca1",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "d95af9dd-a265-4a33-b079-62ece0e37c1b",
              "647544a1-175c-4014-a836-4b86e868588a",
              "f95ab954-f573-4470-9847-ed875e0840a6",
              "7172ba23-61ae-4375-a2c6-5f624f0b07c0",
              "62ac2875-5dda-4777-82de-94af39a2d1f0",
              "fd134389-9f50-4cdb-b97a-474ca2dddca1"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 6551,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "46cc0291-28cf-46f3-9ebc-ab8077096a25",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "b14ab63d-884f-4fc8-9fd4-e7fcefe90ff4",
            "title": "> [anxpro] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/anxpro-test.js",
            "file": "/test/generated/anxpro-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [anxpro] connect",
                "fullTitle": " > [anxpro] without API keys > [anxpro] connect",
                "timedOut": false,
                "duration": 504,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b3d0e5a2-df9a-4bb5-bf3b-01f394ab5399",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [anxpro] markets",
                "fullTitle": " > [anxpro] without API keys > [anxpro] markets",
                "timedOut": false,
                "duration": 5409,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "20175c85-5772-41c0-a9da-b6dbc985810e",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [anxpro] ticker",
                "fullTitle": " > [anxpro] without API keys > [anxpro] ticker",
                "timedOut": false,
                "duration": 1390,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3851f799-a3bc-45e5-8cd9-4aa0da25b7b2",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [anxpro] tickers",
                "fullTitle": " > [anxpro] without API keys > [anxpro] tickers",
                "timedOut": false,
                "duration": 13,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c80971e2-6b18-4b63-9230-d2243cd77043",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [anxpro] orderBook",
                "fullTitle": " > [anxpro] without API keys > [anxpro] orderBook",
                "timedOut": false,
                "duration": 54,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "582768ff-fb48-4638-ac80-1cfec9c6a70e",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [anxpro] trades",
                "fullTitle": " > [anxpro] without API keys > [anxpro] trades",
                "timedOut": false,
                "duration": 7,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b192974f-83ac-45ad-a3cd-e0f88f01981f",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "b3d0e5a2-df9a-4bb5-bf3b-01f394ab5399",
              "20175c85-5772-41c0-a9da-b6dbc985810e",
              "3851f799-a3bc-45e5-8cd9-4aa0da25b7b2",
              "c80971e2-6b18-4b63-9230-d2243cd77043",
              "582768ff-fb48-4638-ac80-1cfec9c6a70e",
              "b192974f-83ac-45ad-a3cd-e0f88f01981f"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 7377,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "c9462732-5550-4f82-a5f4-0589f5d77e75",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "32c8f354-5b9f-423e-8d03-e67cc36ec38b",
            "title": "> [aofex] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/aofex-test.js",
            "file": "/test/generated/aofex-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [aofex] connect",
                "fullTitle": " > [aofex] without API keys > [aofex] connect",
                "timedOut": false,
                "duration": 458,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e9f409e5-74cb-46bb-91de-a7f32f078e05",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [aofex] markets",
                "fullTitle": " > [aofex] without API keys > [aofex] markets",
                "timedOut": false,
                "duration": 1940,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ffcac089-4b72-42f6-a1d5-0c43e087c033",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [aofex] ticker",
                "fullTitle": " > [aofex] without API keys > [aofex] ticker",
                "timedOut": false,
                "duration": 3007,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "50576cca-a536-4ac6-a968-54376c3aa075",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [aofex] tickers",
                "fullTitle": " > [aofex] without API keys > [aofex] tickers",
                "timedOut": false,
                "duration": 1017,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e19d8a28-dbe6-47f0-b17a-720a44c61f30",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [aofex] orderBook",
                "fullTitle": " > [aofex] without API keys > [aofex] orderBook",
                "timedOut": false,
                "duration": 984,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c3aaa968-0d18-4ade-ab48-9c0d615f5b85",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [aofex] trades",
                "fullTitle": " > [aofex] without API keys > [aofex] trades",
                "timedOut": false,
                "duration": 1030,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e91bb799-6f0a-49a2-af9f-196a0ebb2b9b",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "e9f409e5-74cb-46bb-91de-a7f32f078e05",
              "ffcac089-4b72-42f6-a1d5-0c43e087c033",
              "50576cca-a536-4ac6-a968-54376c3aa075",
              "e19d8a28-dbe6-47f0-b17a-720a44c61f30",
              "c3aaa968-0d18-4ade-ab48-9c0d615f5b85",
              "e91bb799-6f0a-49a2-af9f-196a0ebb2b9b"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 8436,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "28553314-8993-4c0a-9db3-cb53d8f5564e",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "c63f8289-986b-4425-a197-54e4cfa55185",
            "title": "> [bcex] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bcex-test.js",
            "file": "/test/generated/bcex-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bcex] connect",
                "fullTitle": " > [bcex] without API keys > [bcex] connect",
                "timedOut": false,
                "duration": 363,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8b5d9d95-4d8b-4fe9-bac6-766c564552d1",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bcex] markets",
                "fullTitle": " > [bcex] without API keys > [bcex] markets",
                "timedOut": false,
                "duration": 6281,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "dac8be73-3e52-48d7-bd6f-71be62754772",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bcex] ticker",
                "fullTitle": " > [bcex] without API keys > [bcex] ticker",
                "timedOut": false,
                "duration": 2864,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3b9144d6-94bf-4e40-984a-b8fe6e035f41",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bcex] tickers",
                "fullTitle": " > [bcex] without API keys > [bcex] tickers",
                "timedOut": false,
                "duration": 5,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "13360532-3177-494c-9422-a58c1980a590",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bcex] orderBook",
                "fullTitle": " > [bcex] without API keys > [bcex] orderBook",
                "timedOut": false,
                "duration": 16,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2062819a-4ce2-4c84-aae9-da4c9aed941b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bcex] trades",
                "fullTitle": " > [bcex] without API keys > [bcex] trades",
                "timedOut": false,
                "duration": 17,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "4e444d93-1827-42e7-aab5-298ee51b8ef9",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "8b5d9d95-4d8b-4fe9-bac6-766c564552d1",
              "dac8be73-3e52-48d7-bd6f-71be62754772",
              "3b9144d6-94bf-4e40-984a-b8fe6e035f41",
              "13360532-3177-494c-9422-a58c1980a590",
              "2062819a-4ce2-4c84-aae9-da4c9aed941b",
              "4e444d93-1827-42e7-aab5-298ee51b8ef9"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 9546,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "ebcebb08-d23c-4d62-86eb-f4952ad585cb",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "3e77cf44-de13-4fc0-a4b4-36b563f1da84",
            "title": "> [bequant] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bequant-test.js",
            "file": "/test/generated/bequant-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bequant] connect",
                "fullTitle": " > [bequant] without API keys > [bequant] connect",
                "timedOut": false,
                "duration": 351,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "25f1c552-a200-4f13-9844-8b7ac21f7645",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bequant] markets",
                "fullTitle": " > [bequant] without API keys > [bequant] markets",
                "timedOut": false,
                "duration": 787,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6cf80131-9d4e-4327-977f-5f3b57f0c2c7",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bequant] ticker",
                "fullTitle": " > [bequant] without API keys > [bequant] ticker",
                "timedOut": false,
                "duration": 4106,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "55677e0a-0479-4212-bf4f-fc016dbfdc94",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bequant] tickers",
                "fullTitle": " > [bequant] without API keys > [bequant] tickers",
                "timedOut": false,
                "duration": 1211,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "443d15b8-3ca8-45c2-b817-c3ce1d4e0543",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bequant] orderBook",
                "fullTitle": " > [bequant] without API keys > [bequant] orderBook",
                "timedOut": false,
                "duration": 1493,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f85432a2-a195-4c50-97ff-ce54b22efbc9",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bequant] trades",
                "fullTitle": " > [bequant] without API keys > [bequant] trades",
                "timedOut": false,
                "duration": 1593,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0476449f-d377-41c7-b786-cd1ad75f2005",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "25f1c552-a200-4f13-9844-8b7ac21f7645",
              "6cf80131-9d4e-4327-977f-5f3b57f0c2c7",
              "55677e0a-0479-4212-bf4f-fc016dbfdc94",
              "443d15b8-3ca8-45c2-b817-c3ce1d4e0543",
              "f85432a2-a195-4c50-97ff-ce54b22efbc9",
              "0476449f-d377-41c7-b786-cd1ad75f2005"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 9541,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "cc974e44-c389-4d74-8775-a760f797973a",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "d066dcec-27f2-4552-a2f3-bcc7319ec16c",
            "title": "> [bitbank] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bitbank-test.js",
            "file": "/test/generated/bitbank-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bitbank] connect",
                "fullTitle": " > [bitbank] without API keys > [bitbank] connect",
                "timedOut": false,
                "duration": 90,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "62f889ec-cc17-4604-a5c1-23b886fb5fe4",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitbank] markets",
                "fullTitle": " > [bitbank] without API keys > [bitbank] markets",
                "timedOut": false,
                "duration": 20,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8fb9e725-b867-4c69-b68a-30ecb542b0ea",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitbank] ticker",
                "fullTitle": " > [bitbank] without API keys > [bitbank] ticker",
                "timedOut": false,
                "duration": 911,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "fff8b780-2f69-4b9e-bf3c-2b9caf5574a8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitbank] tickers",
                "fullTitle": " > [bitbank] without API keys > [bitbank] tickers",
                "timedOut": false,
                "duration": 32,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f247950a-a9f7-48de-9d98-88adacdd078d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitbank] orderBook",
                "fullTitle": " > [bitbank] without API keys > [bitbank] orderBook",
                "timedOut": false,
                "duration": 1717,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "9fb7c2de-e8e9-482d-a3a9-7bdabaecd8f0",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitbank] trades",
                "fullTitle": " > [bitbank] without API keys > [bitbank] trades",
                "timedOut": false,
                "duration": 1996,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "63957c2f-b386-44aa-aa5e-48ce60b1f41d",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "62f889ec-cc17-4604-a5c1-23b886fb5fe4",
              "8fb9e725-b867-4c69-b68a-30ecb542b0ea",
              "fff8b780-2f69-4b9e-bf3c-2b9caf5574a8",
              "f247950a-a9f7-48de-9d98-88adacdd078d",
              "9fb7c2de-e8e9-482d-a3a9-7bdabaecd8f0",
              "63957c2f-b386-44aa-aa5e-48ce60b1f41d"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 4766,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "cfb320d7-d00e-4752-94e0-8ead90c75b01",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "e406d593-70c3-4297-96bc-82c527118dfb",
            "title": "> [bitbay] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bitbay-test.js",
            "file": "/test/generated/bitbay-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bitbay] connect",
                "fullTitle": " > [bitbay] without API keys > [bitbay] connect",
                "timedOut": false,
                "duration": 48,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c2b8fdf3-a5c9-410f-83d3-f567f6f6c475",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitbay] markets",
                "fullTitle": " > [bitbay] without API keys > [bitbay] markets",
                "timedOut": false,
                "duration": 423,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "21ae28af-2562-4c05-bd33-c87abef6e674",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitbay] ticker",
                "fullTitle": " > [bitbay] without API keys > [bitbay] ticker",
                "timedOut": false,
                "duration": 1967,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c9d025ff-c8a6-41ed-9098-f266cdeb473a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitbay] tickers",
                "fullTitle": " > [bitbay] without API keys > [bitbay] tickers",
                "timedOut": false,
                "duration": 56,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "26fa7403-5188-4793-a541-6ee75f485086",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitbay] orderBook",
                "fullTitle": " > [bitbay] without API keys > [bitbay] orderBook",
                "timedOut": false,
                "duration": 668,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c62dd262-c03a-4e88-b0ab-cad2025b8c64",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitbay] trades",
                "fullTitle": " > [bitbay] without API keys > [bitbay] trades",
                "timedOut": false,
                "duration": 1009,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1cad1726-383d-454c-aaee-255cc48dc004",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "c2b8fdf3-a5c9-410f-83d3-f567f6f6c475",
              "21ae28af-2562-4c05-bd33-c87abef6e674",
              "c9d025ff-c8a6-41ed-9098-f266cdeb473a",
              "26fa7403-5188-4793-a541-6ee75f485086",
              "c62dd262-c03a-4e88-b0ab-cad2025b8c64",
              "1cad1726-383d-454c-aaee-255cc48dc004"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 4171,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "c550adfc-888b-4eaa-9c6f-ba084cc8989f",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "44771c4f-2c22-4339-99f0-e8d903e8193d",
            "title": "> [bit2c] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bit2c-test.js",
            "file": "/test/generated/bit2c-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bit2c] connect",
                "fullTitle": " > [bit2c] without API keys > [bit2c] connect",
                "timedOut": false,
                "duration": 104,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "d2bd6ef3-6505-4289-98d7-196d78f5fd3e",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bit2c] markets",
                "fullTitle": " > [bit2c] without API keys > [bit2c] markets",
                "timedOut": false,
                "duration": 18,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "fdc7ec0b-76a5-4a03-9a62-830f771c1bfb",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bit2c] ticker",
                "fullTitle": " > [bit2c] without API keys > [bit2c] ticker",
                "timedOut": false,
                "duration": 818,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a4357cdc-c359-4d85-82a2-e24ccf045b1a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bit2c] tickers",
                "fullTitle": " > [bit2c] without API keys > [bit2c] tickers",
                "timedOut": false,
                "duration": 10,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8c84a7c9-c13a-4354-960f-ec49bf90b9e7",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bit2c] orderBook",
                "fullTitle": " > [bit2c] without API keys > [bit2c] orderBook",
                "timedOut": false,
                "duration": 2736,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "400e88c7-296a-403f-ac01-fd8431970240",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bit2c] trades",
                "fullTitle": " > [bit2c] without API keys > [bit2c] trades",
                "timedOut": false,
                "duration": 2547,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "d63e9ba0-7789-49f1-8918-35e57af39210",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "d2bd6ef3-6505-4289-98d7-196d78f5fd3e",
              "fdc7ec0b-76a5-4a03-9a62-830f771c1bfb",
              "a4357cdc-c359-4d85-82a2-e24ccf045b1a",
              "8c84a7c9-c13a-4354-960f-ec49bf90b9e7",
              "400e88c7-296a-403f-ac01-fd8431970240",
              "d63e9ba0-7789-49f1-8918-35e57af39210"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 6233,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "30f341a7-72a0-4c32-bdd2-ed20674b48f1",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "d9835d79-d2dd-4dc3-b547-d3dda3546cbc",
            "title": "> [bitforex] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bitforex-test.js",
            "file": "/test/generated/bitforex-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bitforex] connect",
                "fullTitle": " > [bitforex] without API keys > [bitforex] connect",
                "timedOut": false,
                "duration": 36,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1867975d-3fbd-4d12-a00e-5cecdad0a373",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitforex] markets",
                "fullTitle": " > [bitforex] without API keys > [bitforex] markets",
                "timedOut": false,
                "duration": 1699,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "48ca09d0-6edd-418f-944f-b8f0862826b1",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitforex] ticker",
                "fullTitle": " > [bitforex] without API keys > [bitforex] ticker",
                "timedOut": false,
                "duration": 1329,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "02e75a90-ddad-4839-892b-473eace335f9",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitforex] tickers",
                "fullTitle": " > [bitforex] without API keys > [bitforex] tickers",
                "timedOut": false,
                "duration": 21,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2988e83f-1092-4ef4-abcd-0621d937b60a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitforex] orderBook",
                "fullTitle": " > [bitforex] without API keys > [bitforex] orderBook",
                "timedOut": false,
                "duration": 38,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6caa6909-0625-4bd2-961f-55535f1b4eb4",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitforex] trades",
                "fullTitle": " > [bitforex] without API keys > [bitforex] trades",
                "timedOut": false,
                "duration": 31,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1bd19cfc-ff13-444f-9fd9-7b9e44e683e3",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "1867975d-3fbd-4d12-a00e-5cecdad0a373",
              "48ca09d0-6edd-418f-944f-b8f0862826b1",
              "02e75a90-ddad-4839-892b-473eace335f9",
              "2988e83f-1092-4ef4-abcd-0621d937b60a",
              "6caa6909-0625-4bd2-961f-55535f1b4eb4",
              "1bd19cfc-ff13-444f-9fd9-7b9e44e683e3"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 3154,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "a5f6afb4-6e20-4835-b571-2c1e42ae2294",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "71ef9e44-9c3b-4c8f-b583-bbbcad75c254",
            "title": "> [bithumb] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bithumb-test.js",
            "file": "/test/generated/bithumb-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bithumb] connect",
                "fullTitle": " > [bithumb] without API keys > [bithumb] connect",
                "timedOut": false,
                "duration": 130,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2569670a-f40a-42fe-9f12-e484b20898a6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bithumb] markets",
                "fullTitle": " > [bithumb] without API keys > [bithumb] markets",
                "timedOut": false,
                "duration": 449,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6118ac1d-ca0a-4a4d-97b0-5000ffabbb28",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bithumb] ticker",
                "fullTitle": " > [bithumb] without API keys > [bithumb] ticker",
                "timedOut": false,
                "duration": 863,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "31e03969-950d-48b7-a0f6-67cfbfafe084",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bithumb] tickers",
                "fullTitle": " > [bithumb] without API keys > [bithumb] tickers",
                "timedOut": false,
                "duration": 917,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "97ee1fe2-ac9c-46c1-b0f3-d6c6b49c7a7e",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bithumb] orderBook",
                "fullTitle": " > [bithumb] without API keys > [bithumb] orderBook",
                "timedOut": false,
                "duration": 263,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0027ad34-a883-4c7c-b3b5-d058e877958c",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bithumb] trades",
                "fullTitle": " > [bithumb] without API keys > [bithumb] trades",
                "timedOut": false,
                "duration": 482,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "828cb455-c1df-4958-ac04-f66c37cbc1c7",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "2569670a-f40a-42fe-9f12-e484b20898a6",
              "6118ac1d-ca0a-4a4d-97b0-5000ffabbb28",
              "31e03969-950d-48b7-a0f6-67cfbfafe084",
              "97ee1fe2-ac9c-46c1-b0f3-d6c6b49c7a7e",
              "0027ad34-a883-4c7c-b3b5-d058e877958c",
              "828cb455-c1df-4958-ac04-f66c37cbc1c7"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 3104,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "94f22a5a-9d1f-4464-b378-9d1d14a358cd",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "25c31805-e347-4586-a6f3-84d936593ccd",
            "title": "> [bitmax] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bitmax-test.js",
            "file": "/test/generated/bitmax-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bitmax] connect",
                "fullTitle": " > [bitmax] without API keys > [bitmax] connect",
                "timedOut": false,
                "duration": 278,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6b3fb0c8-b56c-485d-b7a7-af73c0d6c874",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitmax] markets",
                "fullTitle": " > [bitmax] without API keys > [bitmax] markets",
                "timedOut": false,
                "duration": 464,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f2034822-146c-4228-8be8-06f36f62b3c6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitmax] ticker",
                "fullTitle": " > [bitmax] without API keys > [bitmax] ticker",
                "timedOut": false,
                "duration": 1224,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ccf39bc1-6b4b-4003-a2c3-7938117732ae",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitmax] tickers",
                "fullTitle": " > [bitmax] without API keys > [bitmax] tickers",
                "timedOut": false,
                "duration": 584,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c0c490fb-e185-4277-bb80-2cb537f80d58",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitmax] orderBook",
                "fullTitle": " > [bitmax] without API keys > [bitmax] orderBook",
                "timedOut": false,
                "duration": 413,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "16200c27-4409-4a05-9afa-2eee1ca79519",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitmax] trades",
                "fullTitle": " > [bitmax] without API keys > [bitmax] trades",
                "timedOut": false,
                "duration": 1051,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "28cdc3a9-e5f6-4484-a4fc-25b98aede8e5",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "6b3fb0c8-b56c-485d-b7a7-af73c0d6c874",
              "f2034822-146c-4228-8be8-06f36f62b3c6",
              "ccf39bc1-6b4b-4003-a2c3-7938117732ae",
              "c0c490fb-e185-4277-bb80-2cb537f80d58",
              "16200c27-4409-4a05-9afa-2eee1ca79519",
              "28cdc3a9-e5f6-4484-a4fc-25b98aede8e5"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 4014,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "d29f10a3-ef2c-48be-87ad-89bbdd0ac840",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "16840d57-2276-4eb0-8c48-b6f08024d138",
            "title": "> [bitfinex2] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bitfinex2-test.js",
            "file": "/test/generated/bitfinex2-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bitfinex2] connect",
                "fullTitle": " > [bitfinex2] without API keys > [bitfinex2] connect",
                "timedOut": false,
                "duration": 115,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5e135978-c896-4550-acd7-63276463a8bb",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitfinex2] markets",
                "fullTitle": " > [bitfinex2] without API keys > [bitfinex2] markets",
                "timedOut": false,
                "duration": 365,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "83afe666-efe2-4aae-82e6-01458a1646cb",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitfinex2] ticker",
                "fullTitle": " > [bitfinex2] without API keys > [bitfinex2] ticker",
                "timedOut": false,
                "duration": 2933,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "be94b844-1290-4920-a6eb-6e9fd6ba073d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitfinex2] tickers",
                "fullTitle": " > [bitfinex2] without API keys > [bitfinex2] tickers",
                "timedOut": false,
                "duration": 1614,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "66169a93-ef1a-437f-be87-33c7abfc29ff",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitfinex2] orderBook",
                "fullTitle": " > [bitfinex2] without API keys > [bitfinex2] orderBook",
                "timedOut": false,
                "duration": 1172,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c2457fc0-6804-433d-8a82-9f649f5ceadc",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitfinex2] trades",
                "fullTitle": " > [bitfinex2] without API keys > [bitfinex2] trades",
                "timedOut": false,
                "duration": 1681,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "01a0b61e-2dad-4499-b823-d55a2b044b30",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "5e135978-c896-4550-acd7-63276463a8bb",
              "83afe666-efe2-4aae-82e6-01458a1646cb",
              "be94b844-1290-4920-a6eb-6e9fd6ba073d",
              "66169a93-ef1a-437f-be87-33c7abfc29ff",
              "c2457fc0-6804-433d-8a82-9f649f5ceadc",
              "01a0b61e-2dad-4499-b823-d55a2b044b30"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 7880,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "b0f1fd8d-ad3f-4309-a15f-5979c5bdfd0d",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "bcb49c4d-8d94-46cd-84ba-30e22e28724f",
            "title": "> [bitkk] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bitkk-test.js",
            "file": "/test/generated/bitkk-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bitkk] connect",
                "fullTitle": " > [bitkk] without API keys > [bitkk] connect",
                "timedOut": false,
                "duration": 187,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c500ea9b-6d9d-4709-aa6d-0de205b92910",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitkk] markets",
                "fullTitle": " > [bitkk] without API keys > [bitkk] markets",
                "timedOut": false,
                "duration": 662,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c916e7e6-6fd8-49e9-83df-2c9f921d2f9d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitkk] ticker",
                "fullTitle": " > [bitkk] without API keys > [bitkk] ticker",
                "timedOut": false,
                "duration": 1589,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6b0119c7-c4a9-4abc-b89a-b95379a5d551",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitkk] tickers",
                "fullTitle": " > [bitkk] without API keys > [bitkk] tickers",
                "timedOut": false,
                "duration": 1044,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "999c0964-4baf-4be8-ac6d-fd769c2b835b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitkk] orderBook",
                "fullTitle": " > [bitkk] without API keys > [bitkk] orderBook",
                "timedOut": false,
                "duration": 962,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "d2728c77-67f1-4763-a5b0-e56924592f2a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitkk] trades",
                "fullTitle": " > [bitkk] without API keys > [bitkk] trades",
                "timedOut": false,
                "duration": 990,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2d1096b7-ff8d-481a-a641-555086a8d882",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "c500ea9b-6d9d-4709-aa6d-0de205b92910",
              "c916e7e6-6fd8-49e9-83df-2c9f921d2f9d",
              "6b0119c7-c4a9-4abc-b89a-b95379a5d551",
              "999c0964-4baf-4be8-ac6d-fd769c2b835b",
              "d2728c77-67f1-4763-a5b0-e56924592f2a",
              "2d1096b7-ff8d-481a-a641-555086a8d882"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5434,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "36a90465-4b63-4847-af93-6c78b8d8750f",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "00093bb5-6076-41ae-9ef9-c948cc82424a",
            "title": "> [bitflyer] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bitflyer-test.js",
            "file": "/test/generated/bitflyer-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bitflyer] connect",
                "fullTitle": " > [bitflyer] without API keys > [bitflyer] connect",
                "timedOut": false,
                "duration": 108,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "846fde7e-d3cb-400d-bd39-29d9de4af523",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitflyer] markets",
                "fullTitle": " > [bitflyer] without API keys > [bitflyer] markets",
                "timedOut": false,
                "duration": 2429,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "618c824e-0445-439d-a7cf-8d6b91e02314",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitflyer] ticker",
                "fullTitle": " > [bitflyer] without API keys > [bitflyer] ticker",
                "timedOut": false,
                "duration": 4125,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "df4b23de-0139-4d32-b140-dda4914efed9",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitflyer] tickers",
                "fullTitle": " > [bitflyer] without API keys > [bitflyer] tickers",
                "timedOut": false,
                "duration": 14,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "60e44039-b631-418e-9b49-c7bbce39ebab",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitflyer] orderBook",
                "fullTitle": " > [bitflyer] without API keys > [bitflyer] orderBook",
                "timedOut": false,
                "duration": 885,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "d5c58ba3-e5ab-41f2-bb8f-57790a74f06e",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitflyer] trades",
                "fullTitle": " > [bitflyer] without API keys > [bitflyer] trades",
                "timedOut": false,
                "duration": 1153,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "76c4c594-9932-4f88-bd67-d2012cee5bb1",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "846fde7e-d3cb-400d-bd39-29d9de4af523",
              "618c824e-0445-439d-a7cf-8d6b91e02314",
              "df4b23de-0139-4d32-b140-dda4914efed9",
              "60e44039-b631-418e-9b49-c7bbce39ebab",
              "d5c58ba3-e5ab-41f2-bb8f-57790a74f06e",
              "76c4c594-9932-4f88-bd67-d2012cee5bb1"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 8714,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "56c9b117-882c-441a-8acf-7a1c7defe8a8",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "0bc310c3-f2fd-4ec9-b08b-6a40a63b71fe",
            "title": "> [bitfinex] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bitfinex-test.js",
            "file": "/test/generated/bitfinex-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bitfinex] connect",
                "fullTitle": " > [bitfinex] without API keys > [bitfinex] connect",
                "timedOut": false,
                "duration": 76,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ed893a44-61a0-4f9c-81bd-abe6d7fef551",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitfinex] markets",
                "fullTitle": " > [bitfinex] without API keys > [bitfinex] markets",
                "timedOut": false,
                "duration": 1841,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "4ec940da-b5d3-4275-a863-a71a31040bfd",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitfinex] ticker",
                "fullTitle": " > [bitfinex] without API keys > [bitfinex] ticker",
                "timedOut": false,
                "duration": 4487,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ba4d8a87-c4c9-4113-86c0-5fba4658ac9f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitfinex] tickers",
                "fullTitle": " > [bitfinex] without API keys > [bitfinex] tickers",
                "timedOut": false,
                "duration": 1531,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c628d3d9-8130-452b-b99f-b161f410cccc",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitfinex] orderBook",
                "fullTitle": " > [bitfinex] without API keys > [bitfinex] orderBook",
                "timedOut": false,
                "duration": 1445,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "9f033d54-0ad8-4710-927d-39f09de45e42",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitfinex] trades",
                "fullTitle": " > [bitfinex] without API keys > [bitfinex] trades",
                "timedOut": false,
                "duration": 1874,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "99f4cff3-a06d-4fb6-afdc-bb1ddb831cad",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "ed893a44-61a0-4f9c-81bd-abe6d7fef551",
              "4ec940da-b5d3-4275-a863-a71a31040bfd",
              "ba4d8a87-c4c9-4113-86c0-5fba4658ac9f",
              "c628d3d9-8130-452b-b99f-b161f410cccc",
              "9f033d54-0ad8-4710-927d-39f09de45e42",
              "99f4cff3-a06d-4fb6-afdc-bb1ddb831cad"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 11254,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "0654c69f-84e5-4bc1-a68c-aebf3b0b4ae7",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "02d942ae-f66a-4edf-b395-48b12d740854",
            "title": "> [bitmart] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bitmart-test.js",
            "file": "/test/generated/bitmart-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bitmart] connect",
                "fullTitle": " > [bitmart] without API keys > [bitmart] connect",
                "timedOut": false,
                "duration": 383,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8a0e85b9-c77f-4a7c-a311-ff85dde405c7",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitmart] markets",
                "fullTitle": " > [bitmart] without API keys > [bitmart] markets",
                "timedOut": false,
                "duration": 952,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "7a769312-d390-4c4e-a607-7495b499a729",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitmart] ticker",
                "fullTitle": " > [bitmart] without API keys > [bitmart] ticker",
                "timedOut": false,
                "duration": 2285,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "42b8ef5f-3e40-4e40-933f-82a900ec4176",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitmart] tickers",
                "fullTitle": " > [bitmart] without API keys > [bitmart] tickers",
                "timedOut": false,
                "duration": 1090,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "74d057ed-7c1a-4162-b570-4a821c1a2e36",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitmart] orderBook",
                "fullTitle": " > [bitmart] without API keys > [bitmart] orderBook",
                "timedOut": false,
                "duration": 845,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "bdf1c306-0733-427a-a2d8-f0fdbe5bbc79",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitmart] trades",
                "fullTitle": " > [bitmart] without API keys > [bitmart] trades",
                "timedOut": false,
                "duration": 1085,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1b484183-1b8e-4035-bd7b-41eaa14da399",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "8a0e85b9-c77f-4a7c-a311-ff85dde405c7",
              "7a769312-d390-4c4e-a607-7495b499a729",
              "42b8ef5f-3e40-4e40-933f-82a900ec4176",
              "74d057ed-7c1a-4162-b570-4a821c1a2e36",
              "bdf1c306-0733-427a-a2d8-f0fdbe5bbc79",
              "1b484183-1b8e-4035-bd7b-41eaa14da399"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 6640,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "753c980a-84a5-47aa-86c9-aed23223face",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "3cf85896-e56f-442b-92e7-cd8b463c8d2e",
            "title": "> [bitmex] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bitmex-test.js",
            "file": "/test/generated/bitmex-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bitmex] connect",
                "fullTitle": " > [bitmex] without API keys > [bitmex] connect",
                "timedOut": false,
                "duration": 81,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "78a7a126-00c1-41e1-bd3e-61357fbb00e6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitmex] markets",
                "fullTitle": " > [bitmex] without API keys > [bitmex] markets",
                "timedOut": false,
                "duration": 929,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "fc8a1397-f71d-46bc-8f5b-90f9a3e25ceb",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitmex] ticker",
                "fullTitle": " > [bitmex] without API keys > [bitmex] ticker",
                "timedOut": false,
                "duration": 1293,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b8edf36f-513f-4d9d-a537-44a1ab268a4f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitmex] tickers",
                "fullTitle": " > [bitmex] without API keys > [bitmex] tickers",
                "timedOut": false,
                "duration": 33,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "4c6892ce-b07f-419c-9dbd-a43823b5c5f4",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitmex] orderBook",
                "fullTitle": " > [bitmex] without API keys > [bitmex] orderBook",
                "timedOut": false,
                "duration": 1802,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "fb64f6f2-d92e-4db9-b044-d6fd5fd68da3",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitmex] trades",
                "fullTitle": " > [bitmex] without API keys > [bitmex] trades",
                "timedOut": false,
                "duration": 2442,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ccdbb8dd-c790-4b38-ac55-e6e782451947",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "78a7a126-00c1-41e1-bd3e-61357fbb00e6",
              "fc8a1397-f71d-46bc-8f5b-90f9a3e25ceb",
              "b8edf36f-513f-4d9d-a537-44a1ab268a4f",
              "4c6892ce-b07f-419c-9dbd-a43823b5c5f4",
              "fb64f6f2-d92e-4db9-b044-d6fd5fd68da3",
              "ccdbb8dd-c790-4b38-ac55-e6e782451947"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 6580,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "2d52c76b-cf7f-4e72-9e83-7a3f28707821",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "23b58d18-ee29-45ba-a677-ea9c940c6d2b",
            "title": "> [bitstamp] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bitstamp-test.js",
            "file": "/test/generated/bitstamp-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bitstamp] connect",
                "fullTitle": " > [bitstamp] without API keys > [bitstamp] connect",
                "timedOut": false,
                "duration": 126,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "4e8a7f3a-f488-4404-97f0-42dd8d365ebe",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitstamp] markets",
                "fullTitle": " > [bitstamp] without API keys > [bitstamp] markets",
                "timedOut": false,
                "duration": 140,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "df4ef5d9-5674-4dbe-8cbd-c522ff8f2ee7",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitstamp] ticker",
                "fullTitle": " > [bitstamp] without API keys > [bitstamp] ticker",
                "timedOut": false,
                "duration": 1900,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e650f885-6ee9-4c80-a017-91a19d936f3a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitstamp] tickers",
                "fullTitle": " > [bitstamp] without API keys > [bitstamp] tickers",
                "timedOut": false,
                "duration": 10,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "648d1c19-fb5b-48ce-a370-4af9a0bcbb59",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitstamp] orderBook",
                "fullTitle": " > [bitstamp] without API keys > [bitstamp] orderBook",
                "timedOut": false,
                "duration": 1842,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2a11788e-d48b-492b-aefe-747bf437c716",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitstamp] trades",
                "fullTitle": " > [bitstamp] without API keys > [bitstamp] trades",
                "timedOut": false,
                "duration": 660,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c8c1a236-969c-46a8-b4f1-a30ec9e22a34",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "4e8a7f3a-f488-4404-97f0-42dd8d365ebe",
              "df4ef5d9-5674-4dbe-8cbd-c522ff8f2ee7",
              "e650f885-6ee9-4c80-a017-91a19d936f3a",
              "648d1c19-fb5b-48ce-a370-4af9a0bcbb59",
              "2a11788e-d48b-492b-aefe-747bf437c716",
              "c8c1a236-969c-46a8-b4f1-a30ec9e22a34"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 4678,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "d3163eeb-7f43-49be-a18b-d09cc376ef66",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "55d66e46-f193-4d54-87dd-6b332e551822",
            "title": "> [bitstamp1] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bitstamp1-test.js",
            "file": "/test/generated/bitstamp1-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bitstamp1] connect",
                "fullTitle": " > [bitstamp1] without API keys > [bitstamp1] connect",
                "timedOut": false,
                "duration": 96,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "def031e0-6d5b-4e00-8c75-10f7a0482e35",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitstamp1] markets",
                "fullTitle": " > [bitstamp1] without API keys > [bitstamp1] markets",
                "timedOut": false,
                "duration": 46,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1a2438ce-03fe-4065-9fde-a43e8f163a1b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitstamp1] ticker",
                "fullTitle": " > [bitstamp1] without API keys > [bitstamp1] ticker",
                "timedOut": false,
                "duration": 1081,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "481bffdd-ee1d-4869-bfcd-fc7b9b392db8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitstamp1] tickers",
                "fullTitle": " > [bitstamp1] without API keys > [bitstamp1] tickers",
                "timedOut": false,
                "duration": 44,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0766254e-cf26-4887-b90b-9cf785b4cb0f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitstamp1] orderBook",
                "fullTitle": " > [bitstamp1] without API keys > [bitstamp1] orderBook",
                "timedOut": false,
                "duration": 659,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b8b9d312-2d08-4189-9e80-9c4dd929a91c",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitstamp1] trades",
                "fullTitle": " > [bitstamp1] without API keys > [bitstamp1] trades",
                "timedOut": false,
                "duration": 916,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "9aa040f5-3724-4e2b-ba86-411a12afa2d5",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "def031e0-6d5b-4e00-8c75-10f7a0482e35",
              "1a2438ce-03fe-4065-9fde-a43e8f163a1b",
              "481bffdd-ee1d-4869-bfcd-fc7b9b392db8",
              "0766254e-cf26-4887-b90b-9cf785b4cb0f",
              "b8b9d312-2d08-4189-9e80-9c4dd929a91c",
              "9aa040f5-3724-4e2b-ba86-411a12afa2d5"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 2842,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "8386a1d6-f2d8-4a8a-abd4-cb222bcca1c8",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "efe69f9e-2165-4898-8d85-0fda8ac5c881",
            "title": "> [bitso] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bitso-test.js",
            "file": "/test/generated/bitso-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bitso] connect",
                "fullTitle": " > [bitso] without API keys > [bitso] connect",
                "timedOut": false,
                "duration": 76,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5a811010-d242-4ef1-90af-28961553de6b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitso] markets",
                "fullTitle": " > [bitso] without API keys > [bitso] markets",
                "timedOut": false,
                "duration": 486,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1466b6c7-5f59-4654-ac71-b8c2acbafe40",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitso] ticker",
                "fullTitle": " > [bitso] without API keys > [bitso] ticker",
                "timedOut": false,
                "duration": 3709,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "dea0aa61-dc2b-44cf-8910-2128447fc8b6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitso] tickers",
                "fullTitle": " > [bitso] without API keys > [bitso] tickers",
                "timedOut": false,
                "duration": 20,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a5f31cd8-0a1b-4c87-831c-f81a5b0be78e",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitso] orderBook",
                "fullTitle": " > [bitso] without API keys > [bitso] orderBook",
                "timedOut": false,
                "duration": 1984,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "7c1c0433-8d98-40a7-ba94-09a2db1d7bec",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitso] trades",
                "fullTitle": " > [bitso] without API keys > [bitso] trades",
                "timedOut": false,
                "duration": 1945,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "67e90e59-f99c-41a5-8c52-5bb752815fd8",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "5a811010-d242-4ef1-90af-28961553de6b",
              "1466b6c7-5f59-4654-ac71-b8c2acbafe40",
              "dea0aa61-dc2b-44cf-8910-2128447fc8b6",
              "a5f31cd8-0a1b-4c87-831c-f81a5b0be78e",
              "7c1c0433-8d98-40a7-ba94-09a2db1d7bec",
              "67e90e59-f99c-41a5-8c52-5bb752815fd8"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 8220,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "013053f2-da05-4c99-b081-4f79e1e587ed",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "33c85338-b37c-4e82-99b7-e36c2fd13a81",
            "title": "> [bl3p] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bl3p-test.js",
            "file": "/test/generated/bl3p-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bl3p] connect",
                "fullTitle": " > [bl3p] without API keys > [bl3p] connect",
                "timedOut": false,
                "duration": 224,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2a776c15-128e-4606-9154-d6b09098772f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bl3p] markets",
                "fullTitle": " > [bl3p] without API keys > [bl3p] markets",
                "timedOut": false,
                "duration": 120,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "43428d3f-63a5-48bc-9035-586623af031e",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bl3p] ticker",
                "fullTitle": " > [bl3p] without API keys > [bl3p] ticker",
                "timedOut": false,
                "duration": 784,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "97f91ba2-7857-4897-be8d-271bbc65b9ce",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bl3p] tickers",
                "fullTitle": " > [bl3p] without API keys > [bl3p] tickers",
                "timedOut": false,
                "duration": 38,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3087c8a4-9ada-42af-b30d-b37d79f50027",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bl3p] orderBook",
                "fullTitle": " > [bl3p] without API keys > [bl3p] orderBook",
                "timedOut": false,
                "duration": 719,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8500a79f-8d02-409e-aab4-01572eab1b9c",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bl3p] trades",
                "fullTitle": " > [bl3p] without API keys > [bl3p] trades",
                "timedOut": false,
                "duration": 733,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "9eec4d65-8875-4d93-974c-b8473bc2a6bd",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "2a776c15-128e-4606-9154-d6b09098772f",
              "43428d3f-63a5-48bc-9035-586623af031e",
              "97f91ba2-7857-4897-be8d-271bbc65b9ce",
              "3087c8a4-9ada-42af-b30d-b37d79f50027",
              "8500a79f-8d02-409e-aab4-01572eab1b9c",
              "9eec4d65-8875-4d93-974c-b8473bc2a6bd"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 2618,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "009c96b9-4fb4-4d20-8c3a-3ac2fc35b7f2",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "e3edfda5-02c3-4f69-ae07-db25b2c5096a",
            "title": "> [_1btcxe] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/_1btcxe-test.js",
            "file": "/test/generated/_1btcxe-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [_1btcxe] connect",
                "fullTitle": " > [_1btcxe] without API keys > [_1btcxe] connect",
                "timedOut": false,
                "duration": 456,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6a224e5e-570b-426d-8bd2-dc94980f4e60",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [_1btcxe] markets",
                "fullTitle": " > [_1btcxe] without API keys > [_1btcxe] markets",
                "timedOut": false,
                "duration": 115,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "80c5920b-d0d1-4ae1-9259-b86f82652829",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [_1btcxe] ticker",
                "fullTitle": " > [_1btcxe] without API keys > [_1btcxe] ticker",
                "timedOut": false,
                "duration": 5988,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "998bab5a-0789-4250-ae2c-e48c74bd2bcc",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [_1btcxe] tickers",
                "fullTitle": " > [_1btcxe] without API keys > [_1btcxe] tickers",
                "timedOut": false,
                "duration": 27,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "7b5e2af2-613f-40cd-8ea1-5d7e5795e4e3",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [_1btcxe] orderBook",
                "fullTitle": " > [_1btcxe] without API keys > [_1btcxe] orderBook",
                "timedOut": false,
                "duration": 7958,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "43709067-9b13-4263-af4e-e69fb1b93351",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [_1btcxe] trades",
                "fullTitle": " > [_1btcxe] without API keys > [_1btcxe] trades",
                "timedOut": false,
                "duration": 8166,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "43fc067c-dddf-44b8-85bf-22953a91b276",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "6a224e5e-570b-426d-8bd2-dc94980f4e60",
              "80c5920b-d0d1-4ae1-9259-b86f82652829",
              "998bab5a-0789-4250-ae2c-e48c74bd2bcc",
              "7b5e2af2-613f-40cd-8ea1-5d7e5795e4e3",
              "43709067-9b13-4263-af4e-e69fb1b93351",
              "43fc067c-dddf-44b8-85bf-22953a91b276"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 22710,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "94585395-268c-4c59-84cb-ae6d9cf62c60",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "8cdbe0ee-bc7d-4882-a006-e6e290e9ae43",
            "title": "> [btcbox] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/btcbox-test.js",
            "file": "/test/generated/btcbox-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [btcbox] connect",
                "fullTitle": " > [btcbox] without API keys > [btcbox] connect",
                "timedOut": false,
                "duration": 107,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3c6f4778-4bcb-4004-bb9a-5b1e9ad1cb14",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btcbox] markets",
                "fullTitle": " > [btcbox] without API keys > [btcbox] markets",
                "timedOut": false,
                "duration": 126,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "785c52e1-d88f-4836-b5de-c0d430687d6c",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btcbox] ticker",
                "fullTitle": " > [btcbox] without API keys > [btcbox] ticker",
                "timedOut": false,
                "duration": 1166,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "736e73df-5087-43ce-83af-dcf9d7a900cf",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btcbox] tickers",
                "fullTitle": " > [btcbox] without API keys > [btcbox] tickers",
                "timedOut": false,
                "duration": 13,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2aead3e6-7f2c-448d-931e-ab9617b78d0d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btcbox] orderBook",
                "fullTitle": " > [btcbox] without API keys > [btcbox] orderBook",
                "timedOut": false,
                "duration": 816,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "11a63bbc-1683-47d1-9e0b-0378826e03cc",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btcbox] trades",
                "fullTitle": " > [btcbox] without API keys > [btcbox] trades",
                "timedOut": false,
                "duration": 461,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "34502014-871b-4994-8e26-1bfa74c3fddb",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "3c6f4778-4bcb-4004-bb9a-5b1e9ad1cb14",
              "785c52e1-d88f-4836-b5de-c0d430687d6c",
              "736e73df-5087-43ce-83af-dcf9d7a900cf",
              "2aead3e6-7f2c-448d-931e-ab9617b78d0d",
              "11a63bbc-1683-47d1-9e0b-0378826e03cc",
              "34502014-871b-4994-8e26-1bfa74c3fddb"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 2689,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "7ea13d65-147d-4cea-aa12-aa2353ee5cfc",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "72b60d68-c27e-44f4-9706-81ab514d2faa",
            "title": "> [bitvavo] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bitvavo-test.js",
            "file": "/test/generated/bitvavo-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bitvavo] connect",
                "fullTitle": " > [bitvavo] without API keys > [bitvavo] connect",
                "timedOut": false,
                "duration": 313,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f3649831-c5e9-47a5-a655-4ecb1f04f5e7",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitvavo] markets",
                "fullTitle": " > [bitvavo] without API keys > [bitvavo] markets",
                "timedOut": false,
                "duration": 2049,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "91c2d1bb-4483-42f3-91e0-f554bd1b9473",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitvavo] ticker",
                "fullTitle": " > [bitvavo] without API keys > [bitvavo] ticker",
                "timedOut": false,
                "duration": 1732,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "86a3b911-1d8a-4d85-830e-964bc4c2c584",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitvavo] tickers",
                "fullTitle": " > [bitvavo] without API keys > [bitvavo] tickers",
                "timedOut": false,
                "duration": 906,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ab06d929-cd3f-4683-861d-9052ecadeee6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitvavo] orderBook",
                "fullTitle": " > [bitvavo] without API keys > [bitvavo] orderBook",
                "timedOut": false,
                "duration": 520,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1680cea0-b442-4501-935d-38f93245f765",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitvavo] trades",
                "fullTitle": " > [bitvavo] without API keys > [bitvavo] trades",
                "timedOut": false,
                "duration": 961,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1b2c3c46-9122-427e-8f79-867b4ed10c7c",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "f3649831-c5e9-47a5-a655-4ecb1f04f5e7",
              "91c2d1bb-4483-42f3-91e0-f554bd1b9473",
              "86a3b911-1d8a-4d85-830e-964bc4c2c584",
              "ab06d929-cd3f-4683-861d-9052ecadeee6",
              "1680cea0-b442-4501-935d-38f93245f765",
              "1b2c3c46-9122-427e-8f79-867b4ed10c7c"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 6481,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "ff44ae0a-0651-4de5-8a84-b8395b3e0855",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "269aa82c-80cc-4b11-b5f4-1af2f7c92933",
            "title": "> [bleutrade] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bleutrade-test.js",
            "file": "/test/generated/bleutrade-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bleutrade] connect",
                "fullTitle": " > [bleutrade] without API keys > [bleutrade] connect",
                "timedOut": false,
                "duration": 513,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "812cb3f4-ed62-4447-a03e-be0c75e02194",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bleutrade] markets",
                "fullTitle": " > [bleutrade] without API keys > [bleutrade] markets",
                "timedOut": false,
                "duration": 1232,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "d0fa3716-8b08-42ca-a40d-97ac5a375dd5",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bleutrade] ticker",
                "fullTitle": " > [bleutrade] without API keys > [bleutrade] ticker",
                "timedOut": false,
                "duration": 1374,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "d1368851-ba1b-4d77-8438-46def12484b8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bleutrade] tickers",
                "fullTitle": " > [bleutrade] without API keys > [bleutrade] tickers",
                "timedOut": false,
                "duration": 966,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "285899cb-140e-4d67-aaf2-bf2916d347a1",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bleutrade] orderBook",
                "fullTitle": " > [bleutrade] without API keys > [bleutrade] orderBook",
                "timedOut": false,
                "duration": 942,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f17a543f-a93e-4b0c-90f3-c1321a2be8f1",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bleutrade] trades",
                "fullTitle": " > [bleutrade] without API keys > [bleutrade] trades",
                "timedOut": false,
                "duration": 9,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "4e3cf3e3-c975-417d-aec8-ff2e82853685",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "812cb3f4-ed62-4447-a03e-be0c75e02194",
              "d0fa3716-8b08-42ca-a40d-97ac5a375dd5",
              "d1368851-ba1b-4d77-8438-46def12484b8",
              "285899cb-140e-4d67-aaf2-bf2916d347a1",
              "f17a543f-a93e-4b0c-90f3-c1321a2be8f1",
              "4e3cf3e3-c975-417d-aec8-ff2e82853685"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5036,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "19535aad-2797-4244-a7f5-fa1b7ebfb14d",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "2e4c69da-00f7-4d6f-9677-825385d758c3",
            "title": "> [bittrex] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bittrex-test.js",
            "file": "/test/generated/bittrex-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bittrex] connect",
                "fullTitle": " > [bittrex] without API keys > [bittrex] connect",
                "timedOut": false,
                "duration": 280,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3f440d54-d3cf-455d-8dd2-e91526075715",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bittrex] markets",
                "fullTitle": " > [bittrex] without API keys > [bittrex] markets",
                "timedOut": false,
                "duration": 498,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0c2e04a9-9065-41b9-ae75-799c0a687a38",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bittrex] ticker",
                "fullTitle": " > [bittrex] without API keys > [bittrex] ticker",
                "timedOut": false,
                "duration": 4390,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5e86bee0-130b-4fc2-999c-afb09d57eac1",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bittrex] tickers",
                "fullTitle": " > [bittrex] without API keys > [bittrex] tickers",
                "timedOut": false,
                "duration": 1460,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "abc918de-be4b-46e5-84d2-1fcac3d03fad",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bittrex] orderBook",
                "fullTitle": " > [bittrex] without API keys > [bittrex] orderBook",
                "timedOut": false,
                "duration": 1482,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "64531c5c-69bf-4698-b397-7ad38d320c90",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bittrex] trades",
                "fullTitle": " > [bittrex] without API keys > [bittrex] trades",
                "timedOut": false,
                "duration": 1481,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f04b9b50-6b27-40ad-8d7c-98b491b72c30",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "3f440d54-d3cf-455d-8dd2-e91526075715",
              "0c2e04a9-9065-41b9-ae75-799c0a687a38",
              "5e86bee0-130b-4fc2-999c-afb09d57eac1",
              "abc918de-be4b-46e5-84d2-1fcac3d03fad",
              "64531c5c-69bf-4698-b397-7ad38d320c90",
              "f04b9b50-6b27-40ad-8d7c-98b491b72c30"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 9591,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "f7673e02-e9a2-4be0-b992-a3e1f1ecef38",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "4a63b263-1612-4cdf-8cc1-3bbc365e2f5a",
            "title": "> [btcalpha] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/btcalpha-test.js",
            "file": "/test/generated/btcalpha-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [btcalpha] connect",
                "fullTitle": " > [btcalpha] without API keys > [btcalpha] connect",
                "timedOut": false,
                "duration": 105,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "89583477-a4a5-4d27-89cd-7519650c0b4b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btcalpha] markets",
                "fullTitle": " > [btcalpha] without API keys > [btcalpha] markets",
                "timedOut": false,
                "duration": 463,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "338ce9e7-3be7-4c26-ba42-2954470c2e93",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btcalpha] ticker",
                "fullTitle": " > [btcalpha] without API keys > [btcalpha] ticker",
                "timedOut": false,
                "duration": 93,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a2d8b933-4e85-4bc8-8732-2ecaf613dd03",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btcalpha] tickers",
                "fullTitle": " > [btcalpha] without API keys > [btcalpha] tickers",
                "timedOut": false,
                "duration": 34,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "73d214da-0bd6-409f-b194-e4539540f662",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btcalpha] orderBook",
                "fullTitle": " > [btcalpha] without API keys > [btcalpha] orderBook",
                "timedOut": false,
                "duration": 3613,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "73ef665c-b49f-48aa-9aff-0affb96b09ea",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btcalpha] trades",
                "fullTitle": " > [btcalpha] without API keys > [btcalpha] trades",
                "timedOut": false,
                "duration": 1892,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "fef15e0b-1be1-4504-997a-04466478ba2d",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "89583477-a4a5-4d27-89cd-7519650c0b4b",
              "338ce9e7-3be7-4c26-ba42-2954470c2e93",
              "a2d8b933-4e85-4bc8-8732-2ecaf613dd03",
              "73d214da-0bd6-409f-b194-e4539540f662",
              "73ef665c-b49f-48aa-9aff-0affb96b09ea",
              "fef15e0b-1be1-4504-997a-04466478ba2d"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 6200,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "c67755f2-c2b2-4c1e-829c-ab64301e5429",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "f1971532-416f-4a10-a95c-afca4a341fe9",
            "title": "> [btcmarkets] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/btcmarkets-test.js",
            "file": "/test/generated/btcmarkets-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [btcmarkets] connect",
                "fullTitle": " > [btcmarkets] without API keys > [btcmarkets] connect",
                "timedOut": false,
                "duration": 192,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "07f4668f-b78c-4c5f-b686-72406e17cb5a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btcmarkets] markets",
                "fullTitle": " > [btcmarkets] without API keys > [btcmarkets] markets",
                "timedOut": false,
                "duration": 1127,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a3e80d0d-f8e7-4f98-af40-d9a2d493eb54",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btcmarkets] ticker",
                "fullTitle": " > [btcmarkets] without API keys > [btcmarkets] ticker",
                "timedOut": false,
                "duration": 1285,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "88027e34-c237-4b72-a5ba-485c5fa06e6a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btcmarkets] tickers",
                "fullTitle": " > [btcmarkets] without API keys > [btcmarkets] tickers",
                "timedOut": false,
                "duration": 23,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "816068b8-9fcf-4752-84da-61eb54043213",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btcmarkets] orderBook",
                "fullTitle": " > [btcmarkets] without API keys > [btcmarkets] orderBook",
                "timedOut": false,
                "duration": 932,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "01201aa3-af7b-4829-a95e-9a255d194be0",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btcmarkets] trades",
                "fullTitle": " > [btcmarkets] without API keys > [btcmarkets] trades",
                "timedOut": false,
                "duration": 1362,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a04b70bf-eac8-4fc0-8342-6226882b0111",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "07f4668f-b78c-4c5f-b686-72406e17cb5a",
              "a3e80d0d-f8e7-4f98-af40-d9a2d493eb54",
              "88027e34-c237-4b72-a5ba-485c5fa06e6a",
              "816068b8-9fcf-4752-84da-61eb54043213",
              "01201aa3-af7b-4829-a95e-9a255d194be0",
              "a04b70bf-eac8-4fc0-8342-6226882b0111"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 4921,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "f926d6e6-9728-47e1-b1ac-03ffa7865353",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "810e41bb-6fbe-456d-b97e-b821220d3ddb",
            "title": "> [btcturk] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/btcturk-test.js",
            "file": "/test/generated/btcturk-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [btcturk] connect",
                "fullTitle": " > [btcturk] without API keys > [btcturk] connect",
                "timedOut": false,
                "duration": 155,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "634875d5-07f0-4984-83bf-bcbc6b357dd5",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btcturk] markets",
                "fullTitle": " > [btcturk] without API keys > [btcturk] markets",
                "timedOut": false,
                "duration": 3056,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "9a71ba22-dca4-4b81-bf71-fb025a613e27",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btcturk] ticker",
                "fullTitle": " > [btcturk] without API keys > [btcturk] ticker",
                "timedOut": false,
                "duration": 1037,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "81f5a028-63c7-495e-ba7e-6d3103a15618",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btcturk] tickers",
                "fullTitle": " > [btcturk] without API keys > [btcturk] tickers",
                "timedOut": false,
                "duration": 17,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8f54641a-f9f6-4d78-88f1-cd87a2ca25f7",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btcturk] orderBook",
                "fullTitle": " > [btcturk] without API keys > [btcturk] orderBook",
                "timedOut": false,
                "duration": 22,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "45756584-4f9f-4520-9d68-42eb9eae7349",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btcturk] trades",
                "fullTitle": " > [btcturk] without API keys > [btcturk] trades",
                "timedOut": false,
                "duration": 42,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a02fc862-32f1-4243-8eec-e401ca6c403a",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "634875d5-07f0-4984-83bf-bcbc6b357dd5",
              "9a71ba22-dca4-4b81-bf71-fb025a613e27",
              "81f5a028-63c7-495e-ba7e-6d3103a15618",
              "8f54641a-f9f6-4d78-88f1-cd87a2ca25f7",
              "45756584-4f9f-4520-9d68-42eb9eae7349",
              "a02fc862-32f1-4243-8eec-e401ca6c403a"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 4329,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "f4ed2722-5277-4912-a178-a6292785c2a1",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "df45144c-ab84-4c1a-871a-4ea798e5e182",
            "title": "> [bybit] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bybit-test.js",
            "file": "/test/generated/bybit-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bybit] connect",
                "fullTitle": " > [bybit] without API keys > [bybit] connect",
                "timedOut": false,
                "duration": 96,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "4b07edf2-dfa2-4a89-a303-e4e76d09702b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bybit] markets",
                "fullTitle": " > [bybit] without API keys > [bybit] markets",
                "timedOut": false,
                "duration": 438,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "543c8e12-03e2-44d1-a6a8-6abf486241ac",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bybit] ticker",
                "fullTitle": " > [bybit] without API keys > [bybit] ticker",
                "timedOut": false,
                "duration": 518,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "03b84712-93b8-4a48-9d42-863fe42cad8f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bybit] tickers",
                "fullTitle": " > [bybit] without API keys > [bybit] tickers",
                "timedOut": false,
                "duration": 248,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "cc0e1314-cdfe-432e-b8ab-d2f1ce1dce1c",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bybit] orderBook",
                "fullTitle": " > [bybit] without API keys > [bybit] orderBook",
                "timedOut": false,
                "duration": 245,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "4c64c6ee-7945-48af-b4af-612975903267",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bybit] trades",
                "fullTitle": " > [bybit] without API keys > [bybit] trades",
                "timedOut": false,
                "duration": 562,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3aad4735-cb52-466e-911e-3f91a9795fc3",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "4b07edf2-dfa2-4a89-a303-e4e76d09702b",
              "543c8e12-03e2-44d1-a6a8-6abf486241ac",
              "03b84712-93b8-4a48-9d42-863fe42cad8f",
              "cc0e1314-cdfe-432e-b8ab-d2f1ce1dce1c",
              "4c64c6ee-7945-48af-b4af-612975903267",
              "3aad4735-cb52-466e-911e-3f91a9795fc3"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 2107,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "d9a2b3c7-9fcb-4331-bd39-c7a756575db3",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "7935648b-6a4d-438a-85de-d0223d1a29ad",
            "title": "> [bitz] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bitz-test.js",
            "file": "/test/generated/bitz-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bitz] connect",
                "fullTitle": " > [bitz] without API keys > [bitz] connect",
                "timedOut": false,
                "duration": 415,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "bfc6877a-eae8-4b65-9e98-8d9cec771185",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitz] markets",
                "fullTitle": " > [bitz] without API keys > [bitz] markets",
                "timedOut": false,
                "duration": 745,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ebbd325f-3721-4862-8fe7-7dd626596bf7",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitz] ticker",
                "fullTitle": " > [bitz] without API keys > [bitz] ticker",
                "timedOut": false,
                "duration": 3343,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "74d997e0-a64b-4fdc-bc9b-d065665b664e",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitz] tickers",
                "fullTitle": " > [bitz] without API keys > [bitz] tickers",
                "timedOut": false,
                "duration": 2223,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b21c4ecc-cb3f-45fb-a4bd-45e1f4e74759",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitz] orderBook",
                "fullTitle": " > [bitz] without API keys > [bitz] orderBook",
                "timedOut": false,
                "duration": 1743,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f2ac13c7-12ea-41d5-bf53-a5c2b2273b38",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bitz] trades",
                "fullTitle": " > [bitz] without API keys > [bitz] trades",
                "timedOut": false,
                "duration": 2114,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "969dde21-d99d-43f5-b08d-634a61c8a274",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "bfc6877a-eae8-4b65-9e98-8d9cec771185",
              "ebbd325f-3721-4862-8fe7-7dd626596bf7",
              "74d997e0-a64b-4fdc-bc9b-d065665b664e",
              "b21c4ecc-cb3f-45fb-a4bd-45e1f4e74759",
              "f2ac13c7-12ea-41d5-bf53-a5c2b2273b38",
              "969dde21-d99d-43f5-b08d-634a61c8a274"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 10583,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "7aefd8af-09d9-4098-a7f8-dad42c1e1156",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "1772cadb-05e1-446a-8d74-b8b1725198ea",
            "title": "> [braziliex] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/braziliex-test.js",
            "file": "/test/generated/braziliex-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [braziliex] connect",
                "fullTitle": " > [braziliex] without API keys > [braziliex] connect",
                "timedOut": false,
                "duration": 276,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "48d67f8b-77b4-4136-bbac-8dfac3e14c1b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [braziliex] markets",
                "fullTitle": " > [braziliex] without API keys > [braziliex] markets",
                "timedOut": false,
                "duration": 1012,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "7e2f3e18-f026-4eff-b7e1-f47216cb5ba3",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [braziliex] ticker",
                "fullTitle": " > [braziliex] without API keys > [braziliex] ticker",
                "timedOut": false,
                "duration": 3054,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "51760247-c3a2-463d-b4b0-d1dfac2c4f19",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [braziliex] tickers",
                "fullTitle": " > [braziliex] without API keys > [braziliex] tickers",
                "timedOut": false,
                "duration": 1043,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "be4ed52a-8c86-4f4b-ae89-553930a17aec",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [braziliex] orderBook",
                "fullTitle": " > [braziliex] without API keys > [braziliex] orderBook",
                "timedOut": false,
                "duration": 952,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "acada521-c15d-4fc3-ae0a-275939b9e881",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [braziliex] trades",
                "fullTitle": " > [braziliex] without API keys > [braziliex] trades",
                "timedOut": false,
                "duration": 3092,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "4bf8e647-47a3-4c76-963a-a65b0a85c8e0",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "48d67f8b-77b4-4136-bbac-8dfac3e14c1b",
              "7e2f3e18-f026-4eff-b7e1-f47216cb5ba3",
              "51760247-c3a2-463d-b4b0-d1dfac2c4f19",
              "be4ed52a-8c86-4f4b-ae89-553930a17aec",
              "acada521-c15d-4fc3-ae0a-275939b9e881",
              "4bf8e647-47a3-4c76-963a-a65b0a85c8e0"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 9429,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "ce766a55-77f0-438e-b2fa-febe376d1167",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "ffae52a5-7fee-424f-be39-43d4822b6f34",
            "title": "> [buda] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/buda-test.js",
            "file": "/test/generated/buda-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [buda] connect",
                "fullTitle": " > [buda] without API keys > [buda] connect",
                "timedOut": false,
                "duration": 175,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "415d9fd8-634b-43f3-8ff8-85100a42f60a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [buda] markets",
                "fullTitle": " > [buda] without API keys > [buda] markets",
                "timedOut": false,
                "duration": 3069,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2fd1d176-b611-434b-a87d-3a201147640a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [buda] ticker",
                "fullTitle": " > [buda] without API keys > [buda] ticker",
                "timedOut": false,
                "duration": 1145,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "aae8cdb0-45cf-400e-b4e5-94813923b927",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [buda] tickers",
                "fullTitle": " > [buda] without API keys > [buda] tickers",
                "timedOut": false,
                "duration": 57,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "fac8fb18-9b1e-477f-a66e-1d86518c84ee",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [buda] orderBook",
                "fullTitle": " > [buda] without API keys > [buda] orderBook",
                "timedOut": false,
                "duration": 358,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ec304cae-7caa-4d0d-ab5d-8f20de550a13",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [buda] trades",
                "fullTitle": " > [buda] without API keys > [buda] trades",
                "timedOut": false,
                "duration": 227,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5b31151a-b1e4-4595-b2bc-0050a34bd794",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "415d9fd8-634b-43f3-8ff8-85100a42f60a",
              "2fd1d176-b611-434b-a87d-3a201147640a",
              "aae8cdb0-45cf-400e-b4e5-94813923b927",
              "fac8fb18-9b1e-477f-a66e-1d86518c84ee",
              "ec304cae-7caa-4d0d-ab5d-8f20de550a13",
              "5b31151a-b1e4-4595-b2bc-0050a34bd794"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5031,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "590ea588-736b-4030-9a73-3ba4865b6c28",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "98868f17-e6fa-47dd-a5bb-9484b30e815f",
            "title": "> [btctradeua] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/btctradeua-test.js",
            "file": "/test/generated/btctradeua-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [btctradeua] connect",
                "fullTitle": " > [btctradeua] without API keys > [btctradeua] connect",
                "timedOut": false,
                "duration": 172,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5e71c82f-6de9-4e18-98e2-f1e8c45ba46b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btctradeua] markets",
                "fullTitle": " > [btctradeua] without API keys > [btctradeua] markets",
                "timedOut": false,
                "duration": 97,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f5234473-80bc-458a-a721-b81330f5e377",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btctradeua] ticker",
                "fullTitle": " > [btctradeua] without API keys > [btctradeua] ticker",
                "timedOut": false,
                "duration": 1139,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "99367e16-f6f1-42da-800c-8018a876e01c",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btctradeua] tickers",
                "fullTitle": " > [btctradeua] without API keys > [btctradeua] tickers",
                "timedOut": false,
                "duration": 57,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "78c9c75f-0399-477d-9d15-dbd950cb7509",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btctradeua] orderBook",
                "fullTitle": " > [btctradeua] without API keys > [btctradeua] orderBook",
                "timedOut": false,
                "duration": 5270,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "417eb5d3-9957-4acb-a1b2-3f5a1b64253a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btctradeua] trades",
                "fullTitle": " > [btctradeua] without API keys > [btctradeua] trades",
                "timedOut": false,
                "duration": 2695,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "9b3c02d2-2f1c-48b7-bcd3-58ebee0c190e",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "5e71c82f-6de9-4e18-98e2-f1e8c45ba46b",
              "f5234473-80bc-458a-a721-b81330f5e377",
              "99367e16-f6f1-42da-800c-8018a876e01c",
              "78c9c75f-0399-477d-9d15-dbd950cb7509",
              "417eb5d3-9957-4acb-a1b2-3f5a1b64253a",
              "9b3c02d2-2f1c-48b7-bcd3-58ebee0c190e"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 9430,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "1c9008f0-6ac2-43c9-9fe2-0caef729d589",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "24caa1df-971f-4d61-b825-0b940453b91c",
            "title": "> [bytetrade] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bytetrade-test.js",
            "file": "/test/generated/bytetrade-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bytetrade] connect",
                "fullTitle": " > [bytetrade] without API keys > [bytetrade] connect",
                "timedOut": false,
                "duration": 112,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "df1c045a-0b32-4884-8a89-12aa75d9fa36",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bytetrade] markets",
                "fullTitle": " > [bytetrade] without API keys > [bytetrade] markets",
                "timedOut": false,
                "duration": 1491,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "37c8e4ff-803a-444a-90e0-5590de41b8d0",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bytetrade] ticker",
                "fullTitle": " > [bytetrade] without API keys > [bytetrade] ticker",
                "timedOut": false,
                "duration": 1650,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5d1b1f89-899c-42ac-bddf-a552ef6f15b3",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bytetrade] tickers",
                "fullTitle": " > [bytetrade] without API keys > [bytetrade] tickers",
                "timedOut": false,
                "duration": 2409,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "68b5286e-04c6-48da-ba0e-4256abf98e2f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bytetrade] orderBook",
                "fullTitle": " > [bytetrade] without API keys > [bytetrade] orderBook",
                "timedOut": false,
                "duration": 523,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "807199fa-0c65-4177-964a-c21ab3b38c05",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bytetrade] trades",
                "fullTitle": " > [bytetrade] without API keys > [bytetrade] trades",
                "timedOut": false,
                "duration": 484,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0eb7bd0c-bd12-4800-bb5c-1981705a0da7",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "df1c045a-0b32-4884-8a89-12aa75d9fa36",
              "37c8e4ff-803a-444a-90e0-5590de41b8d0",
              "5d1b1f89-899c-42ac-bddf-a552ef6f15b3",
              "68b5286e-04c6-48da-ba0e-4256abf98e2f",
              "807199fa-0c65-4177-964a-c21ab3b38c05",
              "0eb7bd0c-bd12-4800-bb5c-1981705a0da7"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 6669,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "7ed19f05-2d52-4e06-a03c-1dda61981bce",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "8e9ce1b0-c280-4f88-ba3f-55c993b3b081",
            "title": "> [coinbase] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/coinbase-test.js",
            "file": "/test/generated/coinbase-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [coinbase] connect",
                "fullTitle": " > [coinbase] without API keys > [coinbase] connect",
                "timedOut": false,
                "duration": 427,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "eb27d1da-52c8-4258-9a26-1450f88373c4",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinbase] markets",
                "fullTitle": " > [coinbase] without API keys > [coinbase] markets",
                "timedOut": false,
                "duration": 2490,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2747f015-f511-4e4f-b55d-880b6d9200d2",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinbase] ticker",
                "fullTitle": " > [coinbase] without API keys > [coinbase] ticker",
                "timedOut": false,
                "duration": 1457,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f377ec7e-7cef-41be-9398-57c34a840788",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinbase] tickers",
                "fullTitle": " > [coinbase] without API keys > [coinbase] tickers",
                "timedOut": false,
                "duration": 297,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "9cff5ab6-4f94-442d-b2c7-6cbb2820acb4",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinbase] orderBook",
                "fullTitle": " > [coinbase] without API keys > [coinbase] orderBook",
                "timedOut": false,
                "duration": 208,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e6cf64d9-4e80-4590-bcdb-c25fb0e5dfae",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinbase] trades",
                "fullTitle": " > [coinbase] without API keys > [coinbase] trades",
                "timedOut": false,
                "duration": 249,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a288b7fb-c39a-4515-98e5-2cbaa6337b27",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "eb27d1da-52c8-4258-9a26-1450f88373c4",
              "2747f015-f511-4e4f-b55d-880b6d9200d2",
              "f377ec7e-7cef-41be-9398-57c34a840788",
              "9cff5ab6-4f94-442d-b2c7-6cbb2820acb4",
              "e6cf64d9-4e80-4590-bcdb-c25fb0e5dfae",
              "a288b7fb-c39a-4515-98e5-2cbaa6337b27"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5128,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "093bd595-c794-4a6d-a98e-6d8674e2d5df",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "dffb33f5-5a66-4d98-a124-961c38658df2",
            "title": "> [bw] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/bw-test.js",
            "file": "/test/generated/bw-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [bw] connect",
                "fullTitle": " > [bw] without API keys > [bw] connect",
                "timedOut": false,
                "duration": 100,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ec0683c6-d4fe-4ead-abe2-318270f5ddec",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bw] markets",
                "fullTitle": " > [bw] without API keys > [bw] markets",
                "timedOut": false,
                "duration": 911,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "23b379a3-4b97-4524-92ab-2a1cd2b7075f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bw] ticker",
                "fullTitle": " > [bw] without API keys > [bw] ticker",
                "timedOut": false,
                "duration": 3981,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "340ab0df-2b6d-480a-9bf0-38ba9ce4a88a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bw] tickers",
                "fullTitle": " > [bw] without API keys > [bw] tickers",
                "timedOut": false,
                "duration": 2653,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c0858ba5-7b7b-4af1-ae1a-15b6be0d5aa1",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bw] orderBook",
                "fullTitle": " > [bw] without API keys > [bw] orderBook",
                "timedOut": false,
                "duration": 1166,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b66aba64-0d49-4ad0-9038-4f629e594693",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [bw] trades",
                "fullTitle": " > [bw] without API keys > [bw] trades",
                "timedOut": false,
                "duration": 1388,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3fb2bd74-7a03-4d5d-b096-4843e2336b55",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "ec0683c6-d4fe-4ead-abe2-318270f5ddec",
              "23b379a3-4b97-4524-92ab-2a1cd2b7075f",
              "340ab0df-2b6d-480a-9bf0-38ba9ce4a88a",
              "c0858ba5-7b7b-4af1-ae1a-15b6be0d5aa1",
              "b66aba64-0d49-4ad0-9038-4f629e594693",
              "3fb2bd74-7a03-4d5d-b096-4843e2336b55"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 10199,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "1d5bb367-5a72-4677-a3c7-30027e818fd9",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "26d80221-10b7-4f22-bb57-8a05fef0cd40",
            "title": "> [coincheck] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/coincheck-test.js",
            "file": "/test/generated/coincheck-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [coincheck] connect",
                "fullTitle": " > [coincheck] without API keys > [coincheck] connect",
                "timedOut": false,
                "duration": 1324,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ce4db231-1fa6-4fd1-95d2-61f04b37225a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coincheck] markets",
                "fullTitle": " > [coincheck] without API keys > [coincheck] markets",
                "timedOut": false,
                "duration": 65,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "aa83d4da-55a5-40b0-a89a-52809eb00bb8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coincheck] ticker",
                "fullTitle": " > [coincheck] without API keys > [coincheck] ticker",
                "timedOut": false,
                "duration": 471,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "70bc891d-f312-435a-9849-ec4aab8406a3",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coincheck] tickers",
                "fullTitle": " > [coincheck] without API keys > [coincheck] tickers",
                "timedOut": false,
                "duration": 8,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "13360efd-e326-415a-9299-37aa942542a1",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coincheck] orderBook",
                "fullTitle": " > [coincheck] without API keys > [coincheck] orderBook",
                "timedOut": false,
                "duration": 1235,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ab8f5ee4-55d5-4595-ae88-ab79ab43c1db",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coincheck] trades",
                "fullTitle": " > [coincheck] without API keys > [coincheck] trades",
                "timedOut": false,
                "duration": 1116,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "aa1b8d26-a49e-46fb-b9d8-d99723ca3e35",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "ce4db231-1fa6-4fd1-95d2-61f04b37225a",
              "aa83d4da-55a5-40b0-a89a-52809eb00bb8",
              "70bc891d-f312-435a-9849-ec4aab8406a3",
              "13360efd-e326-415a-9299-37aa942542a1",
              "ab8f5ee4-55d5-4595-ae88-ab79ab43c1db",
              "aa1b8d26-a49e-46fb-b9d8-d99723ca3e35"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 4219,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "c7ee3864-4b2b-4e7a-87ee-c47d7d726ae6",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "f10ebd8d-aa90-4195-9a7b-cf93ab66b566",
            "title": "> [coinbaseprime] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/coinbaseprime-test.js",
            "file": "/test/generated/coinbaseprime-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [coinbaseprime] connect",
                "fullTitle": " > [coinbaseprime] without API keys > [coinbaseprime] connect",
                "timedOut": false,
                "duration": 392,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "82edbeac-9829-4b8a-8cc8-194e3df0f912",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinbaseprime] markets",
                "fullTitle": " > [coinbaseprime] without API keys > [coinbaseprime] markets",
                "timedOut": false,
                "duration": 2549,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b640b2c0-d7f2-42b6-9ed5-f2fe49687320",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinbaseprime] ticker",
                "fullTitle": " > [coinbaseprime] without API keys > [coinbaseprime] ticker",
                "timedOut": false,
                "duration": 1063,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1daa0202-6ea6-4a55-8714-39a5e98f35bd",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinbaseprime] tickers",
                "fullTitle": " > [coinbaseprime] without API keys > [coinbaseprime] tickers",
                "timedOut": false,
                "duration": 15,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "d0d9768b-3e93-4e84-b05d-d336584ccacd",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinbaseprime] orderBook",
                "fullTitle": " > [coinbaseprime] without API keys > [coinbaseprime] orderBook",
                "timedOut": false,
                "duration": 966,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3af2c7cc-fee6-4d77-aae4-e79ce6314273",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinbaseprime] trades",
                "fullTitle": " > [coinbaseprime] without API keys > [coinbaseprime] trades",
                "timedOut": false,
                "duration": 1004,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e6171ccd-9cd9-4c32-a806-70afd511ca5e",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "82edbeac-9829-4b8a-8cc8-194e3df0f912",
              "b640b2c0-d7f2-42b6-9ed5-f2fe49687320",
              "1daa0202-6ea6-4a55-8714-39a5e98f35bd",
              "d0d9768b-3e93-4e84-b05d-d336584ccacd",
              "3af2c7cc-fee6-4d77-aae4-e79ce6314273",
              "e6171ccd-9cd9-4c32-a806-70afd511ca5e"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5989,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "e92dc952-8627-4d2c-89b2-d3218dbd4637",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "c9a4d41f-4d65-4f25-88a4-e43d883deb62",
            "title": "> [chilebit] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/chilebit-test.js",
            "file": "/test/generated/chilebit-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [chilebit] connect",
                "fullTitle": " > [chilebit] without API keys > [chilebit] connect",
                "timedOut": false,
                "duration": 187,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "07ec0dd3-1736-4281-9014-ae31114d5b82",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [chilebit] markets",
                "fullTitle": " > [chilebit] without API keys > [chilebit] markets",
                "timedOut": false,
                "duration": 74,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a60ad7dd-c685-44b2-9ddd-06167f891be0",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [chilebit] ticker",
                "fullTitle": " > [chilebit] without API keys > [chilebit] ticker",
                "timedOut": false,
                "duration": 385,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3019d8f2-1135-4c8e-881b-2b52359d739b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [chilebit] tickers",
                "fullTitle": " > [chilebit] without API keys > [chilebit] tickers",
                "timedOut": false,
                "duration": 101,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "652129a5-d82c-4245-a587-6b6ecf569733",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [chilebit] orderBook",
                "fullTitle": " > [chilebit] without API keys > [chilebit] orderBook",
                "timedOut": false,
                "duration": 2302,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "34a2ec38-e953-4b17-bc67-7c5552dd1c71",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [chilebit] trades",
                "fullTitle": " > [chilebit] without API keys > [chilebit] trades",
                "timedOut": false,
                "duration": 3872,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "344b393b-f44b-4459-934f-c5f091f336d0",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "07ec0dd3-1736-4281-9014-ae31114d5b82",
              "a60ad7dd-c685-44b2-9ddd-06167f891be0",
              "3019d8f2-1135-4c8e-881b-2b52359d739b",
              "652129a5-d82c-4245-a587-6b6ecf569733",
              "34a2ec38-e953-4b17-bc67-7c5552dd1c71",
              "344b393b-f44b-4459-934f-c5f091f336d0"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 6921,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "ff0288e3-026f-45f2-87a2-58907c77014e",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "8f2ed16f-c831-4ee6-9a7f-1a1de9247cbe",
            "title": "> [coinbasepro] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/coinbasepro-test.js",
            "file": "/test/generated/coinbasepro-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [coinbasepro] connect",
                "fullTitle": " > [coinbasepro] without API keys > [coinbasepro] connect",
                "timedOut": false,
                "duration": 1843,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "18c361fe-0125-4677-849b-0c790674de7f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinbasepro] markets",
                "fullTitle": " > [coinbasepro] without API keys > [coinbasepro] markets",
                "timedOut": false,
                "duration": 554,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c2be61d3-9e77-468d-a1d2-229ee6a26247",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinbasepro] ticker",
                "fullTitle": " > [coinbasepro] without API keys > [coinbasepro] ticker",
                "timedOut": false,
                "duration": 1336,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "bf4b0356-6ecd-41c7-a026-c470d328c9b3",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinbasepro] tickers",
                "fullTitle": " > [coinbasepro] without API keys > [coinbasepro] tickers",
                "timedOut": false,
                "duration": 19,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "9e28250d-91f3-4a20-a3cb-f829eb715951",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinbasepro] orderBook",
                "fullTitle": " > [coinbasepro] without API keys > [coinbasepro] orderBook",
                "timedOut": false,
                "duration": 967,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ffc398c9-27c1-417c-8aad-7bbf1a327c86",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinbasepro] trades",
                "fullTitle": " > [coinbasepro] without API keys > [coinbasepro] trades",
                "timedOut": false,
                "duration": 1027,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ca0a0786-ab8e-4998-a93d-058ca14d34b8",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "18c361fe-0125-4677-849b-0c790674de7f",
              "c2be61d3-9e77-468d-a1d2-229ee6a26247",
              "bf4b0356-6ecd-41c7-a026-c470d328c9b3",
              "9e28250d-91f3-4a20-a3cb-f829eb715951",
              "ffc398c9-27c1-417c-8aad-7bbf1a327c86",
              "ca0a0786-ab8e-4998-a93d-058ca14d34b8"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5746,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "45b21b48-370c-4d6c-ada2-141a75cd2ac0",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "36431176-ceaf-4ab5-8193-71049b5a1ff9",
            "title": "> [coinfloor] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/coinfloor-test.js",
            "file": "/test/generated/coinfloor-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [coinfloor] connect",
                "fullTitle": " > [coinfloor] without API keys > [coinfloor] connect",
                "timedOut": false,
                "duration": 96,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3ae2ef86-15cb-43ea-9502-dfb6bc442c96",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinfloor] markets",
                "fullTitle": " > [coinfloor] without API keys > [coinfloor] markets",
                "timedOut": false,
                "duration": 15,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "af5544c7-7f0f-4878-8b43-4d3039f44bf7",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinfloor] ticker",
                "fullTitle": " > [coinfloor] without API keys > [coinfloor] ticker",
                "timedOut": false,
                "duration": 504,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8d87fcfe-d892-4a5f-87a2-7083e644b8e2",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinfloor] tickers",
                "fullTitle": " > [coinfloor] without API keys > [coinfloor] tickers",
                "timedOut": false,
                "duration": 5,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "edc02d1c-45ad-4910-82cd-86728dde5241",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinfloor] orderBook",
                "fullTitle": " > [coinfloor] without API keys > [coinfloor] orderBook",
                "timedOut": false,
                "duration": 553,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "cbaff196-cb52-4ef1-95ef-2dff144107ba",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinfloor] trades",
                "fullTitle": " > [coinfloor] without API keys > [coinfloor] trades",
                "timedOut": false,
                "duration": 992,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "dc67569a-e70c-4ed7-ad9e-f1eb9ffe5288",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "3ae2ef86-15cb-43ea-9502-dfb6bc442c96",
              "af5544c7-7f0f-4878-8b43-4d3039f44bf7",
              "8d87fcfe-d892-4a5f-87a2-7083e644b8e2",
              "edc02d1c-45ad-4910-82cd-86728dde5241",
              "cbaff196-cb52-4ef1-95ef-2dff144107ba",
              "dc67569a-e70c-4ed7-ad9e-f1eb9ffe5288"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 2165,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "b9f909d1-996c-49da-bbf3-8cf125891854",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "69c64f13-3990-4dea-8a28-b548b4a77e7d",
            "title": "> [coinex] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/coinex-test.js",
            "file": "/test/generated/coinex-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [coinex] connect",
                "fullTitle": " > [coinex] without API keys > [coinex] connect",
                "timedOut": false,
                "duration": 48,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "265da4ac-8cb2-4bcc-a15e-1a6981176c24",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinex] markets",
                "fullTitle": " > [coinex] without API keys > [coinex] markets",
                "timedOut": false,
                "duration": 574,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b543234f-098f-4a74-b62a-0dcb53d36a59",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinex] ticker",
                "fullTitle": " > [coinex] without API keys > [coinex] ticker",
                "timedOut": false,
                "duration": 1604,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "cbd01bd6-aea5-4c34-b056-7809684ae8c5",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinex] tickers",
                "fullTitle": " > [coinex] without API keys > [coinex] tickers",
                "timedOut": false,
                "duration": 1045,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2a153d7b-8b21-478d-92f9-72236c2e1f97",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinex] orderBook",
                "fullTitle": " > [coinex] without API keys > [coinex] orderBook",
                "timedOut": false,
                "duration": 942,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "4801a2db-d3f6-47c5-8ad8-1b88749f3113",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinex] trades",
                "fullTitle": " > [coinex] without API keys > [coinex] trades",
                "timedOut": false,
                "duration": 1016,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a98d44c5-a396-4d68-84fd-e51805b2f6ec",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "265da4ac-8cb2-4bcc-a15e-1a6981176c24",
              "b543234f-098f-4a74-b62a-0dcb53d36a59",
              "cbd01bd6-aea5-4c34-b056-7809684ae8c5",
              "2a153d7b-8b21-478d-92f9-72236c2e1f97",
              "4801a2db-d3f6-47c5-8ad8-1b88749f3113",
              "a98d44c5-a396-4d68-84fd-e51805b2f6ec"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5229,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "421e7cfa-06c4-45f3-a7a3-d104026849fb",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "64e0ee82-88a8-483f-bd4b-072697ceaedc",
            "title": "> [coinspot] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/coinspot-test.js",
            "file": "/test/generated/coinspot-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [coinspot] connect",
                "fullTitle": " > [coinspot] without API keys > [coinspot] connect",
                "timedOut": false,
                "duration": 134,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "145f596b-3f34-44c9-8bae-97219bf0718b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinspot] markets",
                "fullTitle": " > [coinspot] without API keys > [coinspot] markets",
                "timedOut": false,
                "duration": 11,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b59ae6d8-ae2a-4ea5-81f4-eeda8ac55f1c",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinspot] ticker",
                "fullTitle": " > [coinspot] without API keys > [coinspot] ticker",
                "timedOut": false,
                "duration": 10,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "cea0cd68-8bd3-4dc6-8166-7656f9e1363d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinspot] tickers",
                "fullTitle": " > [coinspot] without API keys > [coinspot] tickers",
                "timedOut": false,
                "duration": 5,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "198fe31d-bc4a-4c56-9113-493314b426fd",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinspot] orderBook",
                "fullTitle": " > [coinspot] without API keys > [coinspot] orderBook",
                "timedOut": false,
                "duration": 916,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "857b09be-3b7e-44f3-9610-47c0b75cca6a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinspot] trades",
                "fullTitle": " > [coinspot] without API keys > [coinspot] trades",
                "timedOut": false,
                "duration": 1008,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b91926a6-3d55-4685-ba0b-da37b0c4e8dd",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "145f596b-3f34-44c9-8bae-97219bf0718b",
              "b59ae6d8-ae2a-4ea5-81f4-eeda8ac55f1c",
              "cea0cd68-8bd3-4dc6-8166-7656f9e1363d",
              "198fe31d-bc4a-4c56-9113-493314b426fd",
              "857b09be-3b7e-44f3-9610-47c0b75cca6a",
              "b91926a6-3d55-4685-ba0b-da37b0c4e8dd"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 2084,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "17d20ecc-c700-4a1a-bf68-1354ff6fc706",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "abf8dfcb-29f7-4b02-9808-dee6d611b75c",
            "title": "> [coinfalcon] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/coinfalcon-test.js",
            "file": "/test/generated/coinfalcon-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [coinfalcon] connect",
                "fullTitle": " > [coinfalcon] without API keys > [coinfalcon] connect",
                "timedOut": false,
                "duration": 39,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a0c76a38-2ad7-4729-bbaf-0165f49b4748",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinfalcon] markets",
                "fullTitle": " > [coinfalcon] without API keys > [coinfalcon] markets",
                "timedOut": false,
                "duration": 324,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "001c9325-64d0-4e03-aa5e-b49b3c96229a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinfalcon] ticker",
                "fullTitle": " > [coinfalcon] without API keys > [coinfalcon] ticker",
                "timedOut": false,
                "duration": 1835,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5fb1a42f-2010-4885-9811-6df722f9c773",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinfalcon] tickers",
                "fullTitle": " > [coinfalcon] without API keys > [coinfalcon] tickers",
                "timedOut": false,
                "duration": 1033,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c992e45a-cd35-4ef4-829a-a458e8c3be00",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinfalcon] orderBook",
                "fullTitle": " > [coinfalcon] without API keys > [coinfalcon] orderBook",
                "timedOut": false,
                "duration": 980,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "42ef3f83-7ea8-4356-b60f-cf3e478053ff",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinfalcon] trades",
                "fullTitle": " > [coinfalcon] without API keys > [coinfalcon] trades",
                "timedOut": false,
                "duration": 1109,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "242cd9ca-4404-48f9-b96d-803cf0c1f9c2",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "a0c76a38-2ad7-4729-bbaf-0165f49b4748",
              "001c9325-64d0-4e03-aa5e-b49b3c96229a",
              "5fb1a42f-2010-4885-9811-6df722f9c773",
              "c992e45a-cd35-4ef4-829a-a458e8c3be00",
              "42ef3f83-7ea8-4356-b60f-cf3e478053ff",
              "242cd9ca-4404-48f9-b96d-803cf0c1f9c2"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5320,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "a18c5818-5e8e-41f0-83de-86e1d23ff41f",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "1984b830-19cb-4f43-a0d1-7a59f5de73d7",
            "title": "> [coingi] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/coingi-test.js",
            "file": "/test/generated/coingi-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [coingi] connect",
                "fullTitle": " > [coingi] without API keys > [coingi] connect",
                "timedOut": false,
                "duration": 56,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b07ed8eb-3616-487b-87d6-52c1649758f6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coingi] markets",
                "fullTitle": " > [coingi] without API keys > [coingi] markets",
                "timedOut": false,
                "duration": 3102,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2ba64905-aa6f-44ab-9cba-fdad4a227c59",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coingi] ticker",
                "fullTitle": " > [coingi] without API keys > [coingi] ticker",
                "timedOut": false,
                "duration": 1118,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ebde56c4-c1ee-4658-99b8-9bf36a251f48",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coingi] tickers",
                "fullTitle": " > [coingi] without API keys > [coingi] tickers",
                "timedOut": false,
                "duration": 216,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c74b7ff1-09c5-4e74-b80a-84419fc5ae9f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coingi] orderBook",
                "fullTitle": " > [coingi] without API keys > [coingi] orderBook",
                "timedOut": false,
                "duration": 70,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "27c54874-fca3-4ec0-bfce-abbc9c786427",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coingi] trades",
                "fullTitle": " > [coingi] without API keys > [coingi] trades",
                "timedOut": false,
                "duration": 34,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "20173061-1460-4dca-93f0-ac2ae12958df",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "b07ed8eb-3616-487b-87d6-52c1649758f6",
              "2ba64905-aa6f-44ab-9cba-fdad4a227c59",
              "ebde56c4-c1ee-4658-99b8-9bf36a251f48",
              "c74b7ff1-09c5-4e74-b80a-84419fc5ae9f",
              "27c54874-fca3-4ec0-bfce-abbc9c786427",
              "20173061-1460-4dca-93f0-ac2ae12958df"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 4596,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "6fa349a7-e2be-4e57-98c3-77eb5ed1a990",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "7e30b6fc-f255-46d2-b3dc-010bb993faf7",
            "title": "> [coinone] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/coinone-test.js",
            "file": "/test/generated/coinone-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [coinone] connect",
                "fullTitle": " > [coinone] without API keys > [coinone] connect",
                "timedOut": false,
                "duration": 101,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "bb2456d9-e803-49b7-948b-2257395cef3b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinone] markets",
                "fullTitle": " > [coinone] without API keys > [coinone] markets",
                "timedOut": false,
                "duration": 406,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a6802eb0-8219-4d6e-bb4f-ca78e8373cf9",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinone] ticker",
                "fullTitle": " > [coinone] without API keys > [coinone] ticker",
                "timedOut": false,
                "duration": 1135,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "7abaf8e4-9776-4558-93ff-bd34165bd5b7",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinone] tickers",
                "fullTitle": " > [coinone] without API keys > [coinone] tickers",
                "timedOut": false,
                "duration": 915,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "83972c88-c4ed-4991-92f4-af4eb1cc5da6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinone] orderBook",
                "fullTitle": " > [coinone] without API keys > [coinone] orderBook",
                "timedOut": false,
                "duration": 441,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f0c1b7f9-d60d-4e3e-b8ea-2eacc2757787",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinone] trades",
                "fullTitle": " > [coinone] without API keys > [coinone] trades",
                "timedOut": false,
                "duration": 835,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6d152cb5-8657-4eca-8b1e-3439eee27330",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "bb2456d9-e803-49b7-948b-2257395cef3b",
              "a6802eb0-8219-4d6e-bb4f-ca78e8373cf9",
              "7abaf8e4-9776-4558-93ff-bd34165bd5b7",
              "83972c88-c4ed-4991-92f4-af4eb1cc5da6",
              "f0c1b7f9-d60d-4e3e-b8ea-2eacc2757787",
              "6d152cb5-8657-4eca-8b1e-3439eee27330"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 3833,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "85f1ebe5-07e6-4e57-b893-30258fe7e4df",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "42a91209-446d-45b2-893c-a59e72a5c6b1",
            "title": "> [coinmate] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/coinmate-test.js",
            "file": "/test/generated/coinmate-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [coinmate] connect",
                "fullTitle": " > [coinmate] without API keys > [coinmate] connect",
                "timedOut": false,
                "duration": 75,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "9427a106-2687-44b1-8b3e-f9334ce7ae6b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinmate] markets",
                "fullTitle": " > [coinmate] without API keys > [coinmate] markets",
                "timedOut": false,
                "duration": 568,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "7ff69a3f-c8d1-4a5d-ae25-7a45c607d119",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinmate] ticker",
                "fullTitle": " > [coinmate] without API keys > [coinmate] ticker",
                "timedOut": false,
                "duration": 1541,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "15e6c4c9-4d5b-44b9-ae4b-896934bfbcff",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinmate] tickers",
                "fullTitle": " > [coinmate] without API keys > [coinmate] tickers",
                "timedOut": false,
                "duration": 12,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2a8ef1aa-eb58-4a16-8969-76029f04ea49",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinmate] orderBook",
                "fullTitle": " > [coinmate] without API keys > [coinmate] orderBook",
                "timedOut": false,
                "duration": 965,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2204b41a-a95e-42a0-9b5e-df202e22aadc",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinmate] trades",
                "fullTitle": " > [coinmate] without API keys > [coinmate] trades",
                "timedOut": false,
                "duration": 1007,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "9054ab95-46a0-43db-ad9a-0687ee6629dd",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "9427a106-2687-44b1-8b3e-f9334ce7ae6b",
              "7ff69a3f-c8d1-4a5d-ae25-7a45c607d119",
              "15e6c4c9-4d5b-44b9-ae4b-896934bfbcff",
              "2a8ef1aa-eb58-4a16-8969-76029f04ea49",
              "2204b41a-a95e-42a0-9b5e-df202e22aadc",
              "9054ab95-46a0-43db-ad9a-0687ee6629dd"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 4168,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "dc0491a7-410a-4288-80a5-3df8bc69d23f",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "b40f873d-e61d-4f99-9143-ba1e2efeba00",
            "title": "> [cex] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/cex-test.js",
            "file": "/test/generated/cex-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [cex] connect",
                "fullTitle": " > [cex] without API keys > [cex] connect",
                "timedOut": false,
                "duration": 79,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1691595d-eccf-4732-bf71-eae760b6f72d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [cex] markets",
                "fullTitle": " > [cex] without API keys > [cex] markets",
                "timedOut": false,
                "duration": 1668,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "bd2ad6ca-4efe-4c84-9d82-d002d40fc12a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [cex] ticker",
                "fullTitle": " > [cex] without API keys > [cex] ticker",
                "timedOut": false,
                "duration": 7724,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6b4ad566-a7dc-4844-bd13-db11859fca3b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [cex] tickers",
                "fullTitle": " > [cex] without API keys > [cex] tickers",
                "timedOut": false,
                "duration": 1553,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "812f6c48-b726-45ee-a440-0d1df17eb41f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [cex] orderBook",
                "fullTitle": " > [cex] without API keys > [cex] orderBook",
                "timedOut": false,
                "duration": 1447,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0965c9c2-0efd-4060-93ed-8cd1273d2722",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [cex] trades",
                "fullTitle": " > [cex] without API keys > [cex] trades",
                "timedOut": false,
                "duration": 1907,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6572c47d-5e0b-4000-ba9e-2994885fc786",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "1691595d-eccf-4732-bf71-eae760b6f72d",
              "bd2ad6ca-4efe-4c84-9d82-d002d40fc12a",
              "6b4ad566-a7dc-4844-bd13-db11859fca3b",
              "812f6c48-b726-45ee-a440-0d1df17eb41f",
              "0965c9c2-0efd-4060-93ed-8cd1273d2722",
              "6572c47d-5e0b-4000-ba9e-2994885fc786"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 14378,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "1632b346-9517-4703-8adf-3ee8fd5c2c70",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "ed894726-41b7-4003-8916-137107dea8da",
            "title": "> [coinegg] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/coinegg-test.js",
            "file": "/test/generated/coinegg-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [coinegg] connect",
                "fullTitle": " > [coinegg] without API keys > [coinegg] connect",
                "timedOut": false,
                "duration": 136,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e427cd1b-1725-49e6-92dd-d0213545b815",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinegg] markets",
                "fullTitle": " > [coinegg] without API keys > [coinegg] markets",
                "timedOut": false,
                "duration": 6129,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "29cf4c18-e28d-4306-a18e-01b2fce8958d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinegg] ticker",
                "fullTitle": " > [coinegg] without API keys > [coinegg] ticker",
                "timedOut": false,
                "duration": 2371,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "681c2560-ac0a-4045-a40c-b3777dea7e9d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinegg] tickers",
                "fullTitle": " > [coinegg] without API keys > [coinegg] tickers",
                "timedOut": false,
                "duration": 50,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b4c1795a-ec39-46f5-b6e9-2bc48c5cc163",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinegg] orderBook",
                "fullTitle": " > [coinegg] without API keys > [coinegg] orderBook",
                "timedOut": false,
                "duration": 151,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8ad1dfde-9643-4c7f-bf7f-c448a0d74bd7",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinegg] trades",
                "fullTitle": " > [coinegg] without API keys > [coinegg] trades",
                "timedOut": false,
                "duration": 138,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "9ae8d867-bdda-4073-9486-f4c23d306dd8",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "e427cd1b-1725-49e6-92dd-d0213545b815",
              "29cf4c18-e28d-4306-a18e-01b2fce8958d",
              "681c2560-ac0a-4045-a40c-b3777dea7e9d",
              "b4c1795a-ec39-46f5-b6e9-2bc48c5cc163",
              "8ad1dfde-9643-4c7f-bf7f-c448a0d74bd7",
              "9ae8d867-bdda-4073-9486-f4c23d306dd8"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 8975,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "6d62d26e-56c3-44a8-a8d0-3b5b2eb5bb45",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "a64f6b10-6f13-4338-9829-ba7c6d86c9d5",
            "title": "> [coss] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/coss-test.js",
            "file": "/test/generated/coss-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [coss] connect",
                "fullTitle": " > [coss] without API keys > [coss] connect",
                "timedOut": false,
                "duration": 358,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6b2825c0-a3f0-445a-9cda-3058719439f8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coss] markets",
                "fullTitle": " > [coss] without API keys > [coss] markets",
                "timedOut": false,
                "duration": 3882,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b9deca16-2d09-4bc8-a30b-26d3247cc152",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coss] ticker",
                "fullTitle": " > [coss] without API keys > [coss] ticker",
                "timedOut": false,
                "duration": 1073,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "521dc8ff-6e2d-4807-a5d1-24e533e4df19",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coss] tickers",
                "fullTitle": " > [coss] without API keys > [coss] tickers",
                "timedOut": false,
                "duration": 58,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8e02ce7a-4fa1-48bd-b1e3-f7a13ac343f2",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coss] orderBook",
                "fullTitle": " > [coss] without API keys > [coss] orderBook",
                "timedOut": false,
                "duration": 49,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f03a2473-1041-4f8e-9cb6-7c8c004e4f37",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coss] trades",
                "fullTitle": " > [coss] without API keys > [coss] trades",
                "timedOut": false,
                "duration": 55,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e6f261c2-168f-4aa2-b8ee-1917c83931f9",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "6b2825c0-a3f0-445a-9cda-3058719439f8",
              "b9deca16-2d09-4bc8-a30b-26d3247cc152",
              "521dc8ff-6e2d-4807-a5d1-24e533e4df19",
              "8e02ce7a-4fa1-48bd-b1e3-f7a13ac343f2",
              "f03a2473-1041-4f8e-9cb6-7c8c004e4f37",
              "e6f261c2-168f-4aa2-b8ee-1917c83931f9"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5475,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "4efdc555-0f58-4e3c-9e46-db9ad938c6b3",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "34408d1a-8c29-4d03-81de-a00cdd5a611c",
            "title": "> [eterbase] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/eterbase-test.js",
            "file": "/test/generated/eterbase-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [eterbase] connect",
                "fullTitle": " > [eterbase] without API keys > [eterbase] connect",
                "timedOut": false,
                "duration": 291,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "60752f09-178d-4124-a2fb-f56c25581bde",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [eterbase] markets",
                "fullTitle": " > [eterbase] without API keys > [eterbase] markets",
                "timedOut": false,
                "duration": 438,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "137d4f20-31d1-4f90-89e4-4d52cff57582",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [eterbase] ticker",
                "fullTitle": " > [eterbase] without API keys > [eterbase] ticker",
                "timedOut": false,
                "duration": 1877,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5b6701c6-d325-455b-af69-bd0d7be99116",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [eterbase] tickers",
                "fullTitle": " > [eterbase] without API keys > [eterbase] tickers",
                "timedOut": false,
                "duration": 406,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "51ddc48d-b8a8-45a3-8d40-089e1a5be3ca",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [eterbase] orderBook",
                "fullTitle": " > [eterbase] without API keys > [eterbase] orderBook",
                "timedOut": false,
                "duration": 561,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "98d6a0ac-53f4-4526-aa0b-f18932ec37c8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [eterbase] trades",
                "fullTitle": " > [eterbase] without API keys > [eterbase] trades",
                "timedOut": false,
                "duration": 776,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0652d8d9-bc84-4896-8f3e-75efb1a31701",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "60752f09-178d-4124-a2fb-f56c25581bde",
              "137d4f20-31d1-4f90-89e4-4d52cff57582",
              "5b6701c6-d325-455b-af69-bd0d7be99116",
              "51ddc48d-b8a8-45a3-8d40-089e1a5be3ca",
              "98d6a0ac-53f4-4526-aa0b-f18932ec37c8",
              "0652d8d9-bc84-4896-8f3e-75efb1a31701"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 4349,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "ccb579ef-453a-481e-829b-6fc19136581c",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "6bdf210c-2a76-44e2-b44b-d041857d675a",
            "title": "> [deribit] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/deribit-test.js",
            "file": "/test/generated/deribit-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [deribit] connect",
                "fullTitle": " > [deribit] without API keys > [deribit] connect",
                "timedOut": false,
                "duration": 203,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8e8663a1-fa5f-4439-902c-f6babef74981",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [deribit] markets",
                "fullTitle": " > [deribit] without API keys > [deribit] markets",
                "timedOut": false,
                "duration": 2889,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "7aa39d8c-5155-46e5-bbd2-25b56f3c08de",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [deribit] ticker",
                "fullTitle": " > [deribit] without API keys > [deribit] ticker",
                "timedOut": false,
                "duration": 1663,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "4565c984-9e94-4240-84e5-ca04a368408f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [deribit] tickers",
                "fullTitle": " > [deribit] without API keys > [deribit] tickers",
                "timedOut": false,
                "duration": 863,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "64fe9569-9c36-4825-94ab-230166c21899",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [deribit] orderBook",
                "fullTitle": " > [deribit] without API keys > [deribit] orderBook",
                "timedOut": false,
                "duration": 307,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "040ef67b-7d57-43bb-8af6-17052512540d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [deribit] trades",
                "fullTitle": " > [deribit] without API keys > [deribit] trades",
                "timedOut": false,
                "duration": 496,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "9b7e6117-167e-4a26-8a4d-ad0b3737979d",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "8e8663a1-fa5f-4439-902c-f6babef74981",
              "7aa39d8c-5155-46e5-bbd2-25b56f3c08de",
              "4565c984-9e94-4240-84e5-ca04a368408f",
              "64fe9569-9c36-4825-94ab-230166c21899",
              "040ef67b-7d57-43bb-8af6-17052512540d",
              "9b7e6117-167e-4a26-8a4d-ad0b3737979d"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 6421,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "8548da6c-68aa-49cd-9e78-c7db8e348ffe",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "95ec017f-7974-4482-ba06-c682b8875c03",
            "title": "> [digifinex] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/digifinex-test.js",
            "file": "/test/generated/digifinex-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [digifinex] connect",
                "fullTitle": " > [digifinex] without API keys > [digifinex] connect",
                "timedOut": false,
                "duration": 796,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "7bcc03ca-0d19-498c-a258-3f23b49bdc0d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [digifinex] markets",
                "fullTitle": " > [digifinex] without API keys > [digifinex] markets",
                "timedOut": false,
                "duration": 1545,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0c18e3c0-3278-4734-baa6-3c80f9db2e37",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [digifinex] ticker",
                "fullTitle": " > [digifinex] without API keys > [digifinex] ticker",
                "timedOut": false,
                "duration": 312,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c5ae3f39-fa35-4c69-a458-b62670aa1210",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [digifinex] tickers",
                "fullTitle": " > [digifinex] without API keys > [digifinex] tickers",
                "timedOut": false,
                "duration": 45,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "968c4abe-8e0e-4bb1-9ee0-83fc6ea1a4b5",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [digifinex] orderBook",
                "fullTitle": " > [digifinex] without API keys > [digifinex] orderBook",
                "timedOut": false,
                "duration": 2476,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "92284b0f-9cf8-4482-9746-2e6660ecdd88",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [digifinex] trades",
                "fullTitle": " > [digifinex] without API keys > [digifinex] trades",
                "timedOut": false,
                "duration": 1006,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "97e5e182-a0ea-4584-a49e-1e14c30d7ce8",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "7bcc03ca-0d19-498c-a258-3f23b49bdc0d",
              "0c18e3c0-3278-4734-baa6-3c80f9db2e37",
              "c5ae3f39-fa35-4c69-a458-b62670aa1210",
              "968c4abe-8e0e-4bb1-9ee0-83fc6ea1a4b5",
              "92284b0f-9cf8-4482-9746-2e6660ecdd88",
              "97e5e182-a0ea-4584-a49e-1e14c30d7ce8"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 6180,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "0a3a691a-94a8-4fac-bb91-d187fce99914",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "e20945b7-8fac-4e78-8237-aa16baec8cdc",
            "title": "> [dsx] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/dsx-test.js",
            "file": "/test/generated/dsx-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [dsx] connect",
                "fullTitle": " > [dsx] without API keys > [dsx] connect",
                "timedOut": false,
                "duration": 578,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "4746368d-4a6f-4632-8f07-0bedd8b686cc",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [dsx] markets",
                "fullTitle": " > [dsx] without API keys > [dsx] markets",
                "timedOut": false,
                "duration": 899,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "81e1919a-5670-4797-b642-d572518a1f73",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [dsx] ticker",
                "fullTitle": " > [dsx] without API keys > [dsx] ticker",
                "timedOut": false,
                "duration": 2250,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "bfef7495-904c-4c65-86af-cdb0d0c945e7",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [dsx] tickers",
                "fullTitle": " > [dsx] without API keys > [dsx] tickers",
                "timedOut": false,
                "duration": 53,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ff4051ba-f33c-44aa-9d34-595328c0d2a4",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [dsx] orderBook",
                "fullTitle": " > [dsx] without API keys > [dsx] orderBook",
                "timedOut": false,
                "duration": 1747,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f25349c9-a2d7-4079-ad5e-f5aa7f056856",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [dsx] trades",
                "fullTitle": " > [dsx] without API keys > [dsx] trades",
                "timedOut": false,
                "duration": 1339,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1687cc4e-d11a-4d63-9fa2-fe608cdcaf45",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "4746368d-4a6f-4632-8f07-0bedd8b686cc",
              "81e1919a-5670-4797-b642-d572518a1f73",
              "bfef7495-904c-4c65-86af-cdb0d0c945e7",
              "ff4051ba-f33c-44aa-9d34-595328c0d2a4",
              "f25349c9-a2d7-4079-ad5e-f5aa7f056856",
              "1687cc4e-d11a-4d63-9fa2-fe608cdcaf45"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 6866,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "b09ee256-b5f5-4324-a188-9a7513f43700",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "78572da6-f672-4f0e-8776-d0190693c9ab",
            "title": "> [exmo] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/exmo-test.js",
            "file": "/test/generated/exmo-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [exmo] connect",
                "fullTitle": " > [exmo] without API keys > [exmo] connect",
                "timedOut": false,
                "duration": 97,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "7deed976-fb05-492a-bdde-ffd6cf54b3f8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [exmo] markets",
                "fullTitle": " > [exmo] without API keys > [exmo] markets",
                "timedOut": false,
                "duration": 657,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b29ed00a-8302-44ff-9984-38041f766df6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [exmo] ticker",
                "fullTitle": " > [exmo] without API keys > [exmo] ticker",
                "timedOut": false,
                "duration": 1030,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "cef978cd-fc9c-4e36-846a-88816946461a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [exmo] tickers",
                "fullTitle": " > [exmo] without API keys > [exmo] tickers",
                "timedOut": false,
                "duration": 282,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0e07fae0-a912-4b87-a790-d053d00d1199",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [exmo] orderBook",
                "fullTitle": " > [exmo] without API keys > [exmo] orderBook",
                "timedOut": false,
                "duration": 226,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "af0d52b2-b232-4c13-972e-c854b2aa62e6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [exmo] trades",
                "fullTitle": " > [exmo] without API keys > [exmo] trades",
                "timedOut": false,
                "duration": 365,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "fe7d63d8-6871-415c-abb9-1c743a3ffa57",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "7deed976-fb05-492a-bdde-ffd6cf54b3f8",
              "b29ed00a-8302-44ff-9984-38041f766df6",
              "cef978cd-fc9c-4e36-846a-88816946461a",
              "0e07fae0-a912-4b87-a790-d053d00d1199",
              "af0d52b2-b232-4c13-972e-c854b2aa62e6",
              "fe7d63d8-6871-415c-abb9-1c743a3ffa57"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 2657,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "2230333a-1f03-45e1-ae60-fc8bb3ba1ca7",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "269abacc-e645-488b-85ad-fa9bad7cfcf5",
            "title": "> [exx] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/exx-test.js",
            "file": "/test/generated/exx-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [exx] connect",
                "fullTitle": " > [exx] without API keys > [exx] connect",
                "timedOut": false,
                "duration": 163,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "bf18d00a-8b0c-49ec-b276-be6d63ed2629",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [exx] markets",
                "fullTitle": " > [exx] without API keys > [exx] markets",
                "timedOut": false,
                "duration": 1263,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b1b6b4ad-0858-46d6-a645-959dad3e5d5c",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [exx] ticker",
                "fullTitle": " > [exx] without API keys > [exx] ticker",
                "timedOut": false,
                "duration": 545,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "7bd1d561-0b2b-4b35-943d-291540925b6c",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [exx] tickers",
                "fullTitle": " > [exx] without API keys > [exx] tickers",
                "timedOut": false,
                "duration": 313,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "dd7c8f93-70f0-4582-b097-4c9ebd1edae5",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [exx] orderBook",
                "fullTitle": " > [exx] without API keys > [exx] orderBook",
                "timedOut": false,
                "duration": 279,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5b29a69b-2a04-4c9a-a63b-d4d97618b00f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [exx] trades",
                "fullTitle": " > [exx] without API keys > [exx] trades",
                "timedOut": false,
                "duration": 339,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2a3feb1d-dcf3-45a1-a3ac-eb6e20b53f5a",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "bf18d00a-8b0c-49ec-b276-be6d63ed2629",
              "b1b6b4ad-0858-46d6-a645-959dad3e5d5c",
              "7bd1d561-0b2b-4b35-943d-291540925b6c",
              "dd7c8f93-70f0-4582-b097-4c9ebd1edae5",
              "5b29a69b-2a04-4c9a-a63b-d4d97618b00f",
              "2a3feb1d-dcf3-45a1-a3ac-eb6e20b53f5a"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 2902,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "75310ad6-509d-4a93-8e23-19af4c645bd5",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "ba1c29bc-0998-43ec-adee-b7e32e76c6d9",
            "title": "> [currencycom] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/currencycom-test.js",
            "file": "/test/generated/currencycom-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [currencycom] connect",
                "fullTitle": " > [currencycom] without API keys > [currencycom] connect",
                "timedOut": false,
                "duration": 212,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "4c4a8517-b440-4ee5-aec4-ef057df68aa7",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [currencycom] markets",
                "fullTitle": " > [currencycom] without API keys > [currencycom] markets",
                "timedOut": false,
                "duration": 2699,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8566d759-14f6-4ce3-a1d6-c27a89bff3df",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [currencycom] ticker",
                "fullTitle": " > [currencycom] without API keys > [currencycom] ticker",
                "timedOut": false,
                "duration": 2680,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ca9a0e01-a06a-4001-8cfb-e43dc9eb7411",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [currencycom] tickers",
                "fullTitle": " > [currencycom] without API keys > [currencycom] tickers",
                "timedOut": false,
                "duration": 1719,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5b8b77ef-1def-43c0-abee-f324ba168ba8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [currencycom] orderBook",
                "fullTitle": " > [currencycom] without API keys > [currencycom] orderBook",
                "timedOut": false,
                "duration": 1119,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "bc3d942b-4614-457a-8131-fbd32c9a44e8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [currencycom] trades",
                "fullTitle": " > [currencycom] without API keys > [currencycom] trades",
                "timedOut": false,
                "duration": 1048,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "bc1685a2-27bc-4cf8-b300-cde6ff30ae23",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "4c4a8517-b440-4ee5-aec4-ef057df68aa7",
              "8566d759-14f6-4ce3-a1d6-c27a89bff3df",
              "ca9a0e01-a06a-4001-8cfb-e43dc9eb7411",
              "5b8b77ef-1def-43c0-abee-f324ba168ba8",
              "bc3d942b-4614-457a-8131-fbd32c9a44e8",
              "bc1685a2-27bc-4cf8-b300-cde6ff30ae23"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 9477,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "eb72b61a-0623-415c-b291-f71db5aac266",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "1c29a45e-29d1-4bb8-8b71-98ececf83d3f",
            "title": "> [crex24] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/crex24-test.js",
            "file": "/test/generated/crex24-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [crex24] connect",
                "fullTitle": " > [crex24] without API keys > [crex24] connect",
                "timedOut": false,
                "duration": 266,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "650bd11c-76a6-4735-9698-5ce9eddc7d4c",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [crex24] markets",
                "fullTitle": " > [crex24] without API keys > [crex24] markets",
                "timedOut": false,
                "duration": 1427,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "855a81e4-0b6c-420b-96be-04dc63f8d3e4",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [crex24] ticker",
                "fullTitle": " > [crex24] without API keys > [crex24] ticker",
                "timedOut": false,
                "duration": 3317,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6cd68e18-b7da-4473-aa24-95ed683bb89a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [crex24] tickers",
                "fullTitle": " > [crex24] without API keys > [crex24] tickers",
                "timedOut": false,
                "duration": 954,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "607e1438-0dd1-486a-b3d7-22e11a8b41ac",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [crex24] orderBook",
                "fullTitle": " > [crex24] without API keys > [crex24] orderBook",
                "timedOut": false,
                "duration": 2486,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "21ab235a-060e-48a7-9aa9-6e8355a92fb5",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [crex24] trades",
                "fullTitle": " > [crex24] without API keys > [crex24] trades",
                "timedOut": false,
                "duration": 2022,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5ac46686-3461-4665-aaf6-050adb6e3108",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "650bd11c-76a6-4735-9698-5ce9eddc7d4c",
              "855a81e4-0b6c-420b-96be-04dc63f8d3e4",
              "6cd68e18-b7da-4473-aa24-95ed683bb89a",
              "607e1438-0dd1-486a-b3d7-22e11a8b41ac",
              "21ab235a-060e-48a7-9aa9-6e8355a92fb5",
              "5ac46686-3461-4665-aaf6-050adb6e3108"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 10472,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "74c8da75-2564-4d23-a203-6da74ac4af40",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "717b5999-e9f1-4442-b864-4c6300237a37",
            "title": "> [fcoin] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/fcoin-test.js",
            "file": "/test/generated/fcoin-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [fcoin] connect",
                "fullTitle": " > [fcoin] without API keys > [fcoin] connect",
                "timedOut": false,
                "duration": 349,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "26a5b232-1bd7-4e92-9f23-4889db2db74d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [fcoin] markets",
                "fullTitle": " > [fcoin] without API keys > [fcoin] markets",
                "timedOut": false,
                "duration": 1040,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6743b9d9-1494-42a9-aae9-23c382efa0a8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [fcoin] ticker",
                "fullTitle": " > [fcoin] without API keys > [fcoin] ticker",
                "timedOut": false,
                "duration": 1753,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0be07362-5f91-4fc0-b49c-6196b2b77da8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [fcoin] tickers",
                "fullTitle": " > [fcoin] without API keys > [fcoin] tickers",
                "timedOut": false,
                "duration": 34,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "29478cf1-d1a6-47e0-869e-bfe99d7f5492",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [fcoin] orderBook",
                "fullTitle": " > [fcoin] without API keys > [fcoin] orderBook",
                "timedOut": false,
                "duration": 40,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "35e1e392-3e27-4bc8-8c24-3bd6b1a5b3eb",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [fcoin] trades",
                "fullTitle": " > [fcoin] without API keys > [fcoin] trades",
                "timedOut": false,
                "duration": 55,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "d9360afd-a7b2-45eb-9dd1-282610a8181a",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "26a5b232-1bd7-4e92-9f23-4889db2db74d",
              "6743b9d9-1494-42a9-aae9-23c382efa0a8",
              "0be07362-5f91-4fc0-b49c-6196b2b77da8",
              "29478cf1-d1a6-47e0-869e-bfe99d7f5492",
              "35e1e392-3e27-4bc8-8c24-3bd6b1a5b3eb",
              "d9360afd-a7b2-45eb-9dd1-282610a8181a"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 3271,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "94698180-180c-40bf-a41d-9bfae23ee988",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "bf80b19b-8f48-4595-8e01-ed6dd65bed88",
            "title": "> [fcoinjp] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/fcoinjp-test.js",
            "file": "/test/generated/fcoinjp-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [fcoinjp] connect",
                "fullTitle": " > [fcoinjp] without API keys > [fcoinjp] connect",
                "timedOut": false,
                "duration": 125,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a3bae64e-1c50-46ba-92b5-ed2f4b2a927b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [fcoinjp] markets",
                "fullTitle": " > [fcoinjp] without API keys > [fcoinjp] markets",
                "timedOut": false,
                "duration": 981,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2e0a7ebc-6964-4581-b40b-f6b474480b36",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [fcoinjp] ticker",
                "fullTitle": " > [fcoinjp] without API keys > [fcoinjp] ticker",
                "timedOut": false,
                "duration": 1581,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "d3fd650c-7d8f-4fa7-8f51-7e0d8e4992eb",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [fcoinjp] tickers",
                "fullTitle": " > [fcoinjp] without API keys > [fcoinjp] tickers",
                "timedOut": false,
                "duration": 33,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "fbce258f-0f7c-4041-a9f0-97000a0850ee",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [fcoinjp] orderBook",
                "fullTitle": " > [fcoinjp] without API keys > [fcoinjp] orderBook",
                "timedOut": false,
                "duration": 132,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "34de0976-906b-4a08-805b-5eae64942199",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [fcoinjp] trades",
                "fullTitle": " > [fcoinjp] without API keys > [fcoinjp] trades",
                "timedOut": false,
                "duration": 123,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "69ee88dd-a0f4-4ce1-8017-133953858555",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "a3bae64e-1c50-46ba-92b5-ed2f4b2a927b",
              "2e0a7ebc-6964-4581-b40b-f6b474480b36",
              "d3fd650c-7d8f-4fa7-8f51-7e0d8e4992eb",
              "fbce258f-0f7c-4041-a9f0-97000a0850ee",
              "34de0976-906b-4a08-805b-5eae64942199",
              "69ee88dd-a0f4-4ce1-8017-133953858555"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 2975,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "3cec43e9-37e1-43c2-b232-df25e4c6927e",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "7a4c981a-c7ed-43e3-9d04-0b75d7b8e5e8",
            "title": "> [ftx] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/ftx-test.js",
            "file": "/test/generated/ftx-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [ftx] connect",
                "fullTitle": " > [ftx] without API keys > [ftx] connect",
                "timedOut": false,
                "duration": 347,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "453a282c-bdb9-4ba9-86bf-1fdf0f679937",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [ftx] markets",
                "fullTitle": " > [ftx] without API keys > [ftx] markets",
                "timedOut": false,
                "duration": 807,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a96ed922-8293-4ce5-81ba-a977d2e4b317",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [ftx] ticker",
                "fullTitle": " > [ftx] without API keys > [ftx] ticker",
                "timedOut": false,
                "duration": 401,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c3dbbd02-4c86-4750-b74b-15c8bcd18c0f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [ftx] tickers",
                "fullTitle": " > [ftx] without API keys > [ftx] tickers",
                "timedOut": false,
                "duration": 305,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8cd3bcb7-fa86-47a2-9130-ccde330a2d16",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [ftx] orderBook",
                "fullTitle": " > [ftx] without API keys > [ftx] orderBook",
                "timedOut": false,
                "duration": 294,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "99a52aba-7246-4eca-9f84-22c60be29363",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [ftx] trades",
                "fullTitle": " > [ftx] without API keys > [ftx] trades",
                "timedOut": false,
                "duration": 357,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "58717037-8a77-4395-b735-5081972c6933",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "453a282c-bdb9-4ba9-86bf-1fdf0f679937",
              "a96ed922-8293-4ce5-81ba-a977d2e4b317",
              "c3dbbd02-4c86-4750-b74b-15c8bcd18c0f",
              "8cd3bcb7-fa86-47a2-9130-ccde330a2d16",
              "99a52aba-7246-4eca-9f84-22c60be29363",
              "58717037-8a77-4395-b735-5081972c6933"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 2511,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "afa2604b-f037-45eb-accd-48a852e57285",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "f743c2e7-c00e-4d9f-96ff-cd5385f4f17e",
            "title": "> [flowbtc] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/flowbtc-test.js",
            "file": "/test/generated/flowbtc-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [flowbtc] connect",
                "fullTitle": " > [flowbtc] without API keys > [flowbtc] connect",
                "timedOut": false,
                "duration": 124,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0d813e8c-9d9a-47c7-8201-d77703431cf1",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [flowbtc] markets",
                "fullTitle": " > [flowbtc] without API keys > [flowbtc] markets",
                "timedOut": false,
                "duration": 3076,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "34dfbd54-d7d1-45c3-9d3c-1a89dd7dc457",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [flowbtc] ticker",
                "fullTitle": " > [flowbtc] without API keys > [flowbtc] ticker",
                "timedOut": false,
                "duration": 1367,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "63a027e8-9e24-4820-a0fd-dcc54c174591",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [flowbtc] tickers",
                "fullTitle": " > [flowbtc] without API keys > [flowbtc] tickers",
                "timedOut": false,
                "duration": 42,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f78016ab-a3dd-471c-a4a3-8d6f61fee512",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [flowbtc] orderBook",
                "fullTitle": " > [flowbtc] without API keys > [flowbtc] orderBook",
                "timedOut": false,
                "duration": 77,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "745c04b1-ad95-47c0-8b97-d33ba96c1621",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [flowbtc] trades",
                "fullTitle": " > [flowbtc] without API keys > [flowbtc] trades",
                "timedOut": false,
                "duration": 75,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "800c8dba-9d7b-43d5-a3da-579b9fec0c01",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "0d813e8c-9d9a-47c7-8201-d77703431cf1",
              "34dfbd54-d7d1-45c3-9d3c-1a89dd7dc457",
              "63a027e8-9e24-4820-a0fd-dcc54c174591",
              "f78016ab-a3dd-471c-a4a3-8d6f61fee512",
              "745c04b1-ad95-47c0-8b97-d33ba96c1621",
              "800c8dba-9d7b-43d5-a3da-579b9fec0c01"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 4761,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "3ab18d08-5104-497c-9c1c-113f26fcb1c3",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "9429c386-3a24-4cd2-a5a3-2d5f147db51b",
            "title": "> [foxbit] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/foxbit-test.js",
            "file": "/test/generated/foxbit-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [foxbit] connect",
                "fullTitle": " > [foxbit] without API keys > [foxbit] connect",
                "timedOut": false,
                "duration": 93,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "61552902-e659-49e4-b58e-6e4363c7b129",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [foxbit] markets",
                "fullTitle": " > [foxbit] without API keys > [foxbit] markets",
                "timedOut": false,
                "duration": 12,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e16f9205-d8b9-498b-a1a4-1cc5561d9da5",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [foxbit] ticker",
                "fullTitle": " > [foxbit] without API keys > [foxbit] ticker",
                "timedOut": false,
                "duration": 143,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "490a4dda-d7f8-457b-8350-35fa72fdd8ff",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [foxbit] tickers",
                "fullTitle": " > [foxbit] without API keys > [foxbit] tickers",
                "timedOut": false,
                "duration": 6,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a960a0ce-dfa1-4841-9564-a18eb675644c",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [foxbit] orderBook",
                "fullTitle": " > [foxbit] without API keys > [foxbit] orderBook",
                "timedOut": false,
                "duration": 998,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0b139e04-0c67-47a1-93f4-f2c0f834b92e",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [foxbit] trades",
                "fullTitle": " > [foxbit] without API keys > [foxbit] trades",
                "timedOut": false,
                "duration": 3916,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "539c9794-6384-4c05-a794-31f8dde7ba1c",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "61552902-e659-49e4-b58e-6e4363c7b129",
              "e16f9205-d8b9-498b-a1a4-1cc5561d9da5",
              "490a4dda-d7f8-457b-8350-35fa72fdd8ff",
              "a960a0ce-dfa1-4841-9564-a18eb675644c",
              "0b139e04-0c67-47a1-93f4-f2c0f834b92e",
              "539c9794-6384-4c05-a794-31f8dde7ba1c"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5168,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "96e0b802-0360-4762-b50a-f0887262e538",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "bff347d4-5702-4e9c-9308-74754a6fc0a9",
            "title": "> [hollaex] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/hollaex-test.js",
            "file": "/test/generated/hollaex-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [hollaex] connect",
                "fullTitle": " > [hollaex] without API keys > [hollaex] connect",
                "timedOut": false,
                "duration": 98,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ddb96a0a-a1e4-4318-adb7-8c2273b7b1da",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [hollaex] markets",
                "fullTitle": " > [hollaex] without API keys > [hollaex] markets",
                "timedOut": false,
                "duration": 831,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2343aca1-8d84-40d8-baa2-1c23f3c124e8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [hollaex] ticker",
                "fullTitle": " > [hollaex] without API keys > [hollaex] ticker",
                "timedOut": false,
                "duration": 1213,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2077c21e-16fa-4d91-8d98-19e3b7240ddb",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [hollaex] tickers",
                "fullTitle": " > [hollaex] without API keys > [hollaex] tickers",
                "timedOut": false,
                "duration": 278,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f7eeb972-9f9d-49d7-b471-4680bcceea2f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [hollaex] orderBook",
                "fullTitle": " > [hollaex] without API keys > [hollaex] orderBook",
                "timedOut": false,
                "duration": 218,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "018f6782-1c73-40e6-b167-4fc6c6466e89",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [hollaex] trades",
                "fullTitle": " > [hollaex] without API keys > [hollaex] trades",
                "timedOut": false,
                "duration": 326,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "089a7bc4-b309-4058-960f-8bfb06be2121",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "ddb96a0a-a1e4-4318-adb7-8c2273b7b1da",
              "2343aca1-8d84-40d8-baa2-1c23f3c124e8",
              "2077c21e-16fa-4d91-8d98-19e3b7240ddb",
              "f7eeb972-9f9d-49d7-b471-4680bcceea2f",
              "018f6782-1c73-40e6-b167-4fc6c6466e89",
              "089a7bc4-b309-4058-960f-8bfb06be2121"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 2964,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "2d875d90-b9e2-42fb-93b5-7004ea992e87",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "08bdcb2d-6d6c-43cd-8442-475aedc4160c",
            "title": "> [gateio] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/gateio-test.js",
            "file": "/test/generated/gateio-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [gateio] connect",
                "fullTitle": " > [gateio] without API keys > [gateio] connect",
                "timedOut": false,
                "duration": 134,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3aa29bac-f536-4a5c-b4d8-dc48103185e5",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [gateio] markets",
                "fullTitle": " > [gateio] without API keys > [gateio] markets",
                "timedOut": false,
                "duration": 1716,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8dc9c4d5-1b03-465c-9455-177196c75242",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [gateio] ticker",
                "fullTitle": " > [gateio] without API keys > [gateio] ticker",
                "timedOut": false,
                "duration": 2557,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1f87b3dc-eaac-40f9-b97e-8ff72a7da7fa",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [gateio] tickers",
                "fullTitle": " > [gateio] without API keys > [gateio] tickers",
                "timedOut": false,
                "duration": 1470,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "cd6c52d2-ddda-4a07-99d9-4381d6677eb6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [gateio] orderBook",
                "fullTitle": " > [gateio] without API keys > [gateio] orderBook",
                "timedOut": false,
                "duration": 527,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "08911916-2603-4da7-9f5a-ba4f57ed2dd2",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [gateio] trades",
                "fullTitle": " > [gateio] without API keys > [gateio] trades",
                "timedOut": false,
                "duration": 992,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "4fd4c3bb-04df-4174-b0b7-68e7cae9e834",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "3aa29bac-f536-4a5c-b4d8-dc48103185e5",
              "8dc9c4d5-1b03-465c-9455-177196c75242",
              "1f87b3dc-eaac-40f9-b97e-8ff72a7da7fa",
              "cd6c52d2-ddda-4a07-99d9-4381d6677eb6",
              "08911916-2603-4da7-9f5a-ba4f57ed2dd2",
              "4fd4c3bb-04df-4174-b0b7-68e7cae9e834"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 7396,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "fd944e0f-ea89-47f2-b311-1128203cac67",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "d7ba89e4-fca9-48ad-ad90-0a0db5c50eef",
            "title": "> [fybse] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/fybse-test.js",
            "file": "/test/generated/fybse-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [fybse] connect",
                "fullTitle": " > [fybse] without API keys > [fybse] connect",
                "timedOut": false,
                "duration": 393,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e63fad60-7e34-4abd-9b39-0d79a2e11aa2",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [fybse] markets",
                "fullTitle": " > [fybse] without API keys > [fybse] markets",
                "timedOut": false,
                "duration": 34,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e6f3e20a-5466-48a4-a722-cc37e96c6257",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [fybse] ticker",
                "fullTitle": " > [fybse] without API keys > [fybse] ticker",
                "timedOut": false,
                "duration": 1588,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e707ff46-e629-4cf3-92ad-ccb438faae4f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [fybse] tickers",
                "fullTitle": " > [fybse] without API keys > [fybse] tickers",
                "timedOut": false,
                "duration": 11,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c1690311-89e7-4e19-a64d-63723692d0a6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [fybse] orderBook",
                "fullTitle": " > [fybse] without API keys > [fybse] orderBook",
                "timedOut": false,
                "duration": 406,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "458b38df-5e6f-470b-af76-73d3e796362b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [fybse] trades",
                "fullTitle": " > [fybse] without API keys > [fybse] trades",
                "timedOut": false,
                "duration": 5878,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1472771d-d157-4c40-acfb-cf007b4c5600",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "e63fad60-7e34-4abd-9b39-0d79a2e11aa2",
              "e6f3e20a-5466-48a4-a722-cc37e96c6257",
              "e707ff46-e629-4cf3-92ad-ccb438faae4f",
              "c1690311-89e7-4e19-a64d-63723692d0a6",
              "458b38df-5e6f-470b-af76-73d3e796362b",
              "1472771d-d157-4c40-acfb-cf007b4c5600"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 8310,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "cc081376-c772-4a48-af0c-677939a0e8fc",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "33af70b3-d1d2-445f-9fd9-59cd9b0f0c3d",
            "title": "> [gemini] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/gemini-test.js",
            "file": "/test/generated/gemini-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [gemini] connect",
                "fullTitle": " > [gemini] without API keys > [gemini] connect",
                "timedOut": false,
                "duration": 263,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e5f056e7-c12d-4f00-b4bb-9c360b3510f6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [gemini] markets",
                "fullTitle": " > [gemini] without API keys > [gemini] markets",
                "timedOut": false,
                "duration": 1556,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "12d4f2a4-745e-475e-b539-743a55019c1f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [gemini] ticker",
                "fullTitle": " > [gemini] without API keys > [gemini] ticker",
                "timedOut": false,
                "duration": 4825,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8624a1c7-edcd-4cc0-9a86-c851d607a862",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [gemini] tickers",
                "fullTitle": " > [gemini] without API keys > [gemini] tickers",
                "timedOut": false,
                "duration": 9,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "7404e026-de4c-44f0-abfb-8a88b16941cb",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [gemini] orderBook",
                "fullTitle": " > [gemini] without API keys > [gemini] orderBook",
                "timedOut": false,
                "duration": 1488,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1386e9b6-f535-46cd-b368-1c5fc45924b3",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [gemini] trades",
                "fullTitle": " > [gemini] without API keys > [gemini] trades",
                "timedOut": false,
                "duration": 1502,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2398a653-0676-465e-9787-350e63ec906d",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "e5f056e7-c12d-4f00-b4bb-9c360b3510f6",
              "12d4f2a4-745e-475e-b539-743a55019c1f",
              "8624a1c7-edcd-4cc0-9a86-c851d607a862",
              "7404e026-de4c-44f0-abfb-8a88b16941cb",
              "1386e9b6-f535-46cd-b368-1c5fc45924b3",
              "2398a653-0676-465e-9787-350e63ec906d"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 9643,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "625941ea-c6f2-497b-b5b2-5bebed3bb6c4",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "db9a560e-a56e-4bc6-ab5b-8ba2244e415d",
            "title": "> [hbtc] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/hbtc-test.js",
            "file": "/test/generated/hbtc-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [hbtc] connect",
                "fullTitle": " > [hbtc] without API keys > [hbtc] connect",
                "timedOut": false,
                "duration": 511,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "601e994f-f984-443a-bd3b-16b5ae8ece65",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [hbtc] markets",
                "fullTitle": " > [hbtc] without API keys > [hbtc] markets",
                "timedOut": false,
                "duration": 1289,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a9d17c32-0fc4-445d-8731-4d823dd9ae4e",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [hbtc] ticker",
                "fullTitle": " > [hbtc] without API keys > [hbtc] ticker",
                "timedOut": false,
                "duration": 3125,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8298423c-6ddf-4a90-bebf-56554f099002",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [hbtc] tickers",
                "fullTitle": " > [hbtc] without API keys > [hbtc] tickers",
                "timedOut": false,
                "duration": 1998,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "df31890d-f195-425a-9591-4a673f6c9be1",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [hbtc] orderBook",
                "fullTitle": " > [hbtc] without API keys > [hbtc] orderBook",
                "timedOut": false,
                "duration": 1992,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6a0438ce-d979-4fa2-8f97-b90db9591db6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [hbtc] trades",
                "fullTitle": " > [hbtc] without API keys > [hbtc] trades",
                "timedOut": false,
                "duration": 1971,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a4b94d4a-6ff3-4d58-98aa-accc7c62e225",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "601e994f-f984-443a-bd3b-16b5ae8ece65",
              "a9d17c32-0fc4-445d-8731-4d823dd9ae4e",
              "8298423c-6ddf-4a90-bebf-56554f099002",
              "df31890d-f195-425a-9591-4a673f6c9be1",
              "6a0438ce-d979-4fa2-8f97-b90db9591db6",
              "a4b94d4a-6ff3-4d58-98aa-accc7c62e225"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 10886,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "4fdb013b-f8fb-459c-a1eb-648372789017",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "d7dbcdb1-cbbd-4eba-b1d0-7bd59f530b20",
            "title": "> [hitbtc] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/hitbtc-test.js",
            "file": "/test/generated/hitbtc-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [hitbtc] connect",
                "fullTitle": " > [hitbtc] without API keys > [hitbtc] connect",
                "timedOut": false,
                "duration": 125,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6480f429-318a-4f13-afd3-d4f35bc4cc09",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [hitbtc] markets",
                "fullTitle": " > [hitbtc] without API keys > [hitbtc] markets",
                "timedOut": false,
                "duration": 1091,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0b19bd8d-b99f-4d40-98c9-2420001d03c2",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [hitbtc] ticker",
                "fullTitle": " > [hitbtc] without API keys > [hitbtc] ticker",
                "timedOut": false,
                "duration": 3541,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "4502c441-d5b7-4194-9149-3e4c26d49dc8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [hitbtc] tickers",
                "fullTitle": " > [hitbtc] without API keys > [hitbtc] tickers",
                "timedOut": false,
                "duration": 1690,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3b58239e-b8e0-46d8-9656-50b47af9cc80",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [hitbtc] orderBook",
                "fullTitle": " > [hitbtc] without API keys > [hitbtc] orderBook",
                "timedOut": false,
                "duration": 1362,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "cf7282ba-6539-4c55-9ada-a706679fbc04",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [hitbtc] trades",
                "fullTitle": " > [hitbtc] without API keys > [hitbtc] trades",
                "timedOut": false,
                "duration": 1656,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c490fc5a-b112-4187-992d-b9308173af79",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "6480f429-318a-4f13-afd3-d4f35bc4cc09",
              "0b19bd8d-b99f-4d40-98c9-2420001d03c2",
              "4502c441-d5b7-4194-9149-3e4c26d49dc8",
              "3b58239e-b8e0-46d8-9656-50b47af9cc80",
              "cf7282ba-6539-4c55-9ada-a706679fbc04",
              "c490fc5a-b112-4187-992d-b9308173af79"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 9465,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "21c5c4cd-ec86-4cd9-9fda-05c0d53d7e40",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "4ba8eb91-20a6-4d7b-ae3d-9bb45aa0d759",
            "title": "> [ice3x] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/ice3x-test.js",
            "file": "/test/generated/ice3x-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [ice3x] connect",
                "fullTitle": " > [ice3x] without API keys > [ice3x] connect",
                "timedOut": false,
                "duration": 34,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3519fc31-26bf-440d-ac37-60995df3c6c8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [ice3x] markets",
                "fullTitle": " > [ice3x] without API keys > [ice3x] markets",
                "timedOut": false,
                "duration": 1702,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f526753a-6088-4b2c-b6e6-04c6bea8f169",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [ice3x] ticker",
                "fullTitle": " > [ice3x] without API keys > [ice3x] ticker",
                "timedOut": false,
                "duration": 2698,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a98cec91-0c2b-4c80-8887-8b71fb4d4138",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [ice3x] tickers",
                "fullTitle": " > [ice3x] without API keys > [ice3x] tickers",
                "timedOut": false,
                "duration": 1046,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "020ec034-12e4-4a1c-ac57-e2eb40e085b1",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [ice3x] orderBook",
                "fullTitle": " > [ice3x] without API keys > [ice3x] orderBook",
                "timedOut": false,
                "duration": 1051,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ac7be5cb-04e7-49f5-944a-c554d2c15509",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [ice3x] trades",
                "fullTitle": " > [ice3x] without API keys > [ice3x] trades",
                "timedOut": false,
                "duration": 928,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "96880c19-a981-452a-a472-48f3defc7e08",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "3519fc31-26bf-440d-ac37-60995df3c6c8",
              "f526753a-6088-4b2c-b6e6-04c6bea8f169",
              "a98cec91-0c2b-4c80-8887-8b71fb4d4138",
              "020ec034-12e4-4a1c-ac57-e2eb40e085b1",
              "ac7be5cb-04e7-49f5-944a-c554d2c15509",
              "96880c19-a981-452a-a472-48f3defc7e08"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 7459,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "22390e2c-0bc6-4e09-b3a8-46e1f3a1ae61",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "1942c68c-f46f-4136-8068-9f0c272df3a0",
            "title": "> [independentreserve] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/independentreserve-test.js",
            "file": "/test/generated/independentreserve-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [independentreserve] connect",
                "fullTitle": " > [independentreserve] without API keys > [independentreserve] connect",
                "timedOut": false,
                "duration": 34,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5841d3c8-8916-4eb2-8a01-f0bfb87fcd6d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [independentreserve] markets",
                "fullTitle": " > [independentreserve] without API keys > [independentreserve] markets",
                "timedOut": false,
                "duration": 1198,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0b996ff2-8622-4611-87e5-63433f1c88bf",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [independentreserve] ticker",
                "fullTitle": " > [independentreserve] without API keys > [independentreserve] ticker",
                "timedOut": false,
                "duration": 2993,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "128dd008-73c7-4983-9c69-fe13b2b0d376",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [independentreserve] tickers",
                "fullTitle": " > [independentreserve] without API keys > [independentreserve] tickers",
                "timedOut": false,
                "duration": 11,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f6d037d3-5aae-46b2-a48e-25b7f717b991",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [independentreserve] orderBook",
                "fullTitle": " > [independentreserve] without API keys > [independentreserve] orderBook",
                "timedOut": false,
                "duration": 1404,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ec022bf5-65ef-430c-8565-1144d341cd0e",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [independentreserve] trades",
                "fullTitle": " > [independentreserve] without API keys > [independentreserve] trades",
                "timedOut": false,
                "duration": 584,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "64c3288a-5e2e-478c-97ea-11793d6c0ddc",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "5841d3c8-8916-4eb2-8a01-f0bfb87fcd6d",
              "0b996ff2-8622-4611-87e5-63433f1c88bf",
              "128dd008-73c7-4983-9c69-fe13b2b0d376",
              "f6d037d3-5aae-46b2-a48e-25b7f717b991",
              "ec022bf5-65ef-430c-8565-1144d341cd0e",
              "64c3288a-5e2e-478c-97ea-11793d6c0ddc"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 6224,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "d531170a-eec3-471f-b8a1-4e7f8fa10913",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "b83ddd02-49f0-46b3-a2a6-21f8dc6fc6db",
            "title": "> [huobipro] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/huobipro-test.js",
            "file": "/test/generated/huobipro-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [huobipro] connect",
                "fullTitle": " > [huobipro] without API keys > [huobipro] connect",
                "timedOut": false,
                "duration": 100,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "47c88e88-ff71-4f72-9ff0-726b6e7e7375",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [huobipro] markets",
                "fullTitle": " > [huobipro] without API keys > [huobipro] markets",
                "timedOut": false,
                "duration": 539,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "d8c3ea79-0db8-4e39-946f-0cb13e91756f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [huobipro] ticker",
                "fullTitle": " > [huobipro] without API keys > [huobipro] ticker",
                "timedOut": false,
                "duration": 5588,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "30bd29e1-2196-4ccb-9a89-c031ed030d4d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [huobipro] tickers",
                "fullTitle": " > [huobipro] without API keys > [huobipro] tickers",
                "timedOut": false,
                "duration": 2172,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2362e6d3-2f43-4751-80a3-b65fcc2a5e2a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [huobipro] orderBook",
                "fullTitle": " > [huobipro] without API keys > [huobipro] orderBook",
                "timedOut": false,
                "duration": 1827,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "06fc15b5-ada2-4640-ab67-7b26724d2269",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [huobipro] trades",
                "fullTitle": " > [huobipro] without API keys > [huobipro] trades",
                "timedOut": false,
                "duration": 2133,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "dd277a09-d7f9-45d7-911b-458db044a73a",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "47c88e88-ff71-4f72-9ff0-726b6e7e7375",
              "d8c3ea79-0db8-4e39-946f-0cb13e91756f",
              "30bd29e1-2196-4ccb-9a89-c031ed030d4d",
              "2362e6d3-2f43-4751-80a3-b65fcc2a5e2a",
              "06fc15b5-ada2-4640-ab67-7b26724d2269",
              "dd277a09-d7f9-45d7-911b-458db044a73a"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 12359,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "0754be0d-3b8f-4aae-9eb7-61e544d09ec5",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "ee661025-ab38-4a21-8e2b-b97de657e76c",
            "title": "> [itbit] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/itbit-test.js",
            "file": "/test/generated/itbit-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [itbit] connect",
                "fullTitle": " > [itbit] without API keys > [itbit] connect",
                "timedOut": false,
                "duration": 32,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "da0fa623-14af-4106-8a53-17a6c3633840",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [itbit] markets",
                "fullTitle": " > [itbit] without API keys > [itbit] markets",
                "timedOut": false,
                "duration": 7,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ce1c8f56-4851-4981-9e19-9d819feb63cd",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [itbit] ticker",
                "fullTitle": " > [itbit] without API keys > [itbit] ticker",
                "timedOut": false,
                "duration": 407,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "21ef94e7-5bf6-40c7-a9c5-1d775cd63d60",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [itbit] tickers",
                "fullTitle": " > [itbit] without API keys > [itbit] tickers",
                "timedOut": false,
                "duration": 10,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5b583e10-e9f6-4fef-8440-059999b16392",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [itbit] orderBook",
                "fullTitle": " > [itbit] without API keys > [itbit] orderBook",
                "timedOut": false,
                "duration": 1732,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "dafaf720-c41c-4ea4-b413-827cee3d8faa",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [itbit] trades",
                "fullTitle": " > [itbit] without API keys > [itbit] trades",
                "timedOut": false,
                "duration": 2225,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "31bdd3fd-f39c-4bec-9a87-ed4de3de20f9",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "da0fa623-14af-4106-8a53-17a6c3633840",
              "ce1c8f56-4851-4981-9e19-9d819feb63cd",
              "21ef94e7-5bf6-40c7-a9c5-1d775cd63d60",
              "5b583e10-e9f6-4fef-8440-059999b16392",
              "dafaf720-c41c-4ea4-b413-827cee3d8faa",
              "31bdd3fd-f39c-4bec-9a87-ed4de3de20f9"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 4413,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "81ec59ea-212e-4c70-841d-2fd4152580f6",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "e5124726-47fc-4f16-bdba-7abf65a6b2f5",
            "title": "> [indodax] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/indodax-test.js",
            "file": "/test/generated/indodax-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [indodax] connect",
                "fullTitle": " > [indodax] without API keys > [indodax] connect",
                "timedOut": false,
                "duration": 145,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "27f7a2a5-3127-450d-9adc-abecd7957008",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [indodax] markets",
                "fullTitle": " > [indodax] without API keys > [indodax] markets",
                "timedOut": false,
                "duration": 31,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f807747f-8e93-403f-8dec-fd0d7e7ef32f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [indodax] ticker",
                "fullTitle": " > [indodax] without API keys > [indodax] ticker",
                "timedOut": false,
                "duration": 809,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "92ab56c8-2fa5-4df7-a4bd-18785ed8e533",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [indodax] tickers",
                "fullTitle": " > [indodax] without API keys > [indodax] tickers",
                "timedOut": false,
                "duration": 5,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8b35b1c7-db4c-44cd-aa1d-46c62e0db4da",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [indodax] orderBook",
                "fullTitle": " > [indodax] without API keys > [indodax] orderBook",
                "timedOut": false,
                "duration": 1762,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "dca35735-cae8-4f7f-9a65-c741126512ef",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [indodax] trades",
                "fullTitle": " > [indodax] without API keys > [indodax] trades",
                "timedOut": false,
                "duration": 2307,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "9199e204-472a-4c66-a606-aa71a4d5ee04",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "27f7a2a5-3127-450d-9adc-abecd7957008",
              "f807747f-8e93-403f-8dec-fd0d7e7ef32f",
              "92ab56c8-2fa5-4df7-a4bd-18785ed8e533",
              "8b35b1c7-db4c-44cd-aa1d-46c62e0db4da",
              "dca35735-cae8-4f7f-9a65-c741126512ef",
              "9199e204-472a-4c66-a606-aa71a4d5ee04"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5059,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "6b7c217b-cc36-4f38-8b29-d368057ce08c",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "fa6d01dd-237b-4dc4-a294-e81bdc4fcb93",
            "title": "> [btctradeim] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/btctradeim-test.js",
            "file": "/test/generated/btctradeim-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [btctradeim] connect",
                "fullTitle": " > [btctradeim] without API keys > [btctradeim] connect",
                "timedOut": false,
                "duration": 118,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0ebc66e7-7e67-4ed9-b610-2894377bda96",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btctradeim] markets",
                "fullTitle": " > [btctradeim] without API keys > [btctradeim] markets",
                "timedOut": false,
                "duration": 40038,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "bfd18325-a10b-422b-b35a-c17b8f10e9c1",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btctradeim] ticker",
                "fullTitle": " > [btctradeim] without API keys > [btctradeim] ticker",
                "timedOut": false,
                "duration": 10027,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f587b11c-2ffd-4a05-9c65-d4410ed3aea5",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btctradeim] tickers",
                "fullTitle": " > [btctradeim] without API keys > [btctradeim] tickers",
                "timedOut": false,
                "duration": 7,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8e0fd086-a2f9-47b9-bd17-12974dabdba6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btctradeim] orderBook",
                "fullTitle": " > [btctradeim] without API keys > [btctradeim] orderBook",
                "timedOut": false,
                "duration": 20,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0b360aff-f470-480e-81c7-5b2be08232d8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [btctradeim] trades",
                "fullTitle": " > [btctradeim] without API keys > [btctradeim] trades",
                "timedOut": false,
                "duration": 28,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1dda7c61-9da0-4881-9531-187c32efdb0c",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "0ebc66e7-7e67-4ed9-b610-2894377bda96",
              "bfd18325-a10b-422b-b35a-c17b8f10e9c1",
              "f587b11c-2ffd-4a05-9c65-d4410ed3aea5",
              "8e0fd086-a2f9-47b9-bd17-12974dabdba6",
              "0b360aff-f470-480e-81c7-5b2be08232d8",
              "1dda7c61-9da0-4881-9531-187c32efdb0c"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 50238,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "263d8062-f845-4d58-b448-d1d42eefcadc",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "91617fa5-59df-4a7d-9ee6-1b1c8958af81",
            "title": "> [huobiru] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/huobiru-test.js",
            "file": "/test/generated/huobiru-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [huobiru] connect",
                "fullTitle": " > [huobiru] without API keys > [huobiru] connect",
                "timedOut": false,
                "duration": 41,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "42c8d4d4-9b7d-42b4-b01d-f4c7d47a74c3",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [huobiru] markets",
                "fullTitle": " > [huobiru] without API keys > [huobiru] markets",
                "timedOut": false,
                "duration": 504,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "7cf22285-886c-4968-a74e-3e33ebc614fe",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [huobiru] ticker",
                "fullTitle": " > [huobiru] without API keys > [huobiru] ticker",
                "timedOut": false,
                "duration": 5730,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f9bf5302-e991-422d-adf2-c310370084ee",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [huobiru] tickers",
                "fullTitle": " > [huobiru] without API keys > [huobiru] tickers",
                "timedOut": false,
                "duration": 1967,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6bea601c-3d2f-4da5-bd40-bd2bdcbcf6de",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [huobiru] orderBook",
                "fullTitle": " > [huobiru] without API keys > [huobiru] orderBook",
                "timedOut": false,
                "duration": 2019,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1cece7d0-5a97-410e-bba0-a33245518ae4",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [huobiru] trades",
                "fullTitle": " > [huobiru] without API keys > [huobiru] trades",
                "timedOut": false,
                "duration": 2120,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "bbac17b0-7bdc-4738-ac55-92064b9fc2b1",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "42c8d4d4-9b7d-42b4-b01d-f4c7d47a74c3",
              "7cf22285-886c-4968-a74e-3e33ebc614fe",
              "f9bf5302-e991-422d-adf2-c310370084ee",
              "6bea601c-3d2f-4da5-bd40-bd2bdcbcf6de",
              "1cece7d0-5a97-410e-bba0-a33245518ae4",
              "bbac17b0-7bdc-4738-ac55-92064b9fc2b1"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 12381,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "06f8877d-1abb-4779-bf71-baa992c4d91c",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "42aff18f-0d03-4180-b971-3a1b40ba54c2",
            "title": "> [kucoin] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/kucoin-test.js",
            "file": "/test/generated/kucoin-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [kucoin] connect",
                "fullTitle": " > [kucoin] without API keys > [kucoin] connect",
                "timedOut": false,
                "duration": 185,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "04f4fba8-ff42-43d9-8213-305395a4bf35",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [kucoin] markets",
                "fullTitle": " > [kucoin] without API keys > [kucoin] markets",
                "timedOut": false,
                "duration": 498,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "4d0ce6f6-4e0a-4a92-be3d-3a351219897a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [kucoin] ticker",
                "fullTitle": " > [kucoin] without API keys > [kucoin] ticker",
                "timedOut": false,
                "duration": 950,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e81b5612-ac03-4e82-90a9-434c76c5695e",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [kucoin] tickers",
                "fullTitle": " > [kucoin] without API keys > [kucoin] tickers",
                "timedOut": false,
                "duration": 867,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "9a67a53f-343c-4099-bdf7-539edd9b2883",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [kucoin] orderBook",
                "fullTitle": " > [kucoin] without API keys > [kucoin] orderBook",
                "timedOut": false,
                "duration": 329,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ca25beba-98ca-40ee-9d59-536b2ab429be",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [kucoin] trades",
                "fullTitle": " > [kucoin] without API keys > [kucoin] trades",
                "timedOut": false,
                "duration": 592,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ecb0d371-c90b-4a6d-a020-dc9ca15d128e",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "04f4fba8-ff42-43d9-8213-305395a4bf35",
              "4d0ce6f6-4e0a-4a92-be3d-3a351219897a",
              "e81b5612-ac03-4e82-90a9-434c76c5695e",
              "9a67a53f-343c-4099-bdf7-539edd9b2883",
              "ca25beba-98ca-40ee-9d59-536b2ab429be",
              "ecb0d371-c90b-4a6d-a020-dc9ca15d128e"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 3421,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "d569fc59-8f65-4fe2-bf4c-ef692500a8c7",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "cc412da8-3701-4189-bf44-f70d7bbd1c72",
            "title": "> [idex] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/idex-test.js",
            "file": "/test/generated/idex-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [idex] connect",
                "fullTitle": " > [idex] without API keys > [idex] connect",
                "timedOut": false,
                "duration": 44,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a649ded3-13d1-4dfc-905c-4484708ff4bf",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [idex] markets",
                "fullTitle": " > [idex] without API keys > [idex] markets",
                "timedOut": false,
                "duration": 253,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0c93e354-3ea1-4be1-9b8b-90ad4e06b2ed",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [idex] ticker",
                "fullTitle": " > [idex] without API keys > [idex] ticker",
                "timedOut": false,
                "duration": 2817,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "bb7dfb83-0bfb-491f-b341-31a6085bf684",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [idex] tickers",
                "fullTitle": " > [idex] without API keys > [idex] tickers",
                "timedOut": false,
                "duration": 1623,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b15d893c-fb62-4a06-bd2c-70111dcdd21b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [idex] orderBook",
                "fullTitle": " > [idex] without API keys > [idex] orderBook",
                "timedOut": false,
                "duration": 1394,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f34381ac-faa6-4354-b027-931b0d5a7649",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [idex] trades",
                "fullTitle": " > [idex] without API keys > [idex] trades",
                "timedOut": false,
                "duration": 7405,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1a4a46a8-8332-405a-bc79-74178428cff0",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "a649ded3-13d1-4dfc-905c-4484708ff4bf",
              "0c93e354-3ea1-4be1-9b8b-90ad4e06b2ed",
              "bb7dfb83-0bfb-491f-b341-31a6085bf684",
              "b15d893c-fb62-4a06-bd2c-70111dcdd21b",
              "f34381ac-faa6-4354-b027-931b0d5a7649",
              "1a4a46a8-8332-405a-bc79-74178428cff0"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 13536,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "4b34dcb6-ee56-42e4-a86f-e9d6d8ba2e4c",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "a679a0ab-a576-4b46-9894-91e17d630c74",
            "title": "> [coinmarketcap] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/coinmarketcap-test.js",
            "file": "/test/generated/coinmarketcap-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [coinmarketcap] connect",
                "fullTitle": " > [coinmarketcap] without API keys > [coinmarketcap] connect",
                "timedOut": false,
                "duration": 83,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0a41dd19-eabd-4c80-9d55-8845e040f329",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinmarketcap] markets",
                "fullTitle": " > [coinmarketcap] without API keys > [coinmarketcap] markets",
                "timedOut": false,
                "duration": 30032,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6d7965c9-430a-415a-b913-6c222b1184de",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinmarketcap] ticker",
                "fullTitle": " > [coinmarketcap] without API keys > [coinmarketcap] ticker",
                "timedOut": false,
                "duration": 10023,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "4d4302c3-cb17-4a4a-9488-a5e02bfa2aee",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinmarketcap] tickers",
                "fullTitle": " > [coinmarketcap] without API keys > [coinmarketcap] tickers",
                "timedOut": false,
                "duration": 23,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "cfdf80f2-d4cb-47f0-86f9-0679cad20b06",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinmarketcap] orderBook",
                "fullTitle": " > [coinmarketcap] without API keys > [coinmarketcap] orderBook",
                "timedOut": false,
                "duration": 5,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3e020e3a-6426-41c9-bffd-6e0f7ade4a62",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coinmarketcap] trades",
                "fullTitle": " > [coinmarketcap] without API keys > [coinmarketcap] trades",
                "timedOut": false,
                "duration": 5,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2a648e49-fbee-450a-bd3c-fca0babe4fb9",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "0a41dd19-eabd-4c80-9d55-8845e040f329",
              "6d7965c9-430a-415a-b913-6c222b1184de",
              "4d4302c3-cb17-4a4a-9488-a5e02bfa2aee",
              "cfdf80f2-d4cb-47f0-86f9-0679cad20b06",
              "3e020e3a-6426-41c9-bffd-6e0f7ade4a62",
              "2a648e49-fbee-450a-bd3c-fca0babe4fb9"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 40171,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "8b95bb7f-ebf9-4496-bb3f-a62167610765",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "81046881-be69-4402-999a-1c308f9e9ede",
            "title": "> [kuna] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/kuna-test.js",
            "file": "/test/generated/kuna-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [kuna] connect",
                "fullTitle": " > [kuna] without API keys > [kuna] connect",
                "timedOut": false,
                "duration": 36,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "affe349d-0d3e-4673-ae7e-e60974f8f825",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [kuna] markets",
                "fullTitle": " > [kuna] without API keys > [kuna] markets",
                "timedOut": false,
                "duration": 492,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5753f86f-cb12-43b3-b4d3-808f554d7873",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [kuna] ticker",
                "fullTitle": " > [kuna] without API keys > [kuna] ticker",
                "timedOut": false,
                "duration": 1662,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2191bbcd-0755-401f-be98-3870c4f55daa",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [kuna] tickers",
                "fullTitle": " > [kuna] without API keys > [kuna] tickers",
                "timedOut": false,
                "duration": 1174,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "d61c336d-2f04-4696-991d-f277d87b81e9",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [kuna] orderBook",
                "fullTitle": " > [kuna] without API keys > [kuna] orderBook",
                "timedOut": false,
                "duration": 845,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1e800db9-8bb2-49ef-b707-5a3ad53b8c0d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [kuna] trades",
                "fullTitle": " > [kuna] without API keys > [kuna] trades",
                "timedOut": false,
                "duration": 981,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "549a6f41-ca07-49ab-afb1-082789db17d3",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "affe349d-0d3e-4673-ae7e-e60974f8f825",
              "5753f86f-cb12-43b3-b4d3-808f554d7873",
              "2191bbcd-0755-401f-be98-3870c4f55daa",
              "d61c336d-2f04-4696-991d-f277d87b81e9",
              "1e800db9-8bb2-49ef-b707-5a3ad53b8c0d",
              "549a6f41-ca07-49ab-afb1-082789db17d3"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5190,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "2694d2c4-8f94-44c9-9e98-e01c6733506a",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "fd77da61-625b-4678-b001-380425e88438",
            "title": "> [lakebtc] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/lakebtc-test.js",
            "file": "/test/generated/lakebtc-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [lakebtc] connect",
                "fullTitle": " > [lakebtc] without API keys > [lakebtc] connect",
                "timedOut": false,
                "duration": 36,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0f9e2910-894c-4653-ba73-507fb4deb6ca",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [lakebtc] markets",
                "fullTitle": " > [lakebtc] without API keys > [lakebtc] markets",
                "timedOut": false,
                "duration": 362,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ede91d3f-e6ab-44ba-abaf-99c2c46cf2f2",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [lakebtc] ticker",
                "fullTitle": " > [lakebtc] without API keys > [lakebtc] ticker",
                "timedOut": false,
                "duration": 1775,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "729700b9-1980-449e-a0e8-502da2e1c3e7",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [lakebtc] tickers",
                "fullTitle": " > [lakebtc] without API keys > [lakebtc] tickers",
                "timedOut": false,
                "duration": 1002,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "4993939f-0a1e-4c9b-b268-49572f62237f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [lakebtc] orderBook",
                "fullTitle": " > [lakebtc] without API keys > [lakebtc] orderBook",
                "timedOut": false,
                "duration": 995,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5fc541dc-2365-4101-acb6-3565eb1ea118",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [lakebtc] trades",
                "fullTitle": " > [lakebtc] without API keys > [lakebtc] trades",
                "timedOut": false,
                "duration": 1127,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1894a868-a02c-4b71-a51c-66f7186acb8d",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "0f9e2910-894c-4653-ba73-507fb4deb6ca",
              "ede91d3f-e6ab-44ba-abaf-99c2c46cf2f2",
              "729700b9-1980-449e-a0e8-502da2e1c3e7",
              "4993939f-0a1e-4c9b-b268-49572f62237f",
              "5fc541dc-2365-4101-acb6-3565eb1ea118",
              "1894a868-a02c-4b71-a51c-66f7186acb8d"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5297,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "ca2f32b3-dfd3-4905-aaf8-c0516a8cd678",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "699a492e-1380-4e98-975b-7e0405bddb65",
            "title": "> [kkex] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/kkex-test.js",
            "file": "/test/generated/kkex-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [kkex] connect",
                "fullTitle": " > [kkex] without API keys > [kkex] connect",
                "timedOut": false,
                "duration": 35,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "34253394-94c1-4732-a259-3ccf7b4496a1",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [kkex] markets",
                "fullTitle": " > [kkex] without API keys > [kkex] markets",
                "timedOut": false,
                "duration": 2420,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "48201d7a-674b-4dd4-838c-37c9a22f50c1",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [kkex] ticker",
                "fullTitle": " > [kkex] without API keys > [kkex] ticker",
                "timedOut": false,
                "duration": 4038,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1ab3e0fe-fe52-411e-9917-021e86e8ea37",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [kkex] tickers",
                "fullTitle": " > [kkex] without API keys > [kkex] tickers",
                "timedOut": false,
                "duration": 1951,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8ca0ff8d-7c39-4854-86cc-815a9d86caad",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [kkex] orderBook",
                "fullTitle": " > [kkex] without API keys > [kkex] orderBook",
                "timedOut": false,
                "duration": 31,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a6c0b779-10bc-4e08-be2d-4159cd22a863",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [kkex] trades",
                "fullTitle": " > [kkex] without API keys > [kkex] trades",
                "timedOut": false,
                "duration": 34,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "31a1ef43-c385-40e0-92a8-9f4fe9716f51",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "34253394-94c1-4732-a259-3ccf7b4496a1",
              "48201d7a-674b-4dd4-838c-37c9a22f50c1",
              "1ab3e0fe-fe52-411e-9917-021e86e8ea37",
              "8ca0ff8d-7c39-4854-86cc-815a9d86caad",
              "a6c0b779-10bc-4e08-be2d-4159cd22a863",
              "31a1ef43-c385-40e0-92a8-9f4fe9716f51"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 8509,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "737d97d7-7659-46a1-8ff1-094e991371b9",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "61c19e7a-9fc2-4784-81d9-b9cdfb5014d2",
            "title": "> [mercado] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/mercado-test.js",
            "file": "/test/generated/mercado-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [mercado] connect",
                "fullTitle": " > [mercado] without API keys > [mercado] connect",
                "timedOut": false,
                "duration": 35,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6762e6a7-53cc-468e-acfd-c3d8ca132d9e",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [mercado] markets",
                "fullTitle": " > [mercado] without API keys > [mercado] markets",
                "timedOut": false,
                "duration": 6,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e009489a-9d4b-4b70-8a30-d84ffdfdea45",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [mercado] ticker",
                "fullTitle": " > [mercado] without API keys > [mercado] ticker",
                "timedOut": false,
                "duration": 162,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e568862a-91a0-430e-be23-4719a72b0283",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [mercado] tickers",
                "fullTitle": " > [mercado] without API keys > [mercado] tickers",
                "timedOut": false,
                "duration": 23,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ba349ac7-d693-4ecd-aef6-33758aebc0d7",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [mercado] orderBook",
                "fullTitle": " > [mercado] without API keys > [mercado] orderBook",
                "timedOut": false,
                "duration": 824,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "9010d986-5909-432a-8df6-8d37eb015284",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [mercado] trades",
                "fullTitle": " > [mercado] without API keys > [mercado] trades",
                "timedOut": false,
                "duration": 1051,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1155ef88-c349-4f1c-8f8a-11d8cdef0ff5",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "6762e6a7-53cc-468e-acfd-c3d8ca132d9e",
              "e009489a-9d4b-4b70-8a30-d84ffdfdea45",
              "e568862a-91a0-430e-be23-4719a72b0283",
              "ba349ac7-d693-4ecd-aef6-33758aebc0d7",
              "9010d986-5909-432a-8df6-8d37eb015284",
              "1155ef88-c349-4f1c-8f8a-11d8cdef0ff5"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 2101,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "81b5ca91-a39d-47f0-a5fc-1271f14409ac",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "88196109-d850-4cd1-a24e-2322ad16f57c",
            "title": "> [lykke] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/lykke-test.js",
            "file": "/test/generated/lykke-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [lykke] connect",
                "fullTitle": " > [lykke] without API keys > [lykke] connect",
                "timedOut": false,
                "duration": 125,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a630bba2-c275-4f88-8e33-f7f63c5f129c",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [lykke] markets",
                "fullTitle": " > [lykke] without API keys > [lykke] markets",
                "timedOut": false,
                "duration": 686,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "38168e23-db2f-4c44-b732-b0dc63269768",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [lykke] ticker",
                "fullTitle": " > [lykke] without API keys > [lykke] ticker",
                "timedOut": false,
                "duration": 660,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "7bd520f5-09c2-414f-bda9-dbbb9c77597a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [lykke] tickers",
                "fullTitle": " > [lykke] without API keys > [lykke] tickers",
                "timedOut": false,
                "duration": 10,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "34464aed-c0b4-41bc-a8bd-e640cc6136d8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [lykke] orderBook",
                "fullTitle": " > [lykke] without API keys > [lykke] orderBook",
                "timedOut": false,
                "duration": 107,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2448bca9-d2ac-4865-82dc-3ff0db19b67a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [lykke] trades",
                "fullTitle": " > [lykke] without API keys > [lykke] trades",
                "timedOut": false,
                "duration": 1019,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "248f3752-294e-4cc9-b81e-ca56484137f4",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "a630bba2-c275-4f88-8e33-f7f63c5f129c",
              "38168e23-db2f-4c44-b732-b0dc63269768",
              "7bd520f5-09c2-414f-bda9-dbbb9c77597a",
              "34464aed-c0b4-41bc-a8bd-e640cc6136d8",
              "2448bca9-d2ac-4865-82dc-3ff0db19b67a",
              "248f3752-294e-4cc9-b81e-ca56484137f4"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 2607,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "30e271a6-3045-4ce1-a18b-7ad2b83a800b",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "3f7b192f-582d-4cb7-910b-75883bac7b1f",
            "title": "> [mixcoins] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/mixcoins-test.js",
            "file": "/test/generated/mixcoins-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [mixcoins] connect",
                "fullTitle": " > [mixcoins] without API keys > [mixcoins] connect",
                "timedOut": false,
                "duration": 33,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3b65ac56-873f-4ff0-a06b-58906825370c",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [mixcoins] markets",
                "fullTitle": " > [mixcoins] without API keys > [mixcoins] markets",
                "timedOut": false,
                "duration": 4,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c2430813-565e-4512-bf9f-04250770b1c7",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [mixcoins] ticker",
                "fullTitle": " > [mixcoins] without API keys > [mixcoins] ticker",
                "timedOut": false,
                "duration": 306,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "776812c4-c1f9-4fea-9345-62ed509f641c",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [mixcoins] tickers",
                "fullTitle": " > [mixcoins] without API keys > [mixcoins] tickers",
                "timedOut": false,
                "duration": 15,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5cb5eb49-199d-41be-8789-751d3260e25d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [mixcoins] orderBook",
                "fullTitle": " > [mixcoins] without API keys > [mixcoins] orderBook",
                "timedOut": false,
                "duration": 1379,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "17d61c30-ec70-4b42-8b34-eeafbd1335a9",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [mixcoins] trades",
                "fullTitle": " > [mixcoins] without API keys > [mixcoins] trades",
                "timedOut": false,
                "duration": 1511,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ec28e1aa-6b55-4a2a-85be-ef0510718284",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "3b65ac56-873f-4ff0-a06b-58906825370c",
              "c2430813-565e-4512-bf9f-04250770b1c7",
              "776812c4-c1f9-4fea-9345-62ed509f641c",
              "5cb5eb49-199d-41be-8789-751d3260e25d",
              "17d61c30-ec70-4b42-8b34-eeafbd1335a9",
              "ec28e1aa-6b55-4a2a-85be-ef0510718284"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 3248,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "ee1dbb2a-d03e-4bcf-bc47-abaa412dfe6d",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "f790cd7e-f28d-4ce5-9f74-e355a515f75b",
            "title": "> [luno] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/luno-test.js",
            "file": "/test/generated/luno-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [luno] connect",
                "fullTitle": " > [luno] without API keys > [luno] connect",
                "timedOut": false,
                "duration": 37,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "7799a18c-f6f5-46ef-96c7-e23566695b59",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [luno] markets",
                "fullTitle": " > [luno] without API keys > [luno] markets",
                "timedOut": false,
                "duration": 763,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "525c4d69-4d54-4fa8-9df7-6d2aff85461c",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [luno] ticker",
                "fullTitle": " > [luno] without API keys > [luno] ticker",
                "timedOut": false,
                "duration": 1327,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6a9baf86-e88f-49c0-a230-11a6c8ee0dfd",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [luno] tickers",
                "fullTitle": " > [luno] without API keys > [luno] tickers",
                "timedOut": false,
                "duration": 1019,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "14128366-8d74-4a7a-aec1-f85306dd6a42",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [luno] orderBook",
                "fullTitle": " > [luno] without API keys > [luno] orderBook",
                "timedOut": false,
                "duration": 992,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "edc2ff9b-70ce-4d65-a04f-47f65aa8a82f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [luno] trades",
                "fullTitle": " > [luno] without API keys > [luno] trades",
                "timedOut": false,
                "duration": 1052,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2b01bed4-d43c-4874-b34a-8d9e87f23089",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "7799a18c-f6f5-46ef-96c7-e23566695b59",
              "525c4d69-4d54-4fa8-9df7-6d2aff85461c",
              "6a9baf86-e88f-49c0-a230-11a6c8ee0dfd",
              "14128366-8d74-4a7a-aec1-f85306dd6a42",
              "edc2ff9b-70ce-4d65-a04f-47f65aa8a82f",
              "2b01bed4-d43c-4874-b34a-8d9e87f23089"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5190,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "63730e88-8697-4d57-9772-f89a6f05067f",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "cc01cc1c-cac2-4779-aa92-2142af5bf742",
            "title": "> [lbank] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/lbank-test.js",
            "file": "/test/generated/lbank-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [lbank] connect",
                "fullTitle": " > [lbank] without API keys > [lbank] connect",
                "timedOut": false,
                "duration": 32,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c5de44d0-f774-49e5-a56f-b4abd9f15d3a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [lbank] markets",
                "fullTitle": " > [lbank] without API keys > [lbank] markets",
                "timedOut": false,
                "duration": 1440,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b8d2bdec-4fd9-4ae2-a3b5-c3f8fb98df78",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [lbank] ticker",
                "fullTitle": " > [lbank] without API keys > [lbank] ticker",
                "timedOut": false,
                "duration": 2770,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6684b656-8124-4812-87e0-0957c880a565",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [lbank] tickers",
                "fullTitle": " > [lbank] without API keys > [lbank] tickers",
                "timedOut": false,
                "duration": 2245,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3d8986b6-0b5c-49ae-8b87-9c9168d36bf0",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [lbank] orderBook",
                "fullTitle": " > [lbank] without API keys > [lbank] orderBook",
                "timedOut": false,
                "duration": 1758,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "19c9c76a-4c18-4150-9dca-20dcbb9408c2",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [lbank] trades",
                "fullTitle": " > [lbank] without API keys > [lbank] trades",
                "timedOut": false,
                "duration": 2012,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "78a0f01e-2800-4760-b828-089c90d3d0f1",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "c5de44d0-f774-49e5-a56f-b4abd9f15d3a",
              "b8d2bdec-4fd9-4ae2-a3b5-c3f8fb98df78",
              "6684b656-8124-4812-87e0-0957c880a565",
              "3d8986b6-0b5c-49ae-8b87-9c9168d36bf0",
              "19c9c76a-4c18-4150-9dca-20dcbb9408c2",
              "78a0f01e-2800-4760-b828-089c90d3d0f1"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 10257,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "6b1f1bbd-615e-4d77-ac6b-25320dbee5d2",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "73ba438a-b9f9-48ca-81ef-e95eca95c510",
            "title": "> [livecoin] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/livecoin-test.js",
            "file": "/test/generated/livecoin-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [livecoin] connect",
                "fullTitle": " > [livecoin] without API keys > [livecoin] connect",
                "timedOut": false,
                "duration": 37,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ee0d7e18-3802-46a3-8f34-4e4e683e7010",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [livecoin] markets",
                "fullTitle": " > [livecoin] without API keys > [livecoin] markets",
                "timedOut": false,
                "duration": 1309,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e1471de6-62a9-4e03-9cfe-62b29212f5dc",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [livecoin] ticker",
                "fullTitle": " > [livecoin] without API keys > [livecoin] ticker",
                "timedOut": false,
                "duration": 4051,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "d10c0ee8-525c-43a1-ba6b-1e0481e097fe",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [livecoin] tickers",
                "fullTitle": " > [livecoin] without API keys > [livecoin] tickers",
                "timedOut": false,
                "duration": 1047,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "688c84b5-3f1f-499a-993e-55eb6abd3c86",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [livecoin] orderBook",
                "fullTitle": " > [livecoin] without API keys > [livecoin] orderBook",
                "timedOut": false,
                "duration": 960,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1836f917-4da6-439b-bb29-312c30d6465d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [livecoin] trades",
                "fullTitle": " > [livecoin] without API keys > [livecoin] trades",
                "timedOut": false,
                "duration": 1125,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b71fb6c0-5d05-4489-99e1-6bf9a39f76dd",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "ee0d7e18-3802-46a3-8f34-4e4e683e7010",
              "e1471de6-62a9-4e03-9cfe-62b29212f5dc",
              "d10c0ee8-525c-43a1-ba6b-1e0481e097fe",
              "688c84b5-3f1f-499a-993e-55eb6abd3c86",
              "1836f917-4da6-439b-bb29-312c30d6465d",
              "b71fb6c0-5d05-4489-99e1-6bf9a39f76dd"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 8529,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "cf71f1b4-77a9-4a38-8cf1-1a467b8fcbbb",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "fd0a7a83-f7eb-49da-b5fd-5257e688d1b6",
            "title": "> [liquid] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/liquid-test.js",
            "file": "/test/generated/liquid-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [liquid] connect",
                "fullTitle": " > [liquid] without API keys > [liquid] connect",
                "timedOut": false,
                "duration": 38,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "16dc900d-2893-4782-b757-5d34de5482e8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [liquid] markets",
                "fullTitle": " > [liquid] without API keys > [liquid] markets",
                "timedOut": false,
                "duration": 2287,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5fd7cc42-1442-43cb-b57f-206f0212338a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [liquid] ticker",
                "fullTitle": " > [liquid] without API keys > [liquid] ticker",
                "timedOut": false,
                "duration": 5040,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "7f7e79b5-c996-4b11-ae7e-23a1aa5aea18",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [liquid] tickers",
                "fullTitle": " > [liquid] without API keys > [liquid] tickers",
                "timedOut": false,
                "duration": 1353,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6de99ffe-dde4-40d9-878e-6a965dff8f98",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [liquid] orderBook",
                "fullTitle": " > [liquid] without API keys > [liquid] orderBook",
                "timedOut": false,
                "duration": 334,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "14441539-14d7-439d-b5e2-2b3ee3c47f18",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [liquid] trades",
                "fullTitle": " > [liquid] without API keys > [liquid] trades",
                "timedOut": false,
                "duration": 1171,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "49e4071b-d8bb-433e-bf78-550ce710a111",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "16dc900d-2893-4782-b757-5d34de5482e8",
              "5fd7cc42-1442-43cb-b57f-206f0212338a",
              "7f7e79b5-c996-4b11-ae7e-23a1aa5aea18",
              "6de99ffe-dde4-40d9-878e-6a965dff8f98",
              "14441539-14d7-439d-b5e2-2b3ee3c47f18",
              "49e4071b-d8bb-433e-bf78-550ce710a111"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 10223,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "7511e5a7-a892-4f19-bfed-063675a5a9d3",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "c3e04a03-bc58-4c78-822b-0207d3982766",
            "title": "> [latoken] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/latoken-test.js",
            "file": "/test/generated/latoken-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [latoken] connect",
                "fullTitle": " > [latoken] without API keys > [latoken] connect",
                "timedOut": false,
                "duration": 45,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b0ada7cd-dc0e-4f47-8e03-366d01848777",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [latoken] markets",
                "fullTitle": " > [latoken] without API keys > [latoken] markets",
                "timedOut": false,
                "duration": 899,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "987b3f4f-1898-45aa-860f-73213da093a8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [latoken] ticker",
                "fullTitle": " > [latoken] without API keys > [latoken] ticker",
                "timedOut": false,
                "duration": 5274,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f0e3436c-ac31-4541-9d71-4ac1b2d7c1db",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [latoken] tickers",
                "fullTitle": " > [latoken] without API keys > [latoken] tickers",
                "timedOut": false,
                "duration": 2466,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2b2fc15b-fbfd-4081-82ff-386734a2d8e1",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [latoken] orderBook",
                "fullTitle": " > [latoken] without API keys > [latoken] orderBook",
                "timedOut": false,
                "duration": 1636,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "84395492-8c6e-43c5-8a58-5fcc2a576bbe",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [latoken] trades",
                "fullTitle": " > [latoken] without API keys > [latoken] trades",
                "timedOut": false,
                "duration": 2017,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "083ebc02-a8f9-4edb-8962-acf51b638b3d",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "b0ada7cd-dc0e-4f47-8e03-366d01848777",
              "987b3f4f-1898-45aa-860f-73213da093a8",
              "f0e3436c-ac31-4541-9d71-4ac1b2d7c1db",
              "2b2fc15b-fbfd-4081-82ff-386734a2d8e1",
              "84395492-8c6e-43c5-8a58-5fcc2a576bbe",
              "083ebc02-a8f9-4edb-8962-acf51b638b3d"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 12337,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "ebe0e3ac-75c3-4238-ad30-78d64e35ad24",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "0e4e599a-d7e2-4e5d-8c0b-1e362ad135ca",
            "title": "> [okcoin] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/okcoin-test.js",
            "file": "/test/generated/okcoin-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [okcoin] connect",
                "fullTitle": " > [okcoin] without API keys > [okcoin] connect",
                "timedOut": false,
                "duration": 94,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "88bfa765-792e-41ee-ba96-33dd406811ea",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [okcoin] markets",
                "fullTitle": " > [okcoin] without API keys > [okcoin] markets",
                "timedOut": false,
                "duration": 344,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "47f2b677-f76c-41a1-b6ee-a97bd4f269b4",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [okcoin] ticker",
                "fullTitle": " > [okcoin] without API keys > [okcoin] ticker",
                "timedOut": false,
                "duration": 1866,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8383d64d-2c66-46aa-bf4c-a9805951efee",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [okcoin] tickers",
                "fullTitle": " > [okcoin] without API keys > [okcoin] tickers",
                "timedOut": false,
                "duration": 1014,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "17be5495-2e3a-419b-b231-7a0574c25b18",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [okcoin] orderBook",
                "fullTitle": " > [okcoin] without API keys > [okcoin] orderBook",
                "timedOut": false,
                "duration": 977,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3a25562f-bea7-45f1-b69d-90173f643cad",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [okcoin] trades",
                "fullTitle": " > [okcoin] without API keys > [okcoin] trades",
                "timedOut": false,
                "duration": 1027,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "96f08ee4-0da2-451a-a32e-7b1adebd204a",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "88bfa765-792e-41ee-ba96-33dd406811ea",
              "47f2b677-f76c-41a1-b6ee-a97bd4f269b4",
              "8383d64d-2c66-46aa-bf4c-a9805951efee",
              "17be5495-2e3a-419b-b231-7a0574c25b18",
              "3a25562f-bea7-45f1-b69d-90173f643cad",
              "96f08ee4-0da2-451a-a32e-7b1adebd204a"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5322,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "2c137a14-a07c-4ef5-8087-d6cbf9e396c7",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "b47e1d01-0c43-4962-aa64-fb23d82f98ab",
            "title": "> [paymium] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/paymium-test.js",
            "file": "/test/generated/paymium-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [paymium] connect",
                "fullTitle": " > [paymium] without API keys > [paymium] connect",
                "timedOut": false,
                "duration": 40,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a46d176a-f405-4fc8-bb9a-c96a5247124c",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [paymium] markets",
                "fullTitle": " > [paymium] without API keys > [paymium] markets",
                "timedOut": false,
                "duration": 82,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "432a115e-52d0-4298-921c-f21613ee1740",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [paymium] ticker",
                "fullTitle": " > [paymium] without API keys > [paymium] ticker",
                "timedOut": false,
                "duration": 629,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ecbd43da-9697-4efc-866c-0c44bb62e5fc",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [paymium] tickers",
                "fullTitle": " > [paymium] without API keys > [paymium] tickers",
                "timedOut": false,
                "duration": 13,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c7993e13-8da8-426f-ad62-8973a7fddc06",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [paymium] orderBook",
                "fullTitle": " > [paymium] without API keys > [paymium] orderBook",
                "timedOut": false,
                "duration": 2836,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "bc8cf023-f930-4161-aea0-fdbefe14b09b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [paymium] trades",
                "fullTitle": " > [paymium] without API keys > [paymium] trades",
                "timedOut": false,
                "duration": 784,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "edd5953e-77e7-4172-8be8-1f1a63ce0caa",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "a46d176a-f405-4fc8-bb9a-c96a5247124c",
              "432a115e-52d0-4298-921c-f21613ee1740",
              "ecbd43da-9697-4efc-866c-0c44bb62e5fc",
              "c7993e13-8da8-426f-ad62-8973a7fddc06",
              "bc8cf023-f930-4161-aea0-fdbefe14b09b",
              "edd5953e-77e7-4172-8be8-1f1a63ce0caa"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 4384,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "322b3423-f3f4-424d-b162-abe1f9e12b74",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "cee0bd4f-7101-4fe9-8836-224897f3070d",
            "title": "> [probit] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/probit-test.js",
            "file": "/test/generated/probit-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [probit] connect",
                "fullTitle": " > [probit] without API keys > [probit] connect",
                "timedOut": false,
                "duration": 43,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0617718b-9aff-4e0f-88c1-b8fb0d663b04",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [probit] markets",
                "fullTitle": " > [probit] without API keys > [probit] markets",
                "timedOut": false,
                "duration": 1225,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "19d099af-6e36-4896-a2ef-b0cbe1344a34",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [probit] ticker",
                "fullTitle": " > [probit] without API keys > [probit] ticker",
                "timedOut": false,
                "duration": 2536,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "42226fa1-58bf-43cb-8d7a-4d4aa6f7b7a0",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [probit] tickers",
                "fullTitle": " > [probit] without API keys > [probit] tickers",
                "timedOut": false,
                "duration": 294,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a2c3d991-7d4a-42d9-ab6c-7305322fc8a9",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [probit] orderBook",
                "fullTitle": " > [probit] without API keys > [probit] orderBook",
                "timedOut": false,
                "duration": 285,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c8906d12-8691-41ae-ba92-aad5cbad1617",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [probit] trades",
                "fullTitle": " > [probit] without API keys > [probit] trades",
                "timedOut": false,
                "duration": 282,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c7466ec2-6c9e-45c6-9c1b-be0367068d81",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "0617718b-9aff-4e0f-88c1-b8fb0d663b04",
              "19d099af-6e36-4896-a2ef-b0cbe1344a34",
              "42226fa1-58bf-43cb-8d7a-4d4aa6f7b7a0",
              "a2c3d991-7d4a-42d9-ab6c-7305322fc8a9",
              "c8906d12-8691-41ae-ba92-aad5cbad1617",
              "c7466ec2-6c9e-45c6-9c1b-be0367068d81"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 4665,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "35d29322-ff2c-4727-ae13-8967e0833c9d",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "9f440937-af6b-4ed8-bc9f-af1d6ef773ae",
            "title": "> [poloniex] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/poloniex-test.js",
            "file": "/test/generated/poloniex-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [poloniex] connect",
                "fullTitle": " > [poloniex] without API keys > [poloniex] connect",
                "timedOut": false,
                "duration": 42,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "843e7932-4621-498f-8a45-78335f446cb6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [poloniex] markets",
                "fullTitle": " > [poloniex] without API keys > [poloniex] markets",
                "timedOut": false,
                "duration": 356,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "37c7792b-b13c-49a8-b3d4-81b2c1996045",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [poloniex] ticker",
                "fullTitle": " > [poloniex] without API keys > [poloniex] ticker",
                "timedOut": false,
                "duration": 3182,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a2382950-14d2-429f-ab45-a78386fc7ff4",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [poloniex] tickers",
                "fullTitle": " > [poloniex] without API keys > [poloniex] tickers",
                "timedOut": false,
                "duration": 1079,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "9b09117b-0f75-400e-8408-06e43cb11b32",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [poloniex] orderBook",
                "fullTitle": " > [poloniex] without API keys > [poloniex] orderBook",
                "timedOut": false,
                "duration": 991,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "43d17459-88b7-42fb-abb8-d95fd4a79b09",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [poloniex] trades",
                "fullTitle": " > [poloniex] without API keys > [poloniex] trades",
                "timedOut": false,
                "duration": 645,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "fb2d9b05-a0b7-4ff6-a030-3284ec85e907",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "843e7932-4621-498f-8a45-78335f446cb6",
              "37c7792b-b13c-49a8-b3d4-81b2c1996045",
              "a2382950-14d2-429f-ab45-a78386fc7ff4",
              "9b09117b-0f75-400e-8408-06e43cb11b32",
              "43d17459-88b7-42fb-abb8-d95fd4a79b09",
              "fb2d9b05-a0b7-4ff6-a030-3284ec85e907"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 6295,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "c6e3fc37-04a5-4bb6-90b8-19de19de07dc",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "b7976a2b-c760-4855-a444-f577fc039073",
            "title": "> [stex] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/stex-test.js",
            "file": "/test/generated/stex-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [stex] connect",
                "fullTitle": " > [stex] without API keys > [stex] connect",
                "timedOut": false,
                "duration": 45,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "be31933e-60dd-4497-9da6-d2aec0bf606a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [stex] markets",
                "fullTitle": " > [stex] without API keys > [stex] markets",
                "timedOut": false,
                "duration": 458,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "712e0212-f3dc-42e7-b8c0-88daead20492",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [stex] ticker",
                "fullTitle": " > [stex] without API keys > [stex] ticker",
                "timedOut": false,
                "duration": 1648,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c928cc98-ca55-4555-bd08-019e7d3548d6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [stex] tickers",
                "fullTitle": " > [stex] without API keys > [stex] tickers",
                "timedOut": false,
                "duration": 513,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b3edeb54-8111-47b9-962e-4c90cf76c9b8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [stex] orderBook",
                "fullTitle": " > [stex] without API keys > [stex] orderBook",
                "timedOut": false,
                "duration": 242,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "53e48ce2-81f6-4af8-b8f5-09dcdecf2fcf",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [stex] trades",
                "fullTitle": " > [stex] without API keys > [stex] trades",
                "timedOut": false,
                "duration": 459,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "cfc0b732-9398-42c2-b32a-76e18aacb780",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "be31933e-60dd-4497-9da6-d2aec0bf606a",
              "712e0212-f3dc-42e7-b8c0-88daead20492",
              "c928cc98-ca55-4555-bd08-019e7d3548d6",
              "b3edeb54-8111-47b9-962e-4c90cf76c9b8",
              "53e48ce2-81f6-4af8-b8f5-09dcdecf2fcf",
              "cfc0b732-9398-42c2-b32a-76e18aacb780"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 3365,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "76be08c4-ac0e-4046-b49e-c3cb2f6538c4",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "c49b8d1f-1bb6-469b-8752-c64a0ad3b5b5",
            "title": "> [coolcoin] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/coolcoin-test.js",
            "file": "/test/generated/coolcoin-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [coolcoin] connect",
                "fullTitle": " > [coolcoin] without API keys > [coolcoin] connect",
                "timedOut": false,
                "duration": 196,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5e9c0c96-88e9-4df9-ab65-7191fb2c167c",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coolcoin] markets",
                "fullTitle": " > [coolcoin] without API keys > [coolcoin] markets",
                "timedOut": false,
                "duration": 40014,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a79492a6-7b84-4eec-b39b-3a96d2dd228a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coolcoin] ticker",
                "fullTitle": " > [coolcoin] without API keys > [coolcoin] ticker",
                "timedOut": false,
                "duration": 10088,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "fd108cc6-bc56-4be5-83f0-d2a342d3e51f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coolcoin] tickers",
                "fullTitle": " > [coolcoin] without API keys > [coolcoin] tickers",
                "timedOut": false,
                "duration": 17,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b4ade2ac-95e9-4910-98b4-621859c1a187",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coolcoin] orderBook",
                "fullTitle": " > [coolcoin] without API keys > [coolcoin] orderBook",
                "timedOut": false,
                "duration": 55,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3403bdba-162d-446e-a1f5-f5bebf4171f6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [coolcoin] trades",
                "fullTitle": " > [coolcoin] without API keys > [coolcoin] trades",
                "timedOut": false,
                "duration": 37,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f7d1ba12-6452-4df4-a780-33e89817bb2a",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "5e9c0c96-88e9-4df9-ab65-7191fb2c167c",
              "a79492a6-7b84-4eec-b39b-3a96d2dd228a",
              "fd108cc6-bc56-4be5-83f0-d2a342d3e51f",
              "b4ade2ac-95e9-4910-98b4-621859c1a187",
              "3403bdba-162d-446e-a1f5-f5bebf4171f6",
              "f7d1ba12-6452-4df4-a780-33e89817bb2a"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 50407,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "8cb848c2-04f0-4864-98dd-3132c2d20df7",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "a32ccaf8-4a21-4942-9c89-a1c0bd88a5ee",
            "title": "> [southxchange] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/southxchange-test.js",
            "file": "/test/generated/southxchange-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [southxchange] connect",
                "fullTitle": " > [southxchange] without API keys > [southxchange] connect",
                "timedOut": false,
                "duration": 35,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "44a827d6-9ef4-4930-b29a-81aa602b21b9",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [southxchange] markets",
                "fullTitle": " > [southxchange] without API keys > [southxchange] markets",
                "timedOut": false,
                "duration": 239,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "9fabe968-1045-4dbd-9bd5-f78dbf918d67",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [southxchange] ticker",
                "fullTitle": " > [southxchange] without API keys > [southxchange] ticker",
                "timedOut": false,
                "duration": 1799,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "26a8e09a-29ce-4077-b4d5-c7bda7c10a50",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [southxchange] tickers",
                "fullTitle": " > [southxchange] without API keys > [southxchange] tickers",
                "timedOut": false,
                "duration": 1039,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ac035c54-732c-4e8e-9e6c-681b64b19410",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [southxchange] orderBook",
                "fullTitle": " > [southxchange] without API keys > [southxchange] orderBook",
                "timedOut": false,
                "duration": 932,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3bb2fa46-4be2-4f20-bea3-7851020c5099",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [southxchange] trades",
                "fullTitle": " > [southxchange] without API keys > [southxchange] trades",
                "timedOut": false,
                "duration": 1015,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "33c2c5e2-c93a-462f-b263-c527e32f1493",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "44a827d6-9ef4-4930-b29a-81aa602b21b9",
              "9fabe968-1045-4dbd-9bd5-f78dbf918d67",
              "26a8e09a-29ce-4077-b4d5-c7bda7c10a50",
              "ac035c54-732c-4e8e-9e6c-681b64b19410",
              "3bb2fa46-4be2-4f20-bea3-7851020c5099",
              "33c2c5e2-c93a-462f-b263-c527e32f1493"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5059,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "86fd67b6-44c3-482f-926f-4af245445935",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "9c354ac0-2baf-4db2-99e4-88496620cedf",
            "title": "> [qtrade] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/qtrade-test.js",
            "file": "/test/generated/qtrade-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [qtrade] connect",
                "fullTitle": " > [qtrade] without API keys > [qtrade] connect",
                "timedOut": false,
                "duration": 41,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6c74819e-3d47-4846-9520-5ee361cef8f2",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [qtrade] markets",
                "fullTitle": " > [qtrade] without API keys > [qtrade] markets",
                "timedOut": false,
                "duration": 265,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "042e7c2d-9e50-4737-980b-a5e78cc5655c",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [qtrade] ticker",
                "fullTitle": " > [qtrade] without API keys > [qtrade] ticker",
                "timedOut": false,
                "duration": 2766,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f793d67f-a8c1-4864-8f04-47f81ca4978b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [qtrade] tickers",
                "fullTitle": " > [qtrade] without API keys > [qtrade] tickers",
                "timedOut": false,
                "duration": 1120,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f99c2c26-1499-49ba-a8ea-e8e7ea879b53",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [qtrade] orderBook",
                "fullTitle": " > [qtrade] without API keys > [qtrade] orderBook",
                "timedOut": false,
                "duration": 883,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "934ce979-a893-4b13-a03a-9634e1616d62",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [qtrade] trades",
                "fullTitle": " > [qtrade] without API keys > [qtrade] trades",
                "timedOut": false,
                "duration": 1187,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "55ef37c0-db78-47be-865e-09ba66505871",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "6c74819e-3d47-4846-9520-5ee361cef8f2",
              "042e7c2d-9e50-4737-980b-a5e78cc5655c",
              "f793d67f-a8c1-4864-8f04-47f81ca4978b",
              "f99c2c26-1499-49ba-a8ea-e8e7ea879b53",
              "934ce979-a893-4b13-a03a-9634e1616d62",
              "55ef37c0-db78-47be-865e-09ba66505871"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 6262,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "d6d133de-3348-45fa-ae18-f1679f0dcb0c",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "3f4f8ec7-3bf3-4f85-8cb4-a6de9474fb09",
            "title": "> [stronghold] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/stronghold-test.js",
            "file": "/test/generated/stronghold-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [stronghold] connect",
                "fullTitle": " > [stronghold] without API keys > [stronghold] connect",
                "timedOut": false,
                "duration": 46,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "40302149-839d-4f9e-a8a2-8d2298d618ef",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [stronghold] markets",
                "fullTitle": " > [stronghold] without API keys > [stronghold] markets",
                "timedOut": false,
                "duration": 3057,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5cefea60-6aca-446b-b475-5a06b4dfc264",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [stronghold] ticker",
                "fullTitle": " > [stronghold] without API keys > [stronghold] ticker",
                "timedOut": false,
                "duration": 8,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2b58f87b-dfdb-48cf-bec5-5d99f77079fb",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [stronghold] tickers",
                "fullTitle": " > [stronghold] without API keys > [stronghold] tickers",
                "timedOut": false,
                "duration": 8,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "203d75a7-1bb3-4110-9a14-e9229de6834f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [stronghold] orderBook",
                "fullTitle": " > [stronghold] without API keys > [stronghold] orderBook",
                "timedOut": false,
                "duration": 2006,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e08f4301-b0c9-49d3-9b0a-e85e7b649140",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [stronghold] trades",
                "fullTitle": " > [stronghold] without API keys > [stronghold] trades",
                "timedOut": false,
                "duration": 30,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "25322adc-08a8-4a4f-84e2-b23a1da9cd9e",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "40302149-839d-4f9e-a8a2-8d2298d618ef",
              "5cefea60-6aca-446b-b475-5a06b4dfc264",
              "2b58f87b-dfdb-48cf-bec5-5d99f77079fb",
              "203d75a7-1bb3-4110-9a14-e9229de6834f",
              "e08f4301-b0c9-49d3-9b0a-e85e7b649140",
              "25322adc-08a8-4a4f-84e2-b23a1da9cd9e"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5155,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "dcc2a425-a153-4057-8d30-6327fdbe2523",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "667075d6-fa67-41e5-a631-5d9fa6487d56",
            "title": "> [oceanex] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/oceanex-test.js",
            "file": "/test/generated/oceanex-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [oceanex] connect",
                "fullTitle": " > [oceanex] without API keys > [oceanex] connect",
                "timedOut": false,
                "duration": 292,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "94feba6a-6574-4b5e-8e59-dfdf03ce1788",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [oceanex] markets",
                "fullTitle": " > [oceanex] without API keys > [oceanex] markets",
                "timedOut": false,
                "duration": 420,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "593e6d88-8f64-44d5-9c04-2e83e2037de1",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [oceanex] ticker",
                "fullTitle": " > [oceanex] without API keys > [oceanex] ticker",
                "timedOut": false,
                "duration": 6237,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "120262bf-6c5c-4951-81bb-5d85f5b9b142",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [oceanex] tickers",
                "fullTitle": " > [oceanex] without API keys > [oceanex] tickers",
                "timedOut": false,
                "duration": 3296,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1859dcf1-ca7a-4bf6-9940-862219bb420f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [oceanex] orderBook",
                "fullTitle": " > [oceanex] without API keys > [oceanex] orderBook",
                "timedOut": false,
                "duration": 2261,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "212e5779-07ee-490b-ad89-eac040df1fc6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [oceanex] trades",
                "fullTitle": " > [oceanex] without API keys > [oceanex] trades",
                "timedOut": false,
                "duration": 3002,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "900166f3-62a8-4bd5-a57f-6cbee4049538",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "94feba6a-6574-4b5e-8e59-dfdf03ce1788",
              "593e6d88-8f64-44d5-9c04-2e83e2037de1",
              "120262bf-6c5c-4951-81bb-5d85f5b9b142",
              "1859dcf1-ca7a-4bf6-9940-862219bb420f",
              "212e5779-07ee-490b-ad89-eac040df1fc6",
              "900166f3-62a8-4bd5-a57f-6cbee4049538"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 15508,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "ae35bb57-556f-49d9-9000-a2bc890807ed",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "b8d68afe-1513-40b5-8853-884b34c7a62c",
            "title": "> [surbitcoin] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/surbitcoin-test.js",
            "file": "/test/generated/surbitcoin-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [surbitcoin] connect",
                "fullTitle": " > [surbitcoin] without API keys > [surbitcoin] connect",
                "timedOut": false,
                "duration": 60,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a313a540-9315-4d97-a7c5-0fa6241cf62e",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [surbitcoin] markets",
                "fullTitle": " > [surbitcoin] without API keys > [surbitcoin] markets",
                "timedOut": false,
                "duration": 17,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c85b8d6f-b7a2-4c60-9ca3-a7b645e14c82",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [surbitcoin] ticker",
                "fullTitle": " > [surbitcoin] without API keys > [surbitcoin] ticker",
                "timedOut": false,
                "duration": 188,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6847f03f-352a-4014-bef0-8ab63df4e4db",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [surbitcoin] tickers",
                "fullTitle": " > [surbitcoin] without API keys > [surbitcoin] tickers",
                "timedOut": false,
                "duration": 48,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1d5980bf-41c2-43db-ae53-97ae4b091531",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [surbitcoin] orderBook",
                "fullTitle": " > [surbitcoin] without API keys > [surbitcoin] orderBook",
                "timedOut": false,
                "duration": 753,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a749aed3-a79d-4511-8886-7237db6a552a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [surbitcoin] trades",
                "fullTitle": " > [surbitcoin] without API keys > [surbitcoin] trades",
                "timedOut": false,
                "duration": 4026,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b003ee74-c227-4095-b22d-cc40c330d98c",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "a313a540-9315-4d97-a7c5-0fa6241cf62e",
              "c85b8d6f-b7a2-4c60-9ca3-a7b645e14c82",
              "6847f03f-352a-4014-bef0-8ab63df4e4db",
              "1d5980bf-41c2-43db-ae53-97ae4b091531",
              "a749aed3-a79d-4511-8886-7237db6a552a",
              "b003ee74-c227-4095-b22d-cc40c330d98c"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5092,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "2eebe041-e4a9-4d24-8ae8-ff232a666e24",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "546f46a0-34b2-4b75-9fe9-f697ea9cbf26",
            "title": "> [therock] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/therock-test.js",
            "file": "/test/generated/therock-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [therock] connect",
                "fullTitle": " > [therock] without API keys > [therock] connect",
                "timedOut": false,
                "duration": 46,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e10bfe1d-c79b-4280-b3f0-6d750a44e9e2",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [therock] markets",
                "fullTitle": " > [therock] without API keys > [therock] markets",
                "timedOut": false,
                "duration": 488,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f639528f-73e1-4bd6-b162-730b505e7ba3",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [therock] ticker",
                "fullTitle": " > [therock] without API keys > [therock] ticker",
                "timedOut": false,
                "duration": 1598,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2c47755d-c241-4152-ac52-db019ae74f49",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [therock] tickers",
                "fullTitle": " > [therock] without API keys > [therock] tickers",
                "timedOut": false,
                "duration": 1056,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "d2892b9c-6ccc-4fd4-94a9-99e2cef89e8f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [therock] orderBook",
                "fullTitle": " > [therock] without API keys > [therock] orderBook",
                "timedOut": false,
                "duration": 1196,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2446c3df-46ba-479c-a879-0e9148d229cb",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [therock] trades",
                "fullTitle": " > [therock] without API keys > [therock] trades",
                "timedOut": false,
                "duration": 822,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "aa7a1bec-a8db-4e42-9b14-42479cab7524",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "e10bfe1d-c79b-4280-b3f0-6d750a44e9e2",
              "f639528f-73e1-4bd6-b162-730b505e7ba3",
              "2c47755d-c241-4152-ac52-db019ae74f49",
              "d2892b9c-6ccc-4fd4-94a9-99e2cef89e8f",
              "2446c3df-46ba-479c-a879-0e9148d229cb",
              "aa7a1bec-a8db-4e42-9b14-42479cab7524"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5206,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "cebfb8e7-bbac-42d2-8dae-c7d7368b190c",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "fe3995af-40b1-422a-a62c-02fe1b264255",
            "title": "> [tidebit] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/tidebit-test.js",
            "file": "/test/generated/tidebit-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [tidebit] connect",
                "fullTitle": " > [tidebit] without API keys > [tidebit] connect",
                "timedOut": false,
                "duration": 37,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "72ab00c8-ea8a-41dd-8d71-dd52bad11b29",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [tidebit] markets",
                "fullTitle": " > [tidebit] without API keys > [tidebit] markets",
                "timedOut": false,
                "duration": 894,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6e77943a-9ece-4339-b4e3-d0444d1185c1",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [tidebit] ticker",
                "fullTitle": " > [tidebit] without API keys > [tidebit] ticker",
                "timedOut": false,
                "duration": 2166,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "37626d1b-f3d8-4689-880d-82b6f6429507",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [tidebit] tickers",
                "fullTitle": " > [tidebit] without API keys > [tidebit] tickers",
                "timedOut": false,
                "duration": 908,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ca273ee7-b3df-4d2c-82b7-d8ba97876163",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [tidebit] orderBook",
                "fullTitle": " > [tidebit] without API keys > [tidebit] orderBook",
                "timedOut": false,
                "duration": 928,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "85c27553-1148-4b7f-9fff-bbe5e3ff5b82",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [tidebit] trades",
                "fullTitle": " > [tidebit] without API keys > [tidebit] trades",
                "timedOut": false,
                "duration": 1195,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "440b923a-7530-4431-aae0-d2c48e69b6cf",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "72ab00c8-ea8a-41dd-8d71-dd52bad11b29",
              "6e77943a-9ece-4339-b4e3-d0444d1185c1",
              "37626d1b-f3d8-4689-880d-82b6f6429507",
              "ca273ee7-b3df-4d2c-82b7-d8ba97876163",
              "85c27553-1148-4b7f-9fff-bbe5e3ff5b82",
              "440b923a-7530-4431-aae0-d2c48e69b6cf"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 6128,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "051f72df-b519-4f79-88bc-5b21e5b03bd1",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "00dd906b-9a9b-4a14-a32a-1e3598179463",
            "title": "> [okex] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/okex-test.js",
            "file": "/test/generated/okex-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [okex] connect",
                "fullTitle": " > [okex] without API keys > [okex] connect",
                "timedOut": false,
                "duration": 39,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8f6c9310-93dc-4238-81c3-28c05ad5af9b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [okex] markets",
                "fullTitle": " > [okex] without API keys > [okex] markets",
                "timedOut": false,
                "duration": 6307,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2afad9ed-0d34-42d1-848a-2d8a3904dc26",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [okex] ticker",
                "fullTitle": " > [okex] without API keys > [okex] ticker",
                "timedOut": false,
                "duration": 7984,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "abd9e088-253f-4f2e-acdc-b246e653275d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [okex] tickers",
                "fullTitle": " > [okex] without API keys > [okex] tickers",
                "timedOut": false,
                "duration": 973,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "58c07f48-69d2-4064-b9ad-b719da1faaa6",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [okex] orderBook",
                "fullTitle": " > [okex] without API keys > [okex] orderBook",
                "timedOut": false,
                "duration": 941,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "90a4dfb0-2113-4419-b02c-118f3841a320",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [okex] trades",
                "fullTitle": " > [okex] without API keys > [okex] trades",
                "timedOut": false,
                "duration": 1011,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e18f55cb-78ae-4103-86d0-93343abb1097",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "8f6c9310-93dc-4238-81c3-28c05ad5af9b",
              "2afad9ed-0d34-42d1-848a-2d8a3904dc26",
              "abd9e088-253f-4f2e-acdc-b246e653275d",
              "58c07f48-69d2-4064-b9ad-b719da1faaa6",
              "90a4dfb0-2113-4419-b02c-118f3841a320",
              "e18f55cb-78ae-4103-86d0-93343abb1097"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 17255,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "259ec145-0801-436a-af3a-1b129b5b7f47",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "0f906118-a630-43a9-93ef-de7111d6cc2b",
            "title": "> [vaultoro] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/vaultoro-test.js",
            "file": "/test/generated/vaultoro-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [vaultoro] connect",
                "fullTitle": " > [vaultoro] without API keys > [vaultoro] connect",
                "timedOut": false,
                "duration": 36,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2dad91bf-7b2b-4ce7-8a82-21d835f59f3f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [vaultoro] markets",
                "fullTitle": " > [vaultoro] without API keys > [vaultoro] markets",
                "timedOut": false,
                "duration": 3031,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1235a909-f160-48e0-9cab-156bfedc597d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [vaultoro] ticker",
                "fullTitle": " > [vaultoro] without API keys > [vaultoro] ticker",
                "timedOut": false,
                "duration": 6,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e7ae4578-0341-4281-9341-3af6f52fd90e",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [vaultoro] tickers",
                "fullTitle": " > [vaultoro] without API keys > [vaultoro] tickers",
                "timedOut": false,
                "duration": 4,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "eb70a612-385e-4d99-888c-b9e628a10198",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [vaultoro] orderBook",
                "fullTitle": " > [vaultoro] without API keys > [vaultoro] orderBook",
                "timedOut": false,
                "duration": 1000,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f9289314-a14b-4b9e-8730-16bc6b2fd4d8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [vaultoro] trades",
                "fullTitle": " > [vaultoro] without API keys > [vaultoro] trades",
                "timedOut": false,
                "duration": 34,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "8565ec9c-aa4e-4b98-93b4-5c88ba830594",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "2dad91bf-7b2b-4ce7-8a82-21d835f59f3f",
              "1235a909-f160-48e0-9cab-156bfedc597d",
              "e7ae4578-0341-4281-9341-3af6f52fd90e",
              "eb70a612-385e-4d99-888c-b9e628a10198",
              "f9289314-a14b-4b9e-8730-16bc6b2fd4d8",
              "8565ec9c-aa4e-4b98-93b4-5c88ba830594"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 4111,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "bcf3bbe2-e16c-4336-8d37-73eb6818f048",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "dca4cc2a-1d71-4774-b14f-2ae47c594c27",
            "title": "> [upbit] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/upbit-test.js",
            "file": "/test/generated/upbit-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [upbit] connect",
                "fullTitle": " > [upbit] without API keys > [upbit] connect",
                "timedOut": false,
                "duration": 55,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2f9acc14-5e28-45b8-9dc6-e776f34317e0",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [upbit] markets",
                "fullTitle": " > [upbit] without API keys > [upbit] markets",
                "timedOut": false,
                "duration": 1200,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "fff063b7-7782-455e-a936-7e966d22d309",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [upbit] ticker",
                "fullTitle": " > [upbit] without API keys > [upbit] ticker",
                "timedOut": false,
                "duration": 1205,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e8858ff4-4954-49de-8396-10d1ee0dea55",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [upbit] tickers",
                "fullTitle": " > [upbit] without API keys > [upbit] tickers",
                "timedOut": false,
                "duration": 1425,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "cd07fd7f-13e9-4645-b322-529366f695e9",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [upbit] orderBook",
                "fullTitle": " > [upbit] without API keys > [upbit] orderBook",
                "timedOut": false,
                "duration": 586,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6e1d4fa8-f3c6-4e32-92eb-65d9de8a547f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [upbit] trades",
                "fullTitle": " > [upbit] without API keys > [upbit] trades",
                "timedOut": false,
                "duration": 991,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ab2ba1b8-a371-4905-8874-06420b203e6c",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "2f9acc14-5e28-45b8-9dc6-e776f34317e0",
              "fff063b7-7782-455e-a936-7e966d22d309",
              "e8858ff4-4954-49de-8396-10d1ee0dea55",
              "cd07fd7f-13e9-4645-b322-529366f695e9",
              "6e1d4fa8-f3c6-4e32-92eb-65d9de8a547f",
              "ab2ba1b8-a371-4905-8874-06420b203e6c"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5462,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "535634d0-dbaf-4447-be8c-3a0f9b05f5a2",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "b8a2b5b0-10e9-4814-aa64-4ff898b2b762",
            "title": "> [kraken] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/kraken-test.js",
            "file": "/test/generated/kraken-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [kraken] connect",
                "fullTitle": " > [kraken] without API keys > [kraken] connect",
                "timedOut": false,
                "duration": 350,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "65480cb2-d781-4ddc-af56-210fa3d459a4",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [kraken] markets",
                "fullTitle": " > [kraken] without API keys > [kraken] markets",
                "timedOut": false,
                "duration": 21109,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0d825bff-d2e2-4088-b894-b5c77d5387b9",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [kraken] ticker",
                "fullTitle": " > [kraken] without API keys > [kraken] ticker",
                "timedOut": false,
                "duration": 9078,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "00d88cec-964f-4e12-a4a9-717128d28681",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [kraken] tickers",
                "fullTitle": " > [kraken] without API keys > [kraken] tickers",
                "timedOut": false,
                "duration": 18,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a30b9e96-60f6-451d-a960-15d7a3c297e1",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [kraken] orderBook",
                "fullTitle": " > [kraken] without API keys > [kraken] orderBook",
                "timedOut": false,
                "duration": 12,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "63bc7405-0049-448c-9314-6ad025a883c0",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [kraken] trades",
                "fullTitle": " > [kraken] without API keys > [kraken] trades",
                "timedOut": false,
                "duration": 10,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "bee9aa55-82af-4b72-9b37-e4d6b2ed9634",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "65480cb2-d781-4ddc-af56-210fa3d459a4",
              "0d825bff-d2e2-4088-b894-b5c77d5387b9",
              "00d88cec-964f-4e12-a4a9-717128d28681",
              "a30b9e96-60f6-451d-a960-15d7a3c297e1",
              "63bc7405-0049-448c-9314-6ad025a883c0",
              "bee9aa55-82af-4b72-9b37-e4d6b2ed9634"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 30577,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "b5259bbc-f9df-4f5c-ab57-d63bcc61fe70",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "9e14aa95-92cd-4c2d-8b51-476b52192077",
            "title": "> [tidex] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/tidex-test.js",
            "file": "/test/generated/tidex-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [tidex] connect",
                "fullTitle": " > [tidex] without API keys > [tidex] connect",
                "timedOut": false,
                "duration": 38,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "26eef12d-fdaa-40df-981d-82f6f9a78c00",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [tidex] markets",
                "fullTitle": " > [tidex] without API keys > [tidex] markets",
                "timedOut": false,
                "duration": 269,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5422c86b-15c3-48cc-96f4-f30aaa03cff9",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [tidex] ticker",
                "fullTitle": " > [tidex] without API keys > [tidex] ticker",
                "timedOut": false,
                "duration": 5841,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "7bf7327a-c8f4-4aa9-9e07-92fabc438f0d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [tidex] tickers",
                "fullTitle": " > [tidex] without API keys > [tidex] tickers",
                "timedOut": false,
                "duration": 25,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5b538f95-aac9-4187-b722-fdbfd04c7295",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [tidex] orderBook",
                "fullTitle": " > [tidex] without API keys > [tidex] orderBook",
                "timedOut": false,
                "duration": 1956,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a556e5f7-5c08-43da-8768-8b50988f4a10",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [tidex] trades",
                "fullTitle": " > [tidex] without API keys > [tidex] trades",
                "timedOut": false,
                "duration": 2006,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f655d8f3-57e9-40f5-946f-3b4b8090ef6b",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "26eef12d-fdaa-40df-981d-82f6f9a78c00",
              "5422c86b-15c3-48cc-96f4-f30aaa03cff9",
              "7bf7327a-c8f4-4aa9-9e07-92fabc438f0d",
              "5b538f95-aac9-4187-b722-fdbfd04c7295",
              "a556e5f7-5c08-43da-8768-8b50988f4a10",
              "f655d8f3-57e9-40f5-946f-3b4b8090ef6b"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 10135,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "a5498668-df64-45b5-97cb-a555ed4b578f",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "4ce3ca5b-bbd0-4d5b-a679-b8073c1f3b4c",
            "title": "> [xbtce] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/xbtce-test.js",
            "file": "/test/generated/xbtce-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [xbtce] connect",
                "fullTitle": " > [xbtce] without API keys > [xbtce] connect",
                "timedOut": false,
                "duration": 35,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6de64d64-5d9c-4530-ae4b-08da4244b764",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [xbtce] markets",
                "fullTitle": " > [xbtce] without API keys > [xbtce] markets",
                "timedOut": false,
                "duration": 17,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "dddc35c0-f443-4301-ac8f-b9a510897168",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [xbtce] ticker",
                "fullTitle": " > [xbtce] without API keys > [xbtce] ticker",
                "timedOut": false,
                "duration": 2385,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "804f7a8a-5f96-427e-bb23-67a93faa3282",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [xbtce] tickers",
                "fullTitle": " > [xbtce] without API keys > [xbtce] tickers",
                "timedOut": false,
                "duration": 32,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3ee1c8ea-3075-4807-a7ba-83295221732d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [xbtce] orderBook",
                "fullTitle": " > [xbtce] without API keys > [xbtce] orderBook",
                "timedOut": false,
                "duration": 8,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0c9df472-c6db-49c7-9517-d70f63b4ff9e",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [xbtce] trades",
                "fullTitle": " > [xbtce] without API keys > [xbtce] trades",
                "timedOut": false,
                "duration": 7,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1a573b16-d01c-4caf-88cc-a8365876689e",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "6de64d64-5d9c-4530-ae4b-08da4244b764",
              "dddc35c0-f443-4301-ac8f-b9a510897168",
              "804f7a8a-5f96-427e-bb23-67a93faa3282",
              "3ee1c8ea-3075-4807-a7ba-83295221732d",
              "0c9df472-c6db-49c7-9517-d70f63b4ff9e",
              "1a573b16-d01c-4caf-88cc-a8365876689e"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 2484,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "44493d99-3cd6-4f95-a904-05a9d8e3971b",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "941440ea-88ad-496c-99e4-4e1ff4878ac9",
            "title": "> [vbtc] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/vbtc-test.js",
            "file": "/test/generated/vbtc-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [vbtc] connect",
                "fullTitle": " > [vbtc] without API keys > [vbtc] connect",
                "timedOut": false,
                "duration": 39,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "54feda21-f957-48cb-afe4-b4bcac52c0d9",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [vbtc] markets",
                "fullTitle": " > [vbtc] without API keys > [vbtc] markets",
                "timedOut": false,
                "duration": 4,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b3b7aae8-6958-4f8b-8264-f7a86273da2e",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [vbtc] ticker",
                "fullTitle": " > [vbtc] without API keys > [vbtc] ticker",
                "timedOut": false,
                "duration": 151,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "cb402f49-3aa0-40a3-822e-6574a932e0e2",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [vbtc] tickers",
                "fullTitle": " > [vbtc] without API keys > [vbtc] tickers",
                "timedOut": false,
                "duration": 14,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6a3a7c9c-c5bb-4388-ace1-95d836a6ccf4",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [vbtc] orderBook",
                "fullTitle": " > [vbtc] without API keys > [vbtc] orderBook",
                "timedOut": false,
                "duration": 847,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "90ef16ba-d4a2-4cdb-9083-a50788a3d80b",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [vbtc] trades",
                "fullTitle": " > [vbtc] without API keys > [vbtc] trades",
                "timedOut": false,
                "duration": 4694,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "375b204b-5fee-421d-a26f-58c4b78a5649",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "54feda21-f957-48cb-afe4-b4bcac52c0d9",
              "b3b7aae8-6958-4f8b-8264-f7a86273da2e",
              "cb402f49-3aa0-40a3-822e-6574a932e0e2",
              "6a3a7c9c-c5bb-4388-ace1-95d836a6ccf4",
              "90ef16ba-d4a2-4cdb-9083-a50788a3d80b",
              "375b204b-5fee-421d-a26f-58c4b78a5649"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 5749,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "dbd5fa53-493f-4874-9fd0-8ab1f64b2399",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "dd6642d1-cfc1-4bbf-801f-ad4d9b228cee",
            "title": "> [theocean] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/theocean-test.js",
            "file": "/test/generated/theocean-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [theocean] connect",
                "fullTitle": " > [theocean] without API keys > [theocean] connect",
                "timedOut": false,
                "duration": 100,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "939850a2-d1a3-4ecf-b821-76231e864957",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [theocean] markets",
                "fullTitle": " > [theocean] without API keys > [theocean] markets",
                "timedOut": false,
                "duration": 9007,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "01a58dfe-6d85-41aa-a332-22061844635a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [theocean] ticker",
                "fullTitle": " > [theocean] without API keys > [theocean] ticker",
                "timedOut": false,
                "duration": 3858,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f8274538-de5d-46bf-9047-ab3982bc3a9c",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [theocean] tickers",
                "fullTitle": " > [theocean] without API keys > [theocean] tickers",
                "timedOut": false,
                "duration": 44,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e7c442d5-b025-4888-810d-602f0f2d6445",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [theocean] orderBook",
                "fullTitle": " > [theocean] without API keys > [theocean] orderBook",
                "timedOut": false,
                "duration": 36,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "6f89dc1b-8f3b-45b7-a240-2fe142b4e87a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [theocean] trades",
                "fullTitle": " > [theocean] without API keys > [theocean] trades",
                "timedOut": false,
                "duration": 176,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "21ca1350-d175-42e3-a330-bd81cdfa4086",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "939850a2-d1a3-4ecf-b821-76231e864957",
              "01a58dfe-6d85-41aa-a332-22061844635a",
              "f8274538-de5d-46bf-9047-ab3982bc3a9c",
              "e7c442d5-b025-4888-810d-602f0f2d6445",
              "6f89dc1b-8f3b-45b7-a240-2fe142b4e87a",
              "21ca1350-d175-42e3-a330-bd81cdfa4086"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 13221,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "13977e49-8000-4747-8bfb-8e2a8a0dc934",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "e132cbb4-b11c-4507-8195-ed88143ef25c",
            "title": "> [timex] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/timex-test.js",
            "file": "/test/generated/timex-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [timex] connect",
                "fullTitle": " > [timex] without API keys > [timex] connect",
                "timedOut": false,
                "duration": 35,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0f594675-1ee8-4698-8668-a6f2591c8330",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [timex] markets",
                "fullTitle": " > [timex] without API keys > [timex] markets",
                "timedOut": false,
                "duration": 188,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "90595341-cfa0-422b-a96c-3c139354ba48",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [timex] ticker",
                "fullTitle": " > [timex] without API keys > [timex] ticker",
                "timedOut": false,
                "duration": 4359,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b005f31c-65d1-466e-a074-34fdc0ffaf52",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [timex] tickers",
                "fullTitle": " > [timex] without API keys > [timex] tickers",
                "timedOut": false,
                "duration": 1520,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "597c756d-a4c9-489a-9be0-629d723b75d7",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [timex] orderBook",
                "fullTitle": " > [timex] without API keys > [timex] orderBook",
                "timedOut": false,
                "duration": 2251,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "67d2a025-a85b-422a-a27c-74e019a2127d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [timex] trades",
                "fullTitle": " > [timex] without API keys > [timex] trades",
                "timedOut": false,
                "duration": 6942,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "cace9d65-002e-4bc2-9f20-b9ee217dd80e",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "0f594675-1ee8-4698-8668-a6f2591c8330",
              "90595341-cfa0-422b-a96c-3c139354ba48",
              "b005f31c-65d1-466e-a074-34fdc0ffaf52",
              "597c756d-a4c9-489a-9be0-629d723b75d7",
              "67d2a025-a85b-422a-a27c-74e019a2127d",
              "cace9d65-002e-4bc2-9f20-b9ee217dd80e"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 15295,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "a9584155-d0cd-43f5-92c7-2a5397b98f51",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "0f49dc13-3b53-4356-9790-43db3fde62b5",
            "title": "> [rightbtc] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/rightbtc-test.js",
            "file": "/test/generated/rightbtc-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [rightbtc] connect",
                "fullTitle": " > [rightbtc] without API keys > [rightbtc] connect",
                "timedOut": false,
                "duration": 65,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "bc20d1cf-460a-4f63-b2e4-18322ff4164d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [rightbtc] markets",
                "fullTitle": " > [rightbtc] without API keys > [rightbtc] markets",
                "timedOut": false,
                "duration": 167,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "03cac1d0-8fe7-46ba-9172-2b04c818cda0",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [rightbtc] ticker",
                "fullTitle": " > [rightbtc] without API keys > [rightbtc] ticker",
                "timedOut": false,
                "duration": 3862,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "10619a46-75aa-4d04-9756-d5e89ca56867",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [rightbtc] tickers",
                "fullTitle": " > [rightbtc] without API keys > [rightbtc] tickers",
                "timedOut": false,
                "duration": 2019,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f9000b88-2d42-47c5-9ac0-0c4996362051",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [rightbtc] orderBook",
                "fullTitle": " > [rightbtc] without API keys > [rightbtc] orderBook",
                "timedOut": false,
                "duration": 7990,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "7f6882e8-fb43-4eff-a80e-e270ce0a6565",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [rightbtc] trades",
                "fullTitle": " > [rightbtc] without API keys > [rightbtc] trades",
                "timedOut": false,
                "duration": 12536,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "cda26f84-36b6-41d6-9d57-c79950d21245",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "bc20d1cf-460a-4f63-b2e4-18322ff4164d",
              "03cac1d0-8fe7-46ba-9172-2b04c818cda0",
              "10619a46-75aa-4d04-9756-d5e89ca56867",
              "f9000b88-2d42-47c5-9ac0-0c4996362051",
              "7f6882e8-fb43-4eff-a80e-e270ce0a6565",
              "cda26f84-36b6-41d6-9d57-c79950d21245"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 26639,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "684e9aff-683f-44d5-92c9-08d341d03419",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "1868dd0f-3400-41e4-8500-ce20ab5e358a",
            "title": "> [whitebit] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/whitebit-test.js",
            "file": "/test/generated/whitebit-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [whitebit] connect",
                "fullTitle": " > [whitebit] without API keys > [whitebit] connect",
                "timedOut": false,
                "duration": 34,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "603e6497-159c-42c5-9b2d-8eb47db4215f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [whitebit] markets",
                "fullTitle": " > [whitebit] without API keys > [whitebit] markets",
                "timedOut": false,
                "duration": 343,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "f232cf7e-fbd9-4748-abdd-871c20d84615",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [whitebit] ticker",
                "fullTitle": " > [whitebit] without API keys > [whitebit] ticker",
                "timedOut": false,
                "duration": 3963,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0e3ef7a7-b7c3-43dc-b083-b275e6bc1691",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [whitebit] tickers",
                "fullTitle": " > [whitebit] without API keys > [whitebit] tickers",
                "timedOut": false,
                "duration": 314,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5aec25f8-df58-40a6-b745-0b8a51c92196",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [whitebit] orderBook",
                "fullTitle": " > [whitebit] without API keys > [whitebit] orderBook",
                "timedOut": false,
                "duration": 6727,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "83acb924-fafe-41a7-b60f-9d8e15ea945f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [whitebit] trades",
                "fullTitle": " > [whitebit] without API keys > [whitebit] trades",
                "timedOut": false,
                "duration": 2350,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0b6a97f1-8209-424d-9182-18e2a1800f01",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "603e6497-159c-42c5-9b2d-8eb47db4215f",
              "f232cf7e-fbd9-4748-abdd-871c20d84615",
              "0e3ef7a7-b7c3-43dc-b083-b275e6bc1691",
              "5aec25f8-df58-40a6-b745-0b8a51c92196",
              "83acb924-fafe-41a7-b60f-9d8e15ea945f",
              "0b6a97f1-8209-424d-9182-18e2a1800f01"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 13731,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "098ce60a-f140-4d7c-8eda-4c66500db975",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "c27b5c31-e282-473f-9467-8e3ec7a1ed73",
            "title": "> [zaif] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/zaif-test.js",
            "file": "/test/generated/zaif-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [zaif] connect",
                "fullTitle": " > [zaif] without API keys > [zaif] connect",
                "timedOut": false,
                "duration": 38,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "11c735ff-9f3b-42a4-b4b1-cf13c139680c",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [zaif] markets",
                "fullTitle": " > [zaif] without API keys > [zaif] markets",
                "timedOut": false,
                "duration": 1716,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "417bc2bc-9991-4e39-ae2f-aba86261ffd5",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [zaif] ticker",
                "fullTitle": " > [zaif] without API keys > [zaif] ticker",
                "timedOut": false,
                "duration": 6857,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "b3ef7216-66cf-437b-9507-475b8e5250d3",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [zaif] tickers",
                "fullTitle": " > [zaif] without API keys > [zaif] tickers",
                "timedOut": false,
                "duration": 12,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0dd85a7e-ee01-44eb-b0ad-686c7513c0bd",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [zaif] orderBook",
                "fullTitle": " > [zaif] without API keys > [zaif] orderBook",
                "timedOut": false,
                "duration": 1982,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "c179af40-77d6-489c-87c9-c349426259c1",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [zaif] trades",
                "fullTitle": " > [zaif] without API keys > [zaif] trades",
                "timedOut": false,
                "duration": 1998,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "61a2afa0-1f80-4a27-b670-70b3aa58e058",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "11c735ff-9f3b-42a4-b4b1-cf13c139680c",
              "417bc2bc-9991-4e39-ae2f-aba86261ffd5",
              "b3ef7216-66cf-437b-9507-475b8e5250d3",
              "0dd85a7e-ee01-44eb-b0ad-686c7513c0bd",
              "c179af40-77d6-489c-87c9-c349426259c1",
              "61a2afa0-1f80-4a27-b670-70b3aa58e058"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 12603,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "8cbb8095-7725-4b01-82d0-e96e341e39f8",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "9d4e9d65-7195-46f0-b5af-adb8f5643891",
            "title": "> [topq] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/topq-test.js",
            "file": "/test/generated/topq-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [topq] connect",
                "fullTitle": " > [topq] without API keys > [topq] connect",
                "timedOut": false,
                "duration": 72,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "596ab065-bfbe-4585-9401-cbb21d16af1d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [topq] markets",
                "fullTitle": " > [topq] without API keys > [topq] markets",
                "timedOut": false,
                "duration": 17656,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "19b8108a-731b-4ab3-8a73-63e0bb88b677",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [topq] ticker",
                "fullTitle": " > [topq] without API keys > [topq] ticker",
                "timedOut": false,
                "duration": 6057,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e7e01ab9-3930-49f6-baee-d5654a7c88e8",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [topq] tickers",
                "fullTitle": " > [topq] without API keys > [topq] tickers",
                "timedOut": false,
                "duration": 115,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ea991fa9-d228-4f8d-a688-fd4814541e62",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [topq] orderBook",
                "fullTitle": " > [topq] without API keys > [topq] orderBook",
                "timedOut": false,
                "duration": 181,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "e6b31024-c44f-4a02-9cc8-edfe094152a3",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [topq] trades",
                "fullTitle": " > [topq] without API keys > [topq] trades",
                "timedOut": false,
                "duration": 93,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "3165c1ff-5682-4004-bfd8-17e031dad013",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "596ab065-bfbe-4585-9401-cbb21d16af1d",
              "19b8108a-731b-4ab3-8a73-63e0bb88b677",
              "e7e01ab9-3930-49f6-baee-d5654a7c88e8",
              "ea991fa9-d228-4f8d-a688-fd4814541e62",
              "e6b31024-c44f-4a02-9cc8-edfe094152a3",
              "3165c1ff-5682-4004-bfd8-17e031dad013"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 24174,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "940f48ea-2e00-42da-8120-0e1f5b452e51",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "97d6a7cc-55d5-42c0-9565-d1ced761fe91",
            "title": "> [yobit] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/yobit-test.js",
            "file": "/test/generated/yobit-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [yobit] connect",
                "fullTitle": " > [yobit] without API keys > [yobit] connect",
                "timedOut": false,
                "duration": 55,
                "state": "passed",
                "speed": "medium",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "da41aff8-7404-4856-bd6b-6c4ea2db0204",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [yobit] markets",
                "fullTitle": " > [yobit] without API keys > [yobit] markets",
                "timedOut": false,
                "duration": 1704,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "ccf9fb16-da31-4327-875b-d075cd1ec082",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [yobit] ticker",
                "fullTitle": " > [yobit] without API keys > [yobit] ticker",
                "timedOut": false,
                "duration": 7120,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "2ebd5546-0187-4892-a49d-b8a9c993a402",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [yobit] tickers",
                "fullTitle": " > [yobit] without API keys > [yobit] tickers",
                "timedOut": false,
                "duration": 184,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "0fe879bc-dea1-425d-8010-0f684583c3ca",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [yobit] orderBook",
                "fullTitle": " > [yobit] without API keys > [yobit] orderBook",
                "timedOut": false,
                "duration": 2624,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "5bd8dc84-35a9-42d5-8d9e-a26a0b448fb4",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [yobit] trades",
                "fullTitle": " > [yobit] without API keys > [yobit] trades",
                "timedOut": false,
                "duration": 6600,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "a304bb98-aa33-4582-9f5a-69566121e6ea",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "da41aff8-7404-4856-bd6b-6c4ea2db0204",
              "ccf9fb16-da31-4327-875b-d075cd1ec082",
              "2ebd5546-0187-4892-a49d-b8a9c993a402",
              "0fe879bc-dea1-425d-8010-0f684583c3ca",
              "5bd8dc84-35a9-42d5-8d9e-a26a0b448fb4",
              "a304bb98-aa33-4582-9f5a-69566121e6ea"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 18287,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      },
      {
        "uuid": "dccdde40-a3fc-42ec-8701-fbb312fc5af8",
        "title": "",
        "fullFile": "",
        "file": "",
        "beforeHooks": [],
        "afterHooks": [],
        "tests": [],
        "suites": [
          {
            "uuid": "08002089-6eff-4039-aa92-093803dbd23d",
            "title": "> [zb] without API keys",
            "fullFile": "/home/travis/build/ccxt-rest/ccxt-rest/test/generated/zb-test.js",
            "file": "/test/generated/zb-test.js",
            "beforeHooks": [],
            "afterHooks": [],
            "tests": [
              {
                "title": "> [zb] connect",
                "fullTitle": " > [zb] without API keys > [zb] connect",
                "timedOut": false,
                "duration": 32,
                "state": "passed",
                "speed": "fast",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1da008c4-0c41-4530-aa7e-3425e23f075d",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [zb] markets",
                "fullTitle": " > [zb] without API keys > [zb] markets",
                "timedOut": false,
                "duration": 8477,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "939c844c-9c82-4a84-a60b-8eb9a35ec5b5",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [zb] ticker",
                "fullTitle": " > [zb] without API keys > [zb] ticker",
                "timedOut": false,
                "duration": 3044,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "00e2e2ba-a318-4174-9694-fdcf9df73b8a",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [zb] tickers",
                "fullTitle": " > [zb] without API keys > [zb] tickers",
                "timedOut": false,
                "duration": 6564,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "65665075-f961-4ce7-ba97-926f16e3b80f",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [zb] orderBook",
                "fullTitle": " > [zb] without API keys > [zb] orderBook",
                "timedOut": false,
                "duration": 5349,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "1cdb16f7-230b-4e47-866c-282a8da728b2",
                "isHook": false,
                "skipped": false
              },
              {
                "title": "> [zb] trades",
                "fullTitle": " > [zb] without API keys > [zb] trades",
                "timedOut": false,
                "duration": 4058,
                "state": "passed",
                "speed": "slow",
                "pass": true,
                "fail": false,
                "pending": false,
                "code": "if (config.canExecute(_ctx)) {\n    this.timeout(0)\n    const query = config.queryBuilder ? config.queryBuilder(_ctx) : undefined\n    const url = `${_ctx.baseUrl}/exchange/${_ctx.exchangeName}/${subPath}`\n    superagent\n        .get(url)\n        .query(query)\n        .retry(3)\n        .timeout(TIMEOUT_MS)\n        .end((err, res) => {\n            logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n                exchangeDetail[property] = exchangeDetail[property] || {}\n                exchangeDetail[property].statusCode = (res && res.status) || 408\n                exchangeDetail[property].response = res && res.body\n            })\n            if (config.successCallback) {\n                config.successCallback(_ctx, res)\n            }\n            assertResponse(res)\n            done();\n        });\n} else {\n    logExchangeDetail(_ctx.exchangeName, exchangeDetail => {\n        exchangeDetail[property] = exchangeDetail[property] || {}\n        exchangeDetail[property].statusCode = 'n/a'\n    })\n    if (!REPORT_ONLY) {\n        this.skip()\n    }\n    done()\n}",
                "err": {},
                "isRoot": false,
                "uuid": "12672873-acf7-42b6-8496-92e1e45a9735",
                "isHook": false,
                "skipped": false
              }
            ],
            "suites": [],
            "passes": [
              "1da008c4-0c41-4530-aa7e-3425e23f075d",
              "939c844c-9c82-4a84-a60b-8eb9a35ec5b5",
              "00e2e2ba-a318-4174-9694-fdcf9df73b8a",
              "65665075-f961-4ce7-ba97-926f16e3b80f",
              "1cdb16f7-230b-4e47-866c-282a8da728b2",
              "12672873-acf7-42b6-8496-92e1e45a9735"
            ],
            "failures": [],
            "pending": [],
            "skipped": [],
            "duration": 27524,
            "root": false,
            "rootEmpty": false,
            "_timeout": 2000
          }
        ],
        "passes": [],
        "failures": [],
        "pending": [],
        "skipped": [],
        "duration": 0,
        "root": false,
        "rootEmpty": false,
        "_timeout": 2000
      }
    ],
    "passes": [],
    "failures": [],
    "pending": [],
    "skipped": [],
    "duration": 0,
    "root": true,
    "rootEmpty": true,
    "_timeout": 2000
  },
  "copyrightYear": 2020
}