UNPKG

tonb-merchant-api-client

Version:

Merchant API client is a library to interact with TONB Merchant API.

346 lines (270 loc) 8.74 kB
import axios from 'axios'; import MockAdapter from 'axios-mock-adapter'; import { HttpProvider } from './provider'; import { CreateInvoiceData, DataContainer, Invoice, InvoiceEnumStatus, InvoiceID, InvoiceStats, InvoiceUpdate, } from '../../models/invoice'; import { CancelInvoiceResponseData, CreateInvoiceResponseData, GetInvoiceInfoResponseData, GetInvoiceStatsResponseData, } from './types'; jest.mock('axios', () => { return { ...(jest.requireActual('axios') as object), create: jest.fn().mockReturnValue(jest.requireActual('axios')), }; }); const mockAdapter = new MockAdapter(axios); describe('HttpProvider', () => { let httpProvider: HttpProvider; let axiosInstance: axios.AxiosInstance; beforeEach(() => { axiosInstance = axios.create({ baseURL: 'http://example.com/', }); httpProvider = new HttpProvider({ client: axiosInstance }); }); afterEach(() => { jest.clearAllMocks(); }); describe('createInvoice', () => { it('should send a POST request with the correct data and return the response', async () => { const data: CreateInvoiceData = { order_id: 1, amount: 1, }; const responseData: CreateInvoiceResponseData = { data: { id: '1', amount: '1', order_id: '1', status: InvoiceEnumStatus.created, createdAt: '2023-04-18T12:55:22.951Z', updatedAt: '2023-04-18T12:55:22.951Z', }, }; const expected: DataContainer<Invoice> = { data: { id: 1, amount: BigInt(1), order_id: BigInt(1), status: InvoiceEnumStatus.created, createdAt: Date.parse('2023-04-18T12:55:22.951Z'), updatedAt: Date.parse('2023-04-18T12:55:22.951Z'), }, isValid: true, }; mockAdapter.onPost('/invoice').reply(200, responseData); const invoice = await httpProvider.createInvoice(data); expect(invoice).toEqual(expected); }); it('should handle HTTP error', async () => { const data: CreateInvoiceData = { order_id: 1, amount: 1, }; const responseData = {}; const expected: DataContainer<Invoice> = { data: null, isValid: false, error: expect.any(Error), }; mockAdapter.onPost('/invoice').reply(500, responseData); const invoice = await httpProvider.createInvoice(data); expect(invoice).toEqual(expected); }); it('should handle unexpected empty body', async () => { const data: CreateInvoiceData = { order_id: 1, amount: 1, }; const expected: DataContainer<Invoice> = { data: null, isValid: false, }; mockAdapter.onPost('/invoice').reply(200, null); const invoice = await httpProvider.createInvoice(data); expect(invoice).toEqual(expected); }); }); describe('cancelInvoice', () => { it('should send a PATCH request with the correct data and return the response', async () => { const invoiceID: InvoiceID = 1; const responseData: CancelInvoiceResponseData = { data: { id: 1, amount: 1, order_id: 1, status: InvoiceEnumStatus.canceled, }, }; const expected: DataContainer<Invoice> = { data: { id: 1, amount: BigInt(1), order_id: BigInt(1), status: InvoiceEnumStatus.canceled, }, isValid: true, }; mockAdapter.onPatch('/invoice/cancel').reply(200, responseData); const invoice = await httpProvider.cancelInvoice(invoiceID); expect(invoice).toEqual(expected); }); it('should handle HTTP error', async () => { const invoiceID: InvoiceID = 1; const responseData = {}; const expected: DataContainer<Invoice> = { data: null, isValid: false, error: expect.any(Error), }; mockAdapter.onPatch('/invoice/cancel').reply(500, responseData); const invoice = await httpProvider.cancelInvoice(invoiceID); expect(invoice).toEqual(expected); }); it('should handle unexpected empty body', async () => { const invoiceID: InvoiceID = 1; const expected: DataContainer<Invoice> = { data: null, isValid: false, error: expect.any(Error), }; mockAdapter.onPatch('/invoice/cancel').reply(200, null); const invoice = await httpProvider.getInvoiceInfo(invoiceID); expect(invoice).toEqual(expected); }); }); describe('getInvoiceInfo', () => { it('should send a GET request with the correct data and return the response', async () => { const invoiceID: InvoiceID = 1; const responseData: GetInvoiceInfoResponseData = { data: { id: '1', amount: 1, order_id: '1', status: InvoiceEnumStatus.created, domain: 'abc.com', wallet_from_id: '12345', }, }; const expected: DataContainer<Invoice> = { data: { id: 1, amount: BigInt(1), order_id: BigInt(1), status: InvoiceEnumStatus.created, domain: 'abc.com', wallet_from_id: 12345, }, isValid: true, }; mockAdapter.onGet('/invoice/info?id=1').reply(200, responseData); const invoice = await httpProvider.getInvoiceInfo(invoiceID); expect(invoice).toEqual(expected); }); it('should handle HTTP error', async () => { const invoiceID: InvoiceID = 1; const responseData = {}; const expected: DataContainer<Invoice> = { data: null, isValid: false, error: expect.any(Error), }; mockAdapter.onGet('/invoice/info?id=1').reply(404, responseData); const invoice = await httpProvider.getInvoiceInfo(invoiceID); expect(invoice).toEqual(expected); }); it('should handle unexpected empty body', async () => { const invoiceID: InvoiceID = 1; const expected: DataContainer<Invoice> = { data: null, isValid: false, }; mockAdapter.onGet('/invoice/info?id=1').reply(200, null); const invoice = await httpProvider.getInvoiceInfo(invoiceID); expect(invoice).toEqual(expected); }); }); describe('getInvoiceStats', () => { it('should send a GET request with the correct data and return the response', async () => { const responseData: GetInvoiceStatsResponseData = { data: { count: 1, invoice_sum: 10, }, }; const expected: DataContainer<InvoiceStats> = { data: { count: 1, invoice_sum: 10, }, isValid: true, }; mockAdapter.onGet('/invoice/stats').reply(200, responseData); const stats = await httpProvider.getInvoiceStats(); expect(stats).toEqual(expected); }); it('should handle HTTP error', async () => { const responseData: GetInvoiceStatsResponseData = { data: { count: 1, invoice_sum: 10, }, }; const expected: DataContainer<InvoiceStats> = { data: null, isValid: false, error: expect.any(Error), }; mockAdapter.onGet('/invoice/stats').reply(403, responseData); const stats = await httpProvider.getInvoiceStats(); expect(stats).toEqual(expected); }); it('should handle unexpected empty body', async () => { const expected: DataContainer<InvoiceStats> = { data: null, isValid: false, }; mockAdapter.onGet('/invoice/stats').reply(200, null); const stats = await httpProvider.getInvoiceStats(); expect(stats).toEqual(expected); }); }); describe('isUpdateValid', () => { it('should return true for a valid update', () => { const update: InvoiceUpdate = { data: { status: InvoiceEnumStatus.canceled, code: '123456789', amount: 500, order_id: 12345, sign: '9403ff6d2edd7eede8a1172c3eb0dbab5a9a316c90fcafccea3a937618176580', }, }; const isValid = httpProvider.isUpdateValid(update); expect(isValid).toBe(true); }); it('should return false for an invalid update', () => { const update: InvoiceUpdate = { data: { status: InvoiceEnumStatus.canceled, code: '123456789', amount: 500, order_id: 12345, sign: 'invalid_sign', // Replace with an invalid sign }, }; const isValid = httpProvider.isUpdateValid(update); expect(isValid).toBe(false); }); }); });