esnekpos
Version:
Node.js entegrasyon paketi - EsnekPOS ödeme sistemi için resmi olmayan istemci
438 lines (390 loc) • 12.3 kB
JavaScript
/**
* EsnekPOS API Entegrasyon Testleri
*/
const axios = require('axios');
const esnekpos = require('../src/index');
// API yanıtlarını mocklamak için axios mockla
jest.mock('axios');
// Test için istemci oluştur
const client = esnekpos.createClient({
merchant: 'TEST1234',
merchantKey: '4oK26hK8MOXrIV1bzTRVPA==',
testMode: true
});
describe('EsnekPOS API Entegrasyon Testleri', () => {
beforeEach(() => {
jest.clearAllMocks();
});
// 3D Ödeme Testi
test('3D Ödeme başlatma', async () => {
// Mock başarılı yanıt
const mockResponse = {
data: {
ORDER_REF_NUMBER: 'ORDER_123456',
STATUS: 'SUCCESS',
RETURN_CODE: '0',
RETURN_MESSAGE: 'SUCCESS',
DATE: '27.07.2023 16:07:08',
URL_3DS: 'https://posservicetest.esnekpos.com/api/pay/3DSecurity/order/123456',
REFNO: '150840',
HASH: '123456'
}
};
axios.mockResolvedValueOnce(mockResponse);
const result = await client.payment.create3DPayment({
Config: {
BACK_URL: 'https://example.com/callback',
PRICES_CURRENCY: 'TRY',
ORDER_REF_NUMBER: 'ORDER_123456',
ORDER_AMOUNT: '100.00'
},
CreditCard: {
CC_NUMBER: '4159562885391991',
EXP_MONTH: '12',
EXP_YEAR: '2025',
CC_CVV: '123',
CC_OWNER: 'Test User',
INSTALLMENT_NUMBER: '1'
},
Customer: {
FIRST_NAME: 'Test',
LAST_NAME: 'User',
MAIL: 'test@example.com',
PHONE: '5321234567',
CITY: 'Istanbul',
STATE: 'Kadikoy',
ADDRESS: 'Test Address',
CLIENT_IP: '127.0.0.1'
},
Product: [
{
PRODUCT_ID: '1',
PRODUCT_NAME: 'Test Product',
PRODUCT_CATEGORY: 'Electronics',
PRODUCT_DESCRIPTION: 'Test Description',
PRODUCT_AMOUNT: '100.00'
}
]
});
expect(result).toEqual(mockResponse.data);
expect(axios).toHaveBeenCalledTimes(1);
expect(axios).toHaveBeenCalledWith(expect.objectContaining({
method: 'POST',
url: 'https://posservicetest.esnekpos.com/api/pay/EYV3DPay'
}));
});
// Ortak Ödeme Sayfası Testi
test('Ortak ödeme sayfası başlatma', async () => {
// Mock başarılı yanıt
const mockResponse = {
data: {
ORDER_REF_NUMBER: 'ORDER_123456',
STATUS: 'SUCCESS',
RETURN_CODE: '0',
RETURN_MESSAGE: 'SUCCESS',
DATE: '27.07.2023 16:08:08',
URL_3DS: 'https://posservicetest.esnekpos.com/Pages/CommonPayment.aspx?hash=123456',
REFNO: '150841',
HASH: '123456'
}
};
axios.mockResolvedValueOnce(mockResponse);
const result = await client.payment.createCommonPayment({
Config: {
ORDER_REF_NUMBER: 'ORDER_123456',
ORDER_AMOUNT: '100.00',
PRICES_CURRENCY: 'TRY',
BACK_URL: 'https://example.com/callback',
LOCALE: 'tr'
},
Customer: {
FIRST_NAME: 'Test',
LAST_NAME: 'User',
MAIL: 'test@example.com',
PHONE: '5321234567',
CITY: 'Istanbul',
STATE: 'Kadikoy',
ADDRESS: 'Test Address'
},
Product: [
{
PRODUCT_ID: '1',
PRODUCT_NAME: 'Test Product',
PRODUCT_CATEGORY: 'Electronics',
PRODUCT_DESCRIPTION: 'Test Description',
PRODUCT_AMOUNT: '100.00'
}
]
});
expect(result).toEqual(mockResponse.data);
expect(axios).toHaveBeenCalledTimes(1);
expect(axios).toHaveBeenCalledWith(expect.objectContaining({
method: 'POST',
url: 'https://posservicetest.esnekpos.com/api/pay/CommonPaymentDealer'
}));
});
// İşlem Sorgulama Testi
test('İşlem sorgulama', async () => {
// Mock başarılı yanıt
const mockResponse = {
data: {
STATUS: 'SUCCESS',
RETURN_CODE: '0',
RETURN_MESSAGE: 'SUCCESS',
DATE: '27.07.2023 16:09:08',
PAYMENT_DATE: '27.07.2023 16:07:08',
REFNO: '150840',
AMOUNT: '100.00',
ORDER_REF_NUMBER: 'ORDER_123456',
INSTALLMENT: '1',
SUCCESS_TRANSACTION_ID: '12345',
TRANSACTIONS: [
{
TRANSACTION_ID: '12345',
STATUS_NAME: 'Ödeme - Başarılı',
STATUS_ID: '3',
AMOUNT: '100.00',
DATE: '27.07.2023 16:07:08'
}
]
}
};
axios.mockResolvedValueOnce(mockResponse);
const result = await client.query.queryTransaction('ORDER_123456');
expect(result).toEqual(mockResponse.data);
expect(axios).toHaveBeenCalledTimes(1);
expect(axios).toHaveBeenCalledWith(expect.objectContaining({
method: 'POST',
url: 'https://posservicetest.esnekpos.com/api/services/ProcessQuery'
}));
});
// İade/İptal İşlemi Testi
test('İade/İptal işlemi', async () => {
// Mock başarılı yanıt
const mockResponse = {
data: {
RETURN_CODE: '0',
RETURN_MESSAGE: 'SUCCESS',
STATUS: 'ORDER_CANCEL',
ORDER_REF_NUMBER: 'ORDER_123456',
REFNO: '150842'
}
};
axios.mockResolvedValueOnce(mockResponse);
const result = await client.refund.refundTransaction({
orderRefNumber: 'ORDER_123456',
amount: 100.00,
syncWithPos: true
});
expect(result).toEqual(mockResponse.data);
expect(axios).toHaveBeenCalledTimes(1);
expect(axios).toHaveBeenCalledWith(expect.objectContaining({
method: 'POST',
url: 'https://posservicetest.esnekpos.com/api/services/OrderReturn'
}));
});
// Taksit Seçenekleri Testi
test('Taksit seçenekleri sorgulama', async () => {
// Mock başarılı yanıt
const mockResponse = {
data: {
STATUS: 'SUCCESS',
RETURN_CODE: '0',
RETURN_MESSAGE: 'SUCCESS',
InstallmentList: [
{
FAMILY: 'Maximum',
INSTALLMENT: 1,
RATE: 1.75,
AMOUNT_PER_INSTALLMENT: 101.75,
AMOUNT_TOTAL: 101.75,
AMOUNT_BE_SEND_TO_DEALER: 100.00
},
{
FAMILY: 'Maximum',
INSTALLMENT: 2,
RATE: 2.75,
AMOUNT_PER_INSTALLMENT: 51.38,
AMOUNT_TOTAL: 102.75,
AMOUNT_BE_SEND_TO_DEALER: 100.00
}
]
}
};
axios.mockResolvedValueOnce(mockResponse);
const result = await client.query.getInstallmentOptions({
amount: '100.00',
bin: '510152',
commissionForCustomer: 1
});
expect(result).toEqual(mockResponse.data);
expect(axios).toHaveBeenCalledTimes(1);
expect(axios).toHaveBeenCalledWith(expect.objectContaining({
method: 'POST',
url: 'https://posservicetest.esnekpos.com/api/services/GetInstallments'
}));
});
// BIN Sorgulama Testi
test('BIN sorgulama', async () => {
// Mock başarılı yanıt
const mockResponse = {
data: {
Bank_Name: 'IS BANK',
Bank_Brand: 'MASTERCARD',
Card_Type: 'CREDIT',
Card_Family: 'Maximum',
Card_Kind: 'BİREYSEL KART'
}
};
axios.mockResolvedValueOnce(mockResponse);
const result = await client.query.getBinInfo('510152');
expect(result).toEqual(mockResponse.data);
expect(axios).toHaveBeenCalledTimes(1);
expect(axios).toHaveBeenCalledWith(expect.objectContaining({
method: 'POST',
url: 'https://posservicetest.esnekpos.com/api/services/EYVBinService'
}));
});
// Alt Üye İşyeri Tanımlama Testi
test('Alt üye işyeri tanımlama', async () => {
// Mock başarılı yanıt
const mockResponse = {
data: {
Data: null,
ResultCode: '00',
ResultMessage: 'SUCCESS',
Exception: null
}
};
axios.mockResolvedValueOnce(mockResponse);
const result = await client.marketplace.setSubMerchant({
NAME: 'Test Mağaza',
OWNER_NAME: 'Test',
OWNER_SURNAME: 'User',
OWNER_IDENTITY_NUMBER: '12345678901',
EMAIL: 'teststore@example.com',
GSM: '5321234567',
COMPANY_NAME: 'Test Store Ltd',
TAX_OFFICE: 'Test Tax Office',
TAX_NUMBER: '1234567890',
BANK_NAME: 'Test Bank',
EXTERNAL_ID: 'MERCHANT_123456',
TYPE: 'PERSONAL_COMPANY',
BANK_ACCOUNTS: [
{
IBAN: 'TR330006100519786457841326',
CURRENCY: 'TRY'
}
]
});
expect(result).toEqual(mockResponse.data);
expect(axios).toHaveBeenCalledTimes(1);
expect(axios).toHaveBeenCalledWith(expect.objectContaining({
method: 'POST',
url: 'https://posservicetest.esnekpos.com/api/services/SubMerchantSet'
}));
});
// Tekrarlayan Ödeme Testi
test('Tekrarlayan ödeme başlatma', async () => {
// Mock başarılı yanıt
const mockResponse = {
data: {
STATUS: 'SUCCESS',
RETURN_CODE: '0',
RETURN_MESSAGE: 'SUCCESS'
}
};
axios.mockResolvedValueOnce(mockResponse);
const result = await client.recurring.createRecurringPayment({
Config: {
ORDER_REF_NUMBER: 'RECUR_123456',
BACK_URL: 'https://example.com/callback',
PRICES_CURRENCY: 'TRY',
ORDER_AMOUNT: '50.00',
REPEAT: '3',
TRIES_COUNT: '3',
START_DATE: '2023-07-28'
},
Cards: [
{
CC_NUMBER: '4159562885391991',
EXP_MONTH: '12',
EXP_YEAR: '2025',
CC_CVV: '123',
CC_OWNER: 'Test User'
}
],
Customer: {
FIRST_NAME: 'Test',
LAST_NAME: 'User',
MAIL: 'test@example.com',
PHONE: '5321234567',
CITY: 'Istanbul',
STATE: 'Kadikoy',
ADDRESS: 'Test Address',
CLIENT_IP: '127.0.0.1'
}
});
expect(result).toEqual(mockResponse.data);
expect(axios).toHaveBeenCalledTimes(1);
expect(axios).toHaveBeenCalledWith(expect.objectContaining({
method: 'POST',
url: 'https://posservicetest.esnekpos.com/api/pay/RecurringPayment'
}));
});
// Fiziksel POS Listesi Testi
test('Fiziksel POS listesi alma', async () => {
// Mock başarılı yanıt
const mockResponse = {
data: {
RETURN_CODE: '0',
RETURN_MESSAGE: 'SUCCESS',
POST_LIST: [
{
ID: 1,
TITLE: 'Test POS 1',
CONNECTED: true
},
{
ID: 2,
TITLE: 'Test POS 2',
CONNECTED: false
}
]
}
};
axios.mockResolvedValueOnce(mockResponse);
const result = await client.physicalPos.listPhysicalPos();
expect(result).toEqual(mockResponse.data);
expect(axios).toHaveBeenCalledTimes(1);
expect(axios).toHaveBeenCalledWith(expect.objectContaining({
method: 'POST',
url: 'https://posservicetest.esnekpos.com/api/services/ListPhysicalPos'
}));
});
// Hata Durumu Testi
test('API hatası işleme', async () => {
// Mock hata yanıtı
const errorResponse = {
response: {
status: 400,
statusText: 'Bad Request',
data: {
RETURN_CODE: '101',
RETURN_MESSAGE: 'Field Error'
}
}
};
axios.mockRejectedValueOnce(errorResponse);
await expect(client.query.queryTransaction('INVALID_ORDER')).rejects.toThrow(/HTTP Hatası/);
});
// Ağ Hatası Testi
test('Ağ hatası işleme', async () => {
// Mock network hatası
const networkError = {
request: {}
};
axios.mockRejectedValueOnce(networkError);
await expect(client.query.queryTransaction('ORDER_123456')).rejects.toThrow(/Ağ hatası/);
});
});