mirror of
https://github.com/duhanbalci/iyzico.git
synced 2026-03-03 20:29:18 +00:00
368 lines
14 KiB
TypeScript
368 lines
14 KiB
TypeScript
/**
|
|
* Cancel & Refund integration tests
|
|
*/
|
|
|
|
import { describe, it, expect } from 'vitest';
|
|
import { createTestClient, assertSuccessResponse } from '../setup';
|
|
import { testNon3DPaymentRequest } from '../fixtures/payment';
|
|
import type { ErrorResponse } from '../../src/types';
|
|
|
|
describe('Cancel & Refund Integration Tests', () => {
|
|
const client = createTestClient();
|
|
|
|
it('should cancel a payment', async () => {
|
|
// First create a payment
|
|
const paymentRequest = {
|
|
...testNon3DPaymentRequest,
|
|
conversationId: `test-cancel-${Date.now()}`,
|
|
};
|
|
|
|
const paymentResponse = await client.payment.createNon3DS(paymentRequest);
|
|
assertSuccessResponse(paymentResponse);
|
|
|
|
if (paymentResponse.paymentId) {
|
|
// Then cancel it
|
|
const cancelResponse = await client.cancelRefund.cancel({
|
|
paymentId: paymentResponse.paymentId,
|
|
locale: 'tr',
|
|
conversationId: `test-cancel-${Date.now()}`,
|
|
});
|
|
|
|
assertSuccessResponse(cancelResponse);
|
|
expect(cancelResponse.paymentId).toBe(paymentResponse.paymentId);
|
|
}
|
|
});
|
|
|
|
it('should refund a payment using v1 endpoint', async () => {
|
|
// First create a payment
|
|
const paymentRequest = {
|
|
...testNon3DPaymentRequest,
|
|
conversationId: `test-refund-v1-${Date.now()}`,
|
|
};
|
|
|
|
const paymentResponse = await client.payment.createNon3DS(paymentRequest);
|
|
assertSuccessResponse(paymentResponse);
|
|
|
|
if (paymentResponse.paymentId && paymentResponse.itemTransactions) {
|
|
// Get the first payment transaction ID
|
|
const firstTransaction = paymentResponse.itemTransactions[0];
|
|
if (firstTransaction && firstTransaction.paymentTransactionId) {
|
|
// Then refund it using v1
|
|
const refundResponse = await client.cancelRefund.refund({
|
|
paymentTransactionId: firstTransaction.paymentTransactionId,
|
|
price: firstTransaction.price,
|
|
locale: 'tr',
|
|
conversationId: `test-refund-v1-${Date.now()}`,
|
|
});
|
|
|
|
assertSuccessResponse(refundResponse);
|
|
expect(refundResponse.paymentTransactionId).toBe(
|
|
firstTransaction.paymentTransactionId
|
|
);
|
|
}
|
|
}
|
|
});
|
|
|
|
it('should refund a payment using v2 endpoint', async () => {
|
|
// First create a payment
|
|
const paymentRequest = {
|
|
...testNon3DPaymentRequest,
|
|
conversationId: `test-refund-v2-${Date.now()}`,
|
|
};
|
|
|
|
const paymentResponse = await client.payment.createNon3DS(paymentRequest);
|
|
assertSuccessResponse(paymentResponse);
|
|
|
|
if (paymentResponse.paymentId && paymentResponse.paidPrice) {
|
|
// Then refund it using v2
|
|
const refundResponse = await client.cancelRefund.refundV2({
|
|
paymentId: paymentResponse.paymentId,
|
|
price: paymentResponse.paidPrice,
|
|
locale: 'tr',
|
|
conversationId: `test-refund-v2-${Date.now()}`,
|
|
});
|
|
|
|
assertSuccessResponse(refundResponse);
|
|
expect(refundResponse.paymentId).toBe(paymentResponse.paymentId);
|
|
}
|
|
});
|
|
|
|
describe('Edge Cases - Invalid Fields', () => {
|
|
it('should handle invalid paymentId for cancel', async () => {
|
|
try {
|
|
const response = await client.cancelRefund.cancel({
|
|
paymentId: 'invalid-payment-id-99999',
|
|
locale: 'tr',
|
|
conversationId: `test-invalid-paymentid-${Date.now()}`,
|
|
});
|
|
expect(response).toBeDefined();
|
|
expect(response.status).toBeDefined();
|
|
if (response.status === 'failure') {
|
|
const errorResponse = response as unknown as ErrorResponse;
|
|
expect(errorResponse.errorCode || errorResponse.errorMessage).toBeTruthy();
|
|
}
|
|
} catch (error: any) {
|
|
expect(error).toBeDefined();
|
|
expect(error).toBeInstanceOf(Error);
|
|
}
|
|
});
|
|
|
|
it('should handle empty paymentId for cancel', async () => {
|
|
try {
|
|
const response = await client.cancelRefund.cancel({
|
|
paymentId: '',
|
|
locale: 'tr',
|
|
conversationId: `test-empty-paymentid-${Date.now()}`,
|
|
});
|
|
expect(response).toBeDefined();
|
|
expect(response.status).toBeDefined();
|
|
if (response.status === 'failure') {
|
|
const errorResponse = response as unknown as ErrorResponse;
|
|
expect(errorResponse.errorCode || errorResponse.errorMessage).toBeTruthy();
|
|
}
|
|
} catch (error: any) {
|
|
expect(error).toBeDefined();
|
|
expect(error).toBeInstanceOf(Error);
|
|
}
|
|
});
|
|
|
|
it('should handle missing paymentId for cancel', async () => {
|
|
try {
|
|
const response = await client.cancelRefund.cancel({
|
|
paymentId: undefined as any,
|
|
locale: 'tr',
|
|
conversationId: `test-missing-paymentid-${Date.now()}`,
|
|
});
|
|
expect(response).toBeDefined();
|
|
expect(response.status).toBeDefined();
|
|
if (response.status === 'failure') {
|
|
const errorResponse = response as unknown as ErrorResponse;
|
|
expect(errorResponse.errorCode || errorResponse.errorMessage).toBeTruthy();
|
|
}
|
|
} catch (error: any) {
|
|
expect(error).toBeDefined();
|
|
expect(error).toBeInstanceOf(Error);
|
|
}
|
|
});
|
|
|
|
it('should handle invalid paymentTransactionId for refund', async () => {
|
|
try {
|
|
const response = await client.cancelRefund.refund({
|
|
paymentTransactionId: 'invalid-transaction-id-99999',
|
|
price: 1.0,
|
|
locale: 'tr',
|
|
conversationId: `test-invalid-transactionid-${Date.now()}`,
|
|
});
|
|
expect(response).toBeDefined();
|
|
expect(response.status).toBeDefined();
|
|
if (response.status === 'failure') {
|
|
const errorResponse = response as unknown as ErrorResponse;
|
|
expect(errorResponse.errorCode || errorResponse.errorMessage).toBeTruthy();
|
|
}
|
|
} catch (error: any) {
|
|
expect(error).toBeDefined();
|
|
expect(error).toBeInstanceOf(Error);
|
|
}
|
|
});
|
|
|
|
it('should handle empty paymentTransactionId for refund', async () => {
|
|
try {
|
|
const response = await client.cancelRefund.refund({
|
|
paymentTransactionId: '',
|
|
price: 1.0,
|
|
locale: 'tr',
|
|
conversationId: `test-empty-transactionid-${Date.now()}`,
|
|
});
|
|
expect(response).toBeDefined();
|
|
expect(response.status).toBeDefined();
|
|
if (response.status === 'failure') {
|
|
const errorResponse = response as unknown as ErrorResponse;
|
|
expect(errorResponse.errorCode || errorResponse.errorMessage).toBeTruthy();
|
|
}
|
|
} catch (error: any) {
|
|
expect(error).toBeDefined();
|
|
expect(error).toBeInstanceOf(Error);
|
|
}
|
|
});
|
|
|
|
it('should handle missing paymentTransactionId for refund', async () => {
|
|
try {
|
|
const response = await client.cancelRefund.refund({
|
|
paymentTransactionId: undefined as any,
|
|
price: 1.0,
|
|
locale: 'tr',
|
|
conversationId: `test-missing-transactionid-${Date.now()}`,
|
|
});
|
|
expect(response).toBeDefined();
|
|
expect(response.status).toBeDefined();
|
|
if (response.status === 'failure') {
|
|
const errorResponse = response as unknown as ErrorResponse;
|
|
expect(errorResponse.errorCode || errorResponse.errorMessage).toBeTruthy();
|
|
}
|
|
} catch (error: any) {
|
|
expect(error).toBeDefined();
|
|
expect(error).toBeInstanceOf(Error);
|
|
}
|
|
});
|
|
|
|
it('should handle negative price for refund', async () => {
|
|
// First create a payment to get a transaction ID
|
|
const paymentRequest = {
|
|
...testNon3DPaymentRequest,
|
|
conversationId: `test-refund-negative-${Date.now()}`,
|
|
};
|
|
|
|
const paymentResponse = await client.payment.createNon3DS(paymentRequest);
|
|
assertSuccessResponse(paymentResponse);
|
|
|
|
if (paymentResponse.itemTransactions && paymentResponse.itemTransactions[0]) {
|
|
const firstTransaction = paymentResponse.itemTransactions[0];
|
|
if (firstTransaction.paymentTransactionId) {
|
|
try {
|
|
const response = await client.cancelRefund.refund({
|
|
paymentTransactionId: firstTransaction.paymentTransactionId,
|
|
price: -100.0,
|
|
locale: 'tr',
|
|
conversationId: `test-refund-negative-${Date.now()}`,
|
|
});
|
|
expect(response).toBeDefined();
|
|
expect(response.status).toBeDefined();
|
|
if (response.status === 'failure') {
|
|
const errorResponse = response as unknown as ErrorResponse;
|
|
expect(errorResponse.errorCode || errorResponse.errorMessage).toBeTruthy();
|
|
}
|
|
} catch (error: any) {
|
|
expect(error).toBeDefined();
|
|
expect(error).toBeInstanceOf(Error);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
it('should handle zero price for refund', async () => {
|
|
// First create a payment to get a transaction ID
|
|
const paymentRequest = {
|
|
...testNon3DPaymentRequest,
|
|
conversationId: `test-refund-zero-${Date.now()}`,
|
|
};
|
|
|
|
const paymentResponse = await client.payment.createNon3DS(paymentRequest);
|
|
assertSuccessResponse(paymentResponse);
|
|
|
|
if (paymentResponse.itemTransactions && paymentResponse.itemTransactions[0]) {
|
|
const firstTransaction = paymentResponse.itemTransactions[0];
|
|
if (firstTransaction.paymentTransactionId) {
|
|
try {
|
|
const response = await client.cancelRefund.refund({
|
|
paymentTransactionId: firstTransaction.paymentTransactionId,
|
|
price: 0,
|
|
locale: 'tr',
|
|
conversationId: `test-refund-zero-${Date.now()}`,
|
|
});
|
|
expect(response).toBeDefined();
|
|
expect(response.status).toBeDefined();
|
|
if (response.status === 'failure') {
|
|
const errorResponse = response as unknown as ErrorResponse;
|
|
expect(errorResponse.errorCode || errorResponse.errorMessage).toBeTruthy();
|
|
}
|
|
} catch (error: any) {
|
|
expect(error).toBeDefined();
|
|
expect(error).toBeInstanceOf(Error);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
it('should handle refund amount greater than original payment', async () => {
|
|
// First create a payment
|
|
const paymentRequest = {
|
|
...testNon3DPaymentRequest,
|
|
conversationId: `test-refund-excess-${Date.now()}`,
|
|
};
|
|
|
|
const paymentResponse = await client.payment.createNon3DS(paymentRequest);
|
|
assertSuccessResponse(paymentResponse);
|
|
|
|
if (paymentResponse.itemTransactions && paymentResponse.itemTransactions[0]) {
|
|
const firstTransaction = paymentResponse.itemTransactions[0];
|
|
if (firstTransaction.paymentTransactionId) {
|
|
try {
|
|
// Try to refund more than the original amount
|
|
const excessAmount = (firstTransaction.price || 0) * 2;
|
|
const response = await client.cancelRefund.refund({
|
|
paymentTransactionId: firstTransaction.paymentTransactionId,
|
|
price: excessAmount,
|
|
locale: 'tr',
|
|
conversationId: `test-refund-excess-${Date.now()}`,
|
|
});
|
|
expect(response).toBeDefined();
|
|
expect(response.status).toBeDefined();
|
|
if (response.status === 'failure') {
|
|
const errorResponse = response as unknown as ErrorResponse;
|
|
expect(errorResponse.errorCode || errorResponse.errorMessage).toBeTruthy();
|
|
}
|
|
} catch (error: any) {
|
|
expect(error).toBeDefined();
|
|
expect(error).toBeInstanceOf(Error);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
it('should handle invalid paymentId for refundV2', async () => {
|
|
try {
|
|
const response = await client.cancelRefund.refundV2({
|
|
paymentId: 'invalid-payment-id-99999',
|
|
price: 1.0,
|
|
locale: 'tr',
|
|
conversationId: `test-invalid-paymentid-v2-${Date.now()}`,
|
|
});
|
|
expect(response).toBeDefined();
|
|
expect(response.status).toBeDefined();
|
|
if (response.status === 'failure') {
|
|
const errorResponse = response as unknown as ErrorResponse;
|
|
expect(errorResponse.errorCode || errorResponse.errorMessage).toBeTruthy();
|
|
}
|
|
} catch (error: any) {
|
|
expect(error).toBeDefined();
|
|
expect(error).toBeInstanceOf(Error);
|
|
}
|
|
});
|
|
|
|
it('should handle missing price for refund', async () => {
|
|
// First create a payment to get a transaction ID
|
|
const paymentRequest = {
|
|
...testNon3DPaymentRequest,
|
|
conversationId: `test-refund-missing-price-${Date.now()}`,
|
|
};
|
|
|
|
const paymentResponse = await client.payment.createNon3DS(paymentRequest);
|
|
assertSuccessResponse(paymentResponse);
|
|
|
|
if (paymentResponse.itemTransactions && paymentResponse.itemTransactions[0]) {
|
|
const firstTransaction = paymentResponse.itemTransactions[0];
|
|
if (firstTransaction.paymentTransactionId) {
|
|
try {
|
|
const response = await client.cancelRefund.refund({
|
|
paymentTransactionId: firstTransaction.paymentTransactionId,
|
|
price: undefined as any,
|
|
locale: 'tr',
|
|
conversationId: `test-refund-missing-price-${Date.now()}`,
|
|
});
|
|
expect(response).toBeDefined();
|
|
expect(response.status).toBeDefined();
|
|
if (response.status === 'failure') {
|
|
const errorResponse = response as unknown as ErrorResponse;
|
|
expect(errorResponse.errorCode || errorResponse.errorMessage).toBeTruthy();
|
|
}
|
|
} catch (error: any) {
|
|
expect(error).toBeDefined();
|
|
expect(error).toBeInstanceOf(Error);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
});
|
|
});
|
|
|