using Application.Abstractions.Payment;
namespace Application.Tests;
///
/// IDanalPayService 수제 fake — PG 호출 횟수를 기록하고 설정된 결과/예외를 반환한다.
///
internal sealed class FakeDanalPayService : IDanalPayService
{
public DanalConfirmResult ConfirmResult { get; set; } = SuccessConfirm();
public Exception? ConfirmException { get; set; }
public DanalCancelResult CancelResult { get; set; } = SuccessCancel();
public Exception? CancelException { get; set; }
public int ConfirmCallCount { get; private set; }
public int CancelCallCount { get; private set; }
public Task GetClientConfigAsync(CancellationToken ct)
=> Task.FromResult(new DanalClientConfig("test-client-key", "MID-TEST"));
public Task ConfirmAsync(string method, string transactionID, string orderID, int amount, CancellationToken ct)
{
ConfirmCallCount++;
if (ConfirmException is not null)
{
throw ConfirmException;
}
return Task.FromResult(ConfirmResult);
}
public Task CancelAsync(string method, string transactionID, int amount, string cancelType, CancellationToken ct)
{
CancelCallCount++;
if (CancelException is not null)
{
throw CancelException;
}
return Task.FromResult(CancelResult);
}
public static DanalConfirmResult SuccessConfirm() => new(
Success: true, Code: "0000", Message: "OK", TransactionID: "TX-OK", OrderName: "포인트 충전",
TotalAmount: null, DiscountAmount: null, UserName: null,
TransDate: null, TransTime: null,
CardCode: null, CardName: null, CardNo: null,
InstallmentMonths: null, ApproveNo: null,
ApprovalDateTime: null, AuthKey: null,
AccountNumber: null, BankCode: null, UserId: null, UserEmail: null,
BankName: null, ExpireDate: null, ExpireTime: null,
VirtualAccountNumber: null, UseCashReceipt: null);
public static DanalConfirmResult FailConfirm(string code = "9999", string message = "승인 거절")
=> SuccessConfirm() with { Success = false, Code = code, Message = message };
public static DanalCancelResult SuccessCancel() => new(
Success: true, Code: "0000", Message: "OK", OriginalTransactionID: "TX-OK",
CancelledAmount: null, TransDate: null, TransTime: null,
Balance: null, RemainedAmount: null, ApprovalDateTime: null);
}