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); }