UNPKG

@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
"use strict"; 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'); }); }); });