use crate::{IdempotencyKey, Money, PaymentProvider, PaymentStatus, ProviderReference};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RefundRequest {
pub provider: PaymentProvider,
pub provider_reference: ProviderReference,
pub idempotency_key: IdempotencyKey,
pub amount: Option<Money>,
pub reason: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CaptureRequest {
pub provider: PaymentProvider,
pub provider_reference: ProviderReference,
pub idempotency_key: IdempotencyKey,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RefundResponse {
pub provider: PaymentProvider,
pub provider_reference: ProviderReference,
pub status: PaymentStatus,
}
impl RefundResponse {
#[inline]
#[must_use]
pub const fn provider(&self) -> &PaymentProvider {
&self.provider
}
#[inline]
#[must_use]
pub const fn provider_reference(&self) -> &ProviderReference {
&self.provider_reference
}
#[inline]
#[must_use]
pub const fn status(&self) -> PaymentStatus {
self.status
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CaptureResponse {
pub provider: PaymentProvider,
pub provider_reference: ProviderReference,
pub status: PaymentStatus,
}
impl CaptureResponse {
#[inline]
#[must_use]
pub const fn provider(&self) -> &PaymentProvider {
&self.provider
}
#[inline]
#[must_use]
pub const fn provider_reference(&self) -> &ProviderReference {
&self.provider_reference
}
#[inline]
#[must_use]
pub const fn status(&self) -> PaymentStatus {
self.status
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn write_requests_carry_idempotency_keys() {
let key = IdempotencyKey::new("ORDER-1:refund").expect("key should be valid");
let refund = RefundRequest {
provider: PaymentProvider::Stripe,
provider_reference: ProviderReference::new("pi_123")
.expect("reference should be valid"),
idempotency_key: key.clone(),
amount: None,
reason: None,
};
let capture = CaptureRequest {
provider: PaymentProvider::PayPal,
provider_reference: ProviderReference::new("ORDER-1")
.expect("reference should be valid"),
idempotency_key: IdempotencyKey::new("ORDER-1:capture").expect("key should be valid"),
};
assert_eq!(refund.idempotency_key, key);
assert_eq!(capture.provider, PaymentProvider::PayPal);
}
#[test]
fn refund_response_accessors_return_normalized_fields() {
let response = RefundResponse {
provider: PaymentProvider::Stripe,
provider_reference: ProviderReference::new("re_123")
.expect("reference should be valid"),
status: PaymentStatus::Refunded,
};
assert_eq!(response.provider(), &PaymentProvider::Stripe);
assert_eq!(response.provider_reference().as_str(), "re_123");
assert_eq!(response.status(), PaymentStatus::Refunded);
}
#[test]
fn capture_response_accessors_return_normalized_fields() {
let response = CaptureResponse {
provider: PaymentProvider::PayPal,
provider_reference: ProviderReference::new("ORDER-1")
.expect("reference should be valid"),
status: PaymentStatus::Succeeded,
};
assert_eq!(response.provider(), &PaymentProvider::PayPal);
assert_eq!(response.provider_reference().as_str(), "ORDER-1");
assert_eq!(response.status(), PaymentStatus::Succeeded);
}
}