1use crate::{IdempotencyKey, Money, PaymentProvider, PaymentStatus, ProviderReference};
2
3#[derive(Debug, Clone, PartialEq, Eq)]
5pub struct RefundRequest {
6 pub provider: PaymentProvider,
8 pub provider_reference: ProviderReference,
10 pub idempotency_key: IdempotencyKey,
12 pub amount: Option<Money>,
14 pub reason: Option<String>,
16}
17
18#[derive(Debug, Clone, PartialEq, Eq)]
20pub struct CaptureRequest {
21 pub provider: PaymentProvider,
23 pub provider_reference: ProviderReference,
25 pub idempotency_key: IdempotencyKey,
27}
28
29#[derive(Debug, Clone, PartialEq, Eq)]
31pub struct RefundResponse {
32 pub provider: PaymentProvider,
34 pub provider_reference: ProviderReference,
36 pub status: PaymentStatus,
38}
39
40#[derive(Debug, Clone, PartialEq, Eq)]
42pub struct CaptureResponse {
43 pub provider: PaymentProvider,
45 pub provider_reference: ProviderReference,
47 pub status: PaymentStatus,
49}
50
51#[cfg(test)]
52mod tests {
53 use super::*;
54
55 #[test]
56 fn write_requests_carry_idempotency_keys() {
57 let key = IdempotencyKey::new("ORDER-1:refund").expect("key should be valid");
58 let refund = RefundRequest {
59 provider: PaymentProvider::Stripe,
60 provider_reference: ProviderReference::new("pi_123")
61 .expect("reference should be valid"),
62 idempotency_key: key.clone(),
63 amount: None,
64 reason: None,
65 };
66 let capture = CaptureRequest {
67 provider: PaymentProvider::PayPal,
68 provider_reference: ProviderReference::new("ORDER-1")
69 .expect("reference should be valid"),
70 idempotency_key: IdempotencyKey::new("ORDER-1:capture").expect("key should be valid"),
71 };
72
73 assert_eq!(refund.idempotency_key, key);
74 assert_eq!(capture.provider, PaymentProvider::PayPal);
75 }
76}