/* This integration tests should be run against a live bch-api REST server. It tests to ensure the rate-limits are working as expected. Adjust the values in the tests below to match the rate limit setting in your own installation. */ "use strict" const chai = require("chai") const assert = chai.assert const axios = require("axios") // Used for debugging. const util = require("util") util.inspect.defaultOptions = { depth: 1 } // const SERVER = `http://192.168.0.36:12400/v3/` const SERVER = `http://localhost:3000/v3/` const TEST_JWT = "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjVlM2EwNDE1ZWIyOWE5NjJkYTI3MDhiNCIsImFwaUxldmVsIjowLCJyYXRlTGltaXQiOjEwLCJpYXQiOjE1ODA4NjA0NjcsImV4cCI6MTU4MzQ1MjQ2N30.fuY5S-YrF0J11h5uyMjPe7wiVkYRnIyXi4dL9-V-C6pLJm33p0dSq_pSheVVWw78n5kAvL_9kFHngbnmQiOJYQ" describe("#rate limits", () => { it("should get control/getNetworkInfo() with no auth", async () => { const options = { method: "GET", url: `${SERVER}control/getNetworkInfo` } const result = await axios(options) //console.log(`result.status: ${result.status}`) // console.log(`result.data: ${util.inspect(result.data)}`) assert.equal(result.status, 200) assert.hasAnyKeys(result.data, ["version"]) }) it("should trigger rate-limit handler if rate limits exceeds 30 request per minute", async () => { try { // Actual rate limit is 60 per minute X 4 nodes = 240 rpm. const options = { method: "GET", url: `${SERVER}control/getNetworkInfo` } const promises = [] for (let i = 0; i < 30; i++) { const promise = axios(options) promises.push(promise) } await Promise.all(promises) assert.equal(true, false, "Unexpected result!") } catch (err) { //console.log(`err.response: ${util.inspect(err.response)}`) assert.equal(err.response.status, 429) assert.include(err.response.data.error, "Too many requests") } }) it("should not trigger rate-limit handler if correct pro-tier password is used", async () => { try { const username = "BITBOX" // Pro-tier is accessed by using the right password. const password = "BITBOX" //const password = "something" const combined = `${username}:${password}` const base64Credential = Buffer.from(combined).toString("base64") const readyCredential = `Basic ${base64Credential}` const options = { method: "GET", url: `${SERVER}control/getNetworkInfo`, headers: { Authorization: readyCredential } } const promises = [] for (let i = 0; i < 30; i++) { const promise = axios(options) promises.push(promise) } await Promise.all(promises) assert.equal(true, true, "Not throwing an error is a pass!") } catch (err) { // console.log(`err.response: ${util.inspect(err.response)}`) assert.equal( true, false, "This error handler should not have been triggered. Is the password correct?" ) } }) it("should trigger rate-limit handler if rate limits exceeds pro-tier limit", async () => { try { const username = "BITBOX" // Pro-tier is accessed by using the right password. const password = "BITBOX" //const password = "something" const combined = `${username}:${password}` const base64Credential = Buffer.from(combined).toString("base64") const readyCredential = `Basic ${base64Credential}` // Actual rate limit is 60 per minute X 4 nodes = 240 rpm. const options = { method: "GET", url: `${SERVER}control/getNetworkInfo`, headers: { Authorization: readyCredential } } const promises = [] for (let i = 0; i < 80; i++) { const promise = axios(options) promises.push(promise) } await Promise.all(promises) assert.equal(true, false, "Unexpected result!") } catch (err) { //console.log(`err.response: ${util.inspect(err.response)}`) assert.equal(err.response.status, 429) assert.include(err.response.data.error, "Too many requests") } }) it("should unlock pro-tier for a valid JWT token", async () => { try { // Actual rate limit is 60 per minute X 4 nodes = 240 rpm. const options = { method: "GET", url: `${SERVER}control/`, headers: { Authorization: `Token ${TEST_JWT}` } } const promises = [] for (let i = 0; i < 60; i++) { const promise = axios(options) promises.push(promise) } await Promise.all(promises) //assert.equal(true, false, "Unexpected result!") assert.equal(true, true, "Not throwing an error is a pass!") } catch (err) { console.log(`err.response: ${util.inspect(err.response)}`) assert.equal(true, false, "Unexpected result!") } // Override default timeout for this test. }).timeout(20000) })