mirror of https://github.com/certd/certd
122 lines
3.6 KiB
JavaScript
122 lines
3.6 KiB
JavaScript
/**
|
|
* HTTP client tests
|
|
*/
|
|
|
|
const { randomUUID: uuid } = require('crypto');
|
|
const { assert } = require('chai');
|
|
const nock = require('nock');
|
|
const axios = require('./../src/axios');
|
|
const HttpClient = require('./../src/http');
|
|
const pkg = require('./../package.json');
|
|
|
|
describe('http', () => {
|
|
let testClient;
|
|
|
|
const endpoint = `http://${uuid()}.example.com`;
|
|
const defaultUserAgent = `node-${pkg.name}/${pkg.version}`;
|
|
const customUserAgent = 'custom-ua-123';
|
|
|
|
afterEach(() => {
|
|
nock.cleanAll();
|
|
});
|
|
|
|
/**
|
|
* Initialize
|
|
*/
|
|
|
|
it('should initialize clients', () => {
|
|
testClient = new HttpClient();
|
|
});
|
|
|
|
/**
|
|
* HTTP verbs
|
|
*/
|
|
|
|
it('should http get', async () => {
|
|
nock(endpoint).get('/').reply(200, 'ok');
|
|
const resp = await testClient.request(endpoint, 'get');
|
|
|
|
assert.isObject(resp);
|
|
assert.strictEqual(resp.status, 200);
|
|
assert.strictEqual(resp.data, 'ok');
|
|
});
|
|
|
|
/**
|
|
* User-Agent
|
|
*/
|
|
|
|
it('should request using default user-agent', async () => {
|
|
nock(endpoint).matchHeader('user-agent', defaultUserAgent).get('/').reply(200, 'ok');
|
|
axios.defaults.headers.common['User-Agent'] = defaultUserAgent;
|
|
const resp = await testClient.request(endpoint, 'get');
|
|
|
|
assert.isObject(resp);
|
|
assert.strictEqual(resp.status, 200);
|
|
assert.strictEqual(resp.data, 'ok');
|
|
});
|
|
|
|
it('should reject using custom user-agent', async () => {
|
|
nock(endpoint).matchHeader('user-agent', defaultUserAgent).get('/').reply(200, 'ok');
|
|
axios.defaults.headers.common['User-Agent'] = customUserAgent;
|
|
await assert.isRejected(testClient.request(endpoint, 'get'));
|
|
});
|
|
|
|
it('should request using custom user-agent', async () => {
|
|
nock(endpoint).matchHeader('user-agent', customUserAgent).get('/').reply(200, 'ok');
|
|
axios.defaults.headers.common['User-Agent'] = customUserAgent;
|
|
const resp = await testClient.request(endpoint, 'get');
|
|
|
|
assert.isObject(resp);
|
|
assert.strictEqual(resp.status, 200);
|
|
assert.strictEqual(resp.data, 'ok');
|
|
});
|
|
|
|
it('should reject using default user-agent', async () => {
|
|
nock(endpoint).matchHeader('user-agent', customUserAgent).get('/').reply(200, 'ok');
|
|
axios.defaults.headers.common['User-Agent'] = defaultUserAgent;
|
|
await assert.isRejected(testClient.request(endpoint, 'get'));
|
|
});
|
|
|
|
/**
|
|
* Retry on HTTP errors
|
|
*/
|
|
|
|
it('should retry on 429 rate limit', async () => {
|
|
let rateLimitCount = 0;
|
|
|
|
nock(endpoint).persist().get('/').reply(() => {
|
|
rateLimitCount += 1;
|
|
|
|
if (rateLimitCount < 3) {
|
|
return [429, 'Rate Limit Exceeded', { 'Retry-After': 1 }];
|
|
}
|
|
|
|
return [200, 'ok'];
|
|
});
|
|
|
|
assert.strictEqual(rateLimitCount, 0);
|
|
const resp = await testClient.request(endpoint, 'get');
|
|
|
|
assert.isObject(resp);
|
|
assert.strictEqual(resp.status, 200);
|
|
assert.strictEqual(resp.data, 'ok');
|
|
assert.strictEqual(rateLimitCount, 3);
|
|
});
|
|
|
|
it('should retry on 5xx server error', async () => {
|
|
let serverErrorCount = 0;
|
|
|
|
nock(endpoint).persist().get('/').reply(() => {
|
|
serverErrorCount += 1;
|
|
return [500, 'Internal Server Error', { 'Retry-After': 1 }];
|
|
});
|
|
|
|
assert.strictEqual(serverErrorCount, 0);
|
|
const resp = await testClient.request(endpoint, 'get');
|
|
|
|
assert.isObject(resp);
|
|
assert.strictEqual(resp.status, 500);
|
|
assert.strictEqual(serverErrorCount, 4);
|
|
});
|
|
});
|