Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Added IPAddressesClient.get_ip_addresses #40

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ Check our main [developer changelog](https://developer.paddle.com/?utm_source=dx
- `TransactionsClient.get_invoice_pdf` now supports `disposition` parameter, see [related changelog](https://developer.paddle.com/changelog/2024/invoice-pdf-open-in-browser)
- `SubscriptionClient` `preview_update` and `preview_one_time_charge` responses now have `import_meta` property
- Support for `tax_rates_used` on Adjustments
- Added `IPAddressesClient.get_ip_addresses` to support retrieval of Paddle IP addresses

### Changed

Expand Down
2 changes: 2 additions & 0 deletions paddle_billing/Client.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from paddle_billing.Resources.Discounts.DiscountsClient import DiscountsClient
from paddle_billing.Resources.Events.EventsClient import EventsClient
from paddle_billing.Resources.EventTypes.EventTypesClient import EventTypesClient
from paddle_billing.Resources.IPAddresses.IPAddressesClient import IPAddressesClient
from paddle_billing.Resources.Notifications.NotificationsClient import NotificationsClient
from paddle_billing.Resources.NotificationLogs.NotificationLogsClient import NotificationLogsClient
from paddle_billing.Resources.NotificationSettings.NotificationSettingsClient import NotificationSettingsClient
Expand Down Expand Up @@ -80,6 +81,7 @@ def __init__(
self.reports = ReportsClient(self)
self.subscriptions = SubscriptionsClient(self)
self.transactions = TransactionsClient(self)
self.ip_addresses = IPAddressesClient(self)


@staticmethod
Expand Down
16 changes: 16 additions & 0 deletions paddle_billing/Entities/IPAddresses.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from __future__ import annotations
from dataclasses import dataclass

from paddle_billing.Entities.Entity import Entity


@dataclass
class IPAddresses(Entity):
ipv4_cidrs: list[str] | None


@staticmethod
def from_dict(data: dict) -> IPAddresses:
return IPAddresses(
ipv4_cidrs = data['ipv4_cidrs'],
)
20 changes: 20 additions & 0 deletions paddle_billing/Resources/IPAddresses/IPAddressesClient.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from paddle_billing.ResponseParser import ResponseParser

from paddle_billing.Entities.IPAddresses import IPAddresses

from typing import TYPE_CHECKING
if TYPE_CHECKING:
from paddle_billing.Client import Client


class IPAddressesClient:
def __init__(self, client: 'Client'):
self.client = client
self.response = None


def get_ip_addresses(self) -> IPAddresses:
self.response = self.client.get_raw('/ips')
parser = ResponseParser(self.response)

return IPAddresses.from_dict(parser.get_data())
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"data": {
"ipv4_cidrs": [
"34.194.127.46/32",
"54.234.237.108/32",
"3.208.120.145/32"
]
},
"meta": {
"request_id": "ceca4b2f-db0d-4b00-9228-35e0dec592b4"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from urllib.parse import unquote

from paddle_billing.Entities.IPAddresses import IPAddresses

from tests.Utils.TestClient import mock_requests, test_client
from tests.Utils.ReadsFixture import ReadsFixtures


class TestIPAddressesClient:
def test_get_ip_addresses(
self,
test_client,
mock_requests
):
expected_url = f"{test_client.base_url}/ips"
mock_requests.get(expected_url, status_code=200, text=ReadsFixtures.read_raw_json_fixture('response/ips'))

response = test_client.client.ip_addresses.get_ip_addresses()
last_request = mock_requests.last_request

assert isinstance(response, IPAddresses)

ipv4_cidrs = response.ipv4_cidrs

assert len(ipv4_cidrs) == 3

assert ipv4_cidrs[0] == '34.194.127.46/32'
assert ipv4_cidrs[1] == '54.234.237.108/32'
assert ipv4_cidrs[2] == '3.208.120.145/32'

assert last_request is not None
assert last_request.method == 'GET'
assert test_client.client.status_code == 200
assert unquote(last_request.url) == expected_url, \
"The URL does not match the expected URL, verify the query string is correct"