@helium/http
Version:
HTTP library for interacting with the Helium blockchain API
174 lines • 8.34 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const nock_1 = __importDefault(require("nock"));
const __1 = __importStar(require(".."));
test('exposes a client instance with default options', () => {
const prodUrl = 'https://api.helium.io';
const client = new __1.default();
expect(client.network.baseURL).toBe(prodUrl);
});
test('configure client with different endpoint', () => {
const stagingUrl = 'https://api.helium.wtf';
const client = new __1.default(__1.Network.staging);
expect(client.network.baseURL).toBe(stagingUrl);
});
test('configure client with different endpoint', () => {
const stagingUrl = 'https://api.helium.wtf';
const client = new __1.default(__1.Network.staging);
expect(client.network.baseURL).toBe(stagingUrl);
});
describe('get', () => {
it('creates a GET request to the full url', async () => {
(0, nock_1.default)('https://api.helium.io').get('/v1/greeting').reply(200, {
greeting: 'hello',
});
const client = new __1.default();
const { data } = await client.get('/greeting');
expect(data.greeting).toBe('hello');
});
it('client passes headers to GET request', async () => {
const nameHeader = 'name-header-test';
const userAgentHeader = 'user-agent-test';
(0, nock_1.default)('https://api.helium.io')
.get('/v1/greeting')
.reply(200, {
greeting: 'hello',
});
const client = new __1.default(__1.Network.production, { name: nameHeader, userAgent: userAgentHeader });
const response = await client.get('/greeting');
expect(response.data.greeting).toBe('hello');
expect(response.config.headers['x-client-name']).toBe(nameHeader);
expect(response.config.headers['User-Agent']).toBe(userAgentHeader);
});
});
it('client passes default headers to GET request', async () => {
const nameHeader = 'name-header-test';
const userAgentHeader = 'user-agent-test';
const network = 'helium';
(0, nock_1.default)('https://api.helium.io')
.get('/v1/greeting')
.reply(200, {
greeting: 'hello',
});
const opts = { name: nameHeader, userAgent: userAgentHeader, headers: { network } };
const client = new __1.default(__1.Network.production, opts);
const response = await client.get('/greeting');
expect(response.data.greeting).toBe('hello');
expect(response.config.headers['x-client-name']).toBe(nameHeader);
expect(response.config.headers['User-Agent']).toBe(userAgentHeader);
expect(response.config.headers.network).toBe(network);
});
describe('post', () => {
it('creates a POST request to the full url', async () => {
(0, nock_1.default)('https://api.helium.io').post('/v1/greeting', { greeting: 'hello' }).reply(200, {
response: 'hey there!',
});
const client = new __1.default();
const params = { greeting: 'hello' };
const { data } = await client.post('/greeting', params);
expect(data.response).toBe('hey there!');
});
it('client passes headers to POST request', async () => {
const nameHeader = 'name-header-test';
const userAgentHeader = 'user-agent-test';
(0, nock_1.default)('https://api.helium.io').post('/v1/greeting', { greeting: 'hello' }).reply(200, {
response: 'hey there!',
});
const client = new __1.default(__1.Network.production, { name: nameHeader, userAgent: userAgentHeader });
const params = { greeting: 'hello' };
const response = await client.post('/greeting', params);
expect(response.data.response).toBe('hey there!');
expect(response.config.headers['x-client-name']).toBe(nameHeader);
expect(response.config.headers['User-Agent']).toBe(userAgentHeader);
});
it('client passes default headers to POST request', async () => {
const network = 'helium';
const nameHeader = 'name-header-test';
const userAgentHeader = 'user-agent-test';
(0, nock_1.default)('https://api.helium.io').post('/v1/greeting', { greeting: 'hello' }).reply(200, {
response: 'hey there!',
});
const opts = { name: nameHeader, userAgent: userAgentHeader, headers: { network } };
const client = new __1.default(__1.Network.production, opts);
const params = { greeting: 'hello' };
const response = await client.post('/greeting', params);
expect(response.data.response).toBe('hey there!');
expect(response.config.headers['x-client-name']).toBe(nameHeader);
expect(response.config.headers['User-Agent']).toBe(userAgentHeader);
expect(response.config.headers.network).toBe(network);
});
});
describe('retry logic', () => {
(0, nock_1.default)('https://api.helium.io').get('/v1/greeting').times(1).reply(503, 'bad gateway');
(0, nock_1.default)('https://api.helium.io').get('/v1/greeting').times(1).reply(200, {
greeting: 'hello',
});
it('retries requests with exponential backoff', async () => {
const client = new __1.default();
expect(client.retry).toBe(5);
const { data } = await client.get('/greeting');
expect(data.greeting).toBe('hello');
});
});
describe('retry disabled', () => {
(0, nock_1.default)('https://api.helium.io').get('/v1/farewell').times(1).reply(503, 'bad gateway');
(0, nock_1.default)('https://api.helium.io').get('/v1/farewell').times(1).reply(200, 'good response');
it('make request with retry disabled', async () => {
const client = new __1.default(__1.Network.production, { retry: 0 });
expect(client.retry).toBe(0);
const makeRequest = async () => {
await client.get('/farewell');
};
await expect(makeRequest()).rejects.toThrow('Request failed with status code 503');
});
});
describe('name', () => {
it('is initialized with a client name', () => {
const client = new __1.default(__1.Network.production, { name: 'Test Client' });
expect(client.name).toBe('Test Client');
});
it('adds an x-client-name header to GET requests when name is set', async () => {
(0, nock_1.default)('https://api.helium.io').get('/v1/greeting').reply(200, {
greeting: 'hello',
});
const client = new __1.default(__1.Network.production, { name: 'Test Client' });
const { request } = await client.get('/greeting');
expect(request.headers['x-client-name']).toBe('Test Client');
});
it('adds an x-client-name header to POST requests when name is set', async () => {
(0, nock_1.default)('https://api.helium.io').post('/v1/greeting', { greeting: 'hello' }).reply(200, {
response: 'hey there!',
});
const client = new __1.default(__1.Network.production, { name: 'Test Client' });
const params = { greeting: 'hello' };
const { request } = await client.post('/greeting', params);
expect(request.headers['x-client-name']).toBe('Test Client');
});
});
//# sourceMappingURL=Client.spec.js.map