FakeDanalPayService.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using Application.Abstractions.Payment;
  2. namespace Application.Tests;
  3. /// <summary>
  4. /// IDanalPayService 수제 fake — PG 호출 횟수를 기록하고 설정된 결과/예외를 반환한다.
  5. /// </summary>
  6. internal sealed class FakeDanalPayService : IDanalPayService
  7. {
  8. public DanalConfirmResult ConfirmResult { get; set; } = SuccessConfirm();
  9. public Exception? ConfirmException { get; set; }
  10. public DanalCancelResult CancelResult { get; set; } = SuccessCancel();
  11. public Exception? CancelException { get; set; }
  12. public int ConfirmCallCount { get; private set; }
  13. public int CancelCallCount { get; private set; }
  14. public Task<DanalClientConfig> GetClientConfigAsync(CancellationToken ct)
  15. => Task.FromResult(new DanalClientConfig("test-client-key", "MID-TEST"));
  16. public Task<DanalConfirmResult> ConfirmAsync(string method, string transactionID, string orderID, int amount, CancellationToken ct)
  17. {
  18. ConfirmCallCount++;
  19. if (ConfirmException is not null)
  20. {
  21. throw ConfirmException;
  22. }
  23. return Task.FromResult(ConfirmResult);
  24. }
  25. public Task<DanalCancelResult> CancelAsync(string method, string transactionID, int amount, string cancelType, CancellationToken ct)
  26. {
  27. CancelCallCount++;
  28. if (CancelException is not null)
  29. {
  30. throw CancelException;
  31. }
  32. return Task.FromResult(CancelResult);
  33. }
  34. public static DanalConfirmResult SuccessConfirm() => new(
  35. Success: true, Code: "0000", Message: "OK", TransactionID: "TX-OK", OrderName: "포인트 충전",
  36. TotalAmount: null, DiscountAmount: null, UserName: null,
  37. TransDate: null, TransTime: null,
  38. CardCode: null, CardName: null, CardNo: null,
  39. InstallmentMonths: null, ApproveNo: null,
  40. ApprovalDateTime: null, AuthKey: null,
  41. AccountNumber: null, BankCode: null, UserId: null, UserEmail: null,
  42. BankName: null, ExpireDate: null, ExpireTime: null,
  43. VirtualAccountNumber: null, UseCashReceipt: null);
  44. public static DanalConfirmResult FailConfirm(string code = "9999", string message = "승인 거절")
  45. => SuccessConfirm() with { Success = false, Code = code, Message = message };
  46. public static DanalCancelResult SuccessCancel() => new(
  47. Success: true, Code: "0000", Message: "OK", OriginalTransactionID: "TX-OK",
  48. CancelledAmount: null, TransDate: null, TransTime: null,
  49. Balance: null, RemainedAmount: null, ApprovalDateTime: null);
  50. }