Skip to content

Commit dbc40a0

Browse files
authored
Fix: filter on crn list & port-forwarding (#239)
* fix: allow None type for ports when they are not set / removed by front * fix: allow all node to be found * fix: get_program_price should now take priority on cost field if it exist * Feature: new field for PriceRespond `cost` instead of filling required_token with cost
1 parent 03756d0 commit dbc40a0

File tree

5 files changed

+64
-5
lines changed

5 files changed

+64
-5
lines changed

src/aleph/sdk/client/http.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,10 @@ async def get_estimated_price(
531531
try:
532532
resp.raise_for_status()
533533
response_json = await resp.json()
534+
cost = response_json.get("cost", None)
535+
534536
return PriceResponse(
537+
cost=cost,
535538
required_tokens=response_json["required_tokens"],
536539
payment_type=response_json["payment_type"],
537540
)
@@ -543,8 +546,12 @@ async def get_program_price(self, item_hash: str) -> PriceResponse:
543546
try:
544547
resp.raise_for_status()
545548
response_json = await resp.json()
549+
cost = response_json.get("cost", None)
550+
required_tokens = response_json["required_tokens"]
551+
546552
return PriceResponse(
547-
required_tokens=response_json["required_tokens"],
553+
required_tokens=required_tokens,
554+
cost=cost,
548555
payment_type=response_json["payment_type"],
549556
)
550557
except aiohttp.ClientResponseError as e:

src/aleph/sdk/client/services/crn.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,9 +230,8 @@ async def get_crns_list(self, only_active: bool = True) -> CrnList:
230230
dict
231231
The parsed JSON response from /crns.json.
232232
"""
233-
# We want filter_inactive = (not only_active)
234233
# Convert bool to string for the query parameter
235-
filter_inactive_str = str(not only_active).lower()
234+
filter_inactive_str = str(only_active).lower()
236235
params = {"filter_inactive": filter_inactive_str}
237236

238237
# Create a new session for external domain requests

src/aleph/sdk/query/responses.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ class MessagesResponse(PaginationResponse):
7979
class PriceResponse(BaseModel):
8080
"""Response from an aleph.im node API on the path /api/v0/price/{item_hash}"""
8181

82-
required_tokens: float
82+
required_tokens: Decimal
83+
cost: Optional[str] = None
8384
payment_type: str
8485

8586

src/aleph/sdk/types.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ class Ports(BaseModel):
309309
ports: Dict[int, PortFlags]
310310

311311

312-
AllForwarders = RootModel[Dict[ItemHash, Ports]]
312+
AllForwarders = RootModel[Dict[ItemHash, Optional[Ports]]]
313313

314314

315315
class DictLikeModel(BaseModel):

tests/unit/test_price.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from decimal import Decimal
2+
13
import pytest
24

35
from aleph.sdk.exceptions import InvalidHashError
@@ -21,6 +23,56 @@ async def test_get_program_price_valid():
2123
assert response == expected
2224

2325

26+
@pytest.mark.asyncio
27+
async def test_get_program_price_cost_and_required_token():
28+
"""
29+
Test that the get_program_price method returns the correct PriceResponse
30+
when
31+
1 ) cost & required_token is here (priority to cost) who is a string that convert to decimal
32+
2 ) When only required_token is here who is a float that now would be to be convert to decimal
33+
"""
34+
# Case 1
35+
expected = {
36+
"required_tokens": 0.001527777777777778,
37+
"cost": "0.001527777777777777",
38+
"payment_type": "credit",
39+
}
40+
41+
# Case 2
42+
expected_old = {
43+
"required_tokens": 0.001527777777777778,
44+
"payment_type": "credit",
45+
}
46+
47+
# Expected model using the cost field as the source of truth
48+
expected_model = PriceResponse(
49+
required_tokens=Decimal("0.001527777777777778"),
50+
cost=expected["cost"],
51+
payment_type=expected["payment_type"],
52+
)
53+
54+
# Expected model for the old format
55+
expected_model_old = PriceResponse(
56+
required_tokens=Decimal(str(expected_old["required_tokens"])),
57+
payment_type=expected_old["payment_type"],
58+
)
59+
60+
mock_session = make_mock_get_session(expected)
61+
mock_session_old = make_mock_get_session(expected_old)
62+
63+
async with mock_session:
64+
response = await mock_session.get_program_price("cacacacacacaca")
65+
assert str(response.required_tokens) == str(expected_model.required_tokens)
66+
assert response.cost == expected_model.cost
67+
assert response.payment_type == expected_model.payment_type
68+
69+
async with mock_session_old:
70+
response = await mock_session_old.get_program_price("cacacacacacaca")
71+
assert str(response.required_tokens) == str(expected_model_old.required_tokens)
72+
assert response.cost == expected_model_old.cost
73+
assert response.payment_type == expected_model_old.payment_type
74+
75+
2476
@pytest.mark.asyncio
2577
async def test_get_program_price_invalid():
2678
"""

0 commit comments

Comments
 (0)