How can we unit test the following code (axios-retry logic)
AxiosRetryClass.ts
import { AxiosInstance, AxiosRequestConfig } from 'axios';
import axiosRetry from 'axios-retry';
export class AxiosRetryClass {
constructor() {
}
public async callAxios(axiosConfig: AxiosRequestConfig): Promise<any> {
const instance = new AxiosSession().getAxiosInstance();
axiosRetry(instance, {
retries: 3,
retryCondition: (error: any) => {
return error.response.status === 500;
},
retryDelay: (count: number, err: any) => {
return 1 * 60 * 1000;
},
});
let response = { status: 0};
try {
response = await instance(axiosConfig);
} catch (error: any) {
response = error;
console.log(`AxiosClass: call error ${error}`);
}
return response;
}
}
AxiosSession.ts
import {HttpsCookieAgent, HttpCookieAgent } from 'http-cookie-agent';
import { CookieJar } from 'tough-cookie';
import axios from 'axios';
export class AxiosSession {
constructor() {}
public getAxiosInstance(): Promise<any> {
const agents = {
httpAgent: new HttpCookieAgent({ new CookieJar(), true }),
httpsAgent: new HttpsCookieAgent({ new CookieJar(), true }),
}
const instance = axios.create(agents);
return instance;
}
}
AxiosRetry.spec.ts
import Axios, { AxiosInstance } from 'axios';
import chai from 'chai';
import sinon, { SinonStub } from 'sinon';
import chaiAsPromised from 'chai-as-promised';
chai.use(chaiAsPromised);
describe(‘AxiosClassTest ', () => {
let sinonStub: sinon.SinonSandbox;
beforeEach(() => {
sinonStub = sinon.createSandbox();
});
it(‘Test Axios retry’, async () => {
let instance = {} as AxiosInstance;
instance.get = sinonStub.stub().rejects({status: 500}); //Tried both returns and rejects
const session = new AxiosSession();
session.getAxiosInstance = sinonStub.stub().returns(instance);
const axiosClass = new AxiosClass();
const url = `dummy-error-url`
await axiosClass.callAxios({ url, method: ‘GET’ });
});
});
Note: Test case is running successfully. But axios-retry code not covered. I mean the below code
axiosRetry(instance, {
retries: 3,
retryCondition: (error: any) => {
return error.response.status === 500;
},
retryDelay: (count: number, err: any) => {
return 1 * 60 * 1000;
},
});