mirror of
https://github.com/certd/certd.git
synced 2025-11-25 09:10:11 +08:00
Bump v5.4.0 Bump dependencies Retry HTTP requests on server errors or when rate limited Forgot to refresh directory timestamp after successful get Add utility method tests
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);
|
|
});
|
|
});
|