@johntad/m-pesa
Version:
A TypeScript SDK for integrating M-Pesa mobile payment services into applications, enabling seamless money transfers and transactions.
84 lines (83 loc) • 4.02 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const axios_1 = __importDefault(require("axios"));
const APIClient_1 = require("../APIClient");
jest.mock('axios'); // Mock axios module
const mockedAxios = axios_1.default;
mockedAxios.create.mockReturnValue(mockedAxios);
describe('APIClient', () => {
const baseURL = 'https://example.com/api';
const client = new APIClient_1.APIClient({ baseURL });
afterEach(() => {
jest.clearAllMocks();
});
test('should initialize with default values', () => {
expect(client).toBeDefined();
});
describe('requestWithRetry', () => {
test('should handle successful GET request', () => __awaiter(void 0, void 0, void 0, function* () {
mockedAxios.get.mockResolvedValueOnce({ data: { success: true } });
const response = yield client.requestWithRetry('GET', '/test');
expect(response.data).toEqual({ success: true });
expect(mockedAxios.get).toHaveBeenCalledWith('/test', undefined);
}));
test('should retry on failure up to retry limit', () => __awaiter(void 0, void 0, void 0, function* () {
mockedAxios.get.mockRejectedValueOnce(new Error('Network Error'));
mockedAxios.get.mockResolvedValueOnce({ data: { success: true } });
const response = yield client.requestWithRetry('GET', '/test');
expect(response.data).toEqual({ success: true });
expect(mockedAxios.get).toHaveBeenCalledTimes(2);
}));
test('should throw error after exceeding retries', () => __awaiter(void 0, void 0, void 0, function* () {
mockedAxios.get.mockRejectedValue(new Error('Network Error'));
yield expect(client.requestWithRetry('GET', '/test')).rejects.toThrow('Error: Network Error');
expect(mockedAxios.get).toHaveBeenCalledTimes(3); // Default retries
}));
});
describe('fetchPaginated', () => {
test('should aggregate results across pages', () => __awaiter(void 0, void 0, void 0, function* () {
mockedAxios.get
.mockResolvedValueOnce({
data: {
data: [1, 2],
next: '/page2',
},
})
.mockResolvedValueOnce({
data: {
data: [3, 4],
next: null,
},
});
const results = yield client.fetchPaginated('/start', undefined, 'next', 'data');
expect(results).toEqual([1, 2, 3, 4]);
}));
});
describe('handleError', () => {
test('should throw error for response errors', () => {
const error = {
response: {
status: 500,
data: 'Server Error',
},
};
expect(() => client['handleError'](error)).toThrow(error.toString());
});
test('should throw error for network errors', () => {
const error = new Error('Network Error');
expect(() => client['handleError'](error)).toThrow('Error: Network Error');
});
});
});