From 28f07c9a75e8db366a3ba8f4b7eb124f15f69b26 Mon Sep 17 00:00:00 2001 From: Gonzalo Caballero Date: Mon, 11 Aug 2025 12:46:18 -0400 Subject: [PATCH 1/3] feat(refunds): add resource --- fintoc/resources/refund.py | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 fintoc/resources/refund.py diff --git a/fintoc/resources/refund.py b/fintoc/resources/refund.py new file mode 100644 index 0000000..e2cd29a --- /dev/null +++ b/fintoc/resources/refund.py @@ -0,0 +1,7 @@ +"""Module to hold the Refund resource.""" + +from fintoc.mixins import ResourceMixin + + +class Refund(ResourceMixin): + """Represents a Fintoc Refund.""" From 39fa0f60018759c5f3e32533fd4b7410f9b18d2f Mon Sep 17 00:00:00 2001 From: Gonzalo Caballero Date: Mon, 11 Aug 2025 12:46:25 -0400 Subject: [PATCH 2/3] feat(refunds): add manager --- fintoc/core.py | 2 ++ fintoc/managers/__init__.py | 1 + fintoc/managers/refunds_manager.py | 16 +++++++++++ tests/test_integration.py | 43 ++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+) create mode 100644 fintoc/managers/refunds_manager.py diff --git a/fintoc/core.py b/fintoc/core.py index f49bd85..f16a5bf 100644 --- a/fintoc/core.py +++ b/fintoc/core.py @@ -12,6 +12,7 @@ LinksManager, PaymentIntentsManager, RefreshIntentsManager, + RefundsManager, SubscriptionIntentsManager, SubscriptionsManager, TaxReturnsManager, @@ -49,6 +50,7 @@ def __init__(self, api_key, api_version=None, jws_private_key=None): self.payment_intents = PaymentIntentsManager( "/v1/payment_intents", self._client ) + self.refunds = RefundsManager("/v1/refunds", self._client) self.subscriptions = SubscriptionsManager("/v1/subscriptions", self._client) self.subscription_intents = SubscriptionIntentsManager( "/v1/subscription_intents", self._client diff --git a/fintoc/managers/__init__.py b/fintoc/managers/__init__.py index fe31b83..94357d8 100644 --- a/fintoc/managers/__init__.py +++ b/fintoc/managers/__init__.py @@ -8,6 +8,7 @@ from .movements_manager import MovementsManager from .payment_intents_manager import PaymentIntentsManager from .refresh_intents_manager import RefreshIntentsManager +from .refunds_manager import RefundsManager from .subscription_intents_manager import SubscriptionIntentsManager from .subscriptions_manager import SubscriptionsManager from .tax_returns_manager import TaxReturnsManager diff --git a/fintoc/managers/refunds_manager.py b/fintoc/managers/refunds_manager.py new file mode 100644 index 0000000..3a584c5 --- /dev/null +++ b/fintoc/managers/refunds_manager.py @@ -0,0 +1,16 @@ +"""Module to hold the refunds manager.""" + +from fintoc.mixins import ManagerMixin + + +class RefundsManager(ManagerMixin): + + """Represents a refunds manager.""" + + resource = "refund" + methods = ["list", "get", "create", "cancel"] + + def _cancel(self, identifier, **kwargs): + """Expire a refund.""" + path = f"{self._build_path(**kwargs)}/{identifier}/cancel" + return self._create(path_=path, **kwargs) diff --git a/tests/test_integration.py b/tests/test_integration.py index 159b8e9..0f82922 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -392,6 +392,49 @@ def test_payment_intent_expire(self): assert result.method == "post" assert result.url == f"v1/payment_intents/{payment_intent_id}/expire" + def test_refund_list(self): + """Test getting all refunds.""" + refunds = list(self.fintoc.refunds.list()) + + assert len(refunds) > 0 + for refund in refunds: + assert refund.method == "get" + assert refund.url == "v1/refunds" + + def test_refund_get(self): + """Test getting a specific refund.""" + refund_id = "test_refund_id" + + refund = self.fintoc.refunds.get(refund_id) + + assert refund.method == "get" + assert refund.url == f"v1/refunds/{refund_id}" + + def test_refund_create(self): + """Test creating a refund.""" + refund_data = { + "resource_type": "payment_intent", + "resource_id": "pi_30yWq311fOLrAAKkSH1bvODVLGa", + "amount": 1000, + } + + refund = self.fintoc.refunds.create(**refund_data) + + assert refund.method == "post" + assert refund.url == "v1/refunds" + assert refund.json.resource_type == refund_data["resource_type"] + assert refund.json.resource_id == refund_data["resource_id"] + assert refund.json.amount == refund_data["amount"] + + def test_refund_cancel(self): + """Test canceling a refund.""" + refund_id = "ref_QmbpWzP1HOngN3X7" + + refund = self.fintoc.refunds.cancel(refund_id) + + assert refund.method == "post" + assert refund.url == f"v1/refunds/{refund_id}/cancel" + def test_subscription_intents_list(self): """Test getting all subscription intents.""" subscription_intents = list(self.fintoc.subscription_intents.list()) From 76a188bc518cede8619bb3cdc904d92c6c2abb38 Mon Sep 17 00:00:00 2001 From: Gonzalo Caballero Date: Mon, 11 Aug 2025 16:02:04 -0400 Subject: [PATCH 3/3] pre-release: prepare 2.12.0 release --- fintoc/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fintoc/version.py b/fintoc/version.py index fb0ee01..8bfb09f 100644 --- a/fintoc/version.py +++ b/fintoc/version.py @@ -1,4 +1,4 @@ """Module to hold the version utilities.""" -version_info = (2, 11, 0) +version_info = (2, 12, 0) __version__ = ".".join([str(x) for x in version_info]) diff --git a/pyproject.toml b/pyproject.toml index 659de48..0624651 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "fintoc" -version = "2.11.0" +version = "2.12.0" description = "The official Python client for the Fintoc API." authors = ["Daniel Leal ", "Nebil Kawas "] maintainers = ["Daniel Leal "]