Skip to content

Commit f2a50d0

Browse files
committed
fix: get_program_price should now take priority on cost field if it exist
1 parent 91a9851 commit f2a50d0

File tree

3 files changed

+58
-2
lines changed

3 files changed

+58
-2
lines changed

src/aleph/sdk/client/http.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import os.path
44
import ssl
55
import time
6+
from decimal import Decimal
67
from io import BytesIO
78
from pathlib import Path
89
from typing import (
@@ -543,8 +544,16 @@ async def get_program_price(self, item_hash: str) -> PriceResponse:
543544
try:
544545
resp.raise_for_status()
545546
response_json = await resp.json()
547+
token_value = response_json.get(
548+
"cost", response_json.get("required_tokens")
549+
)
550+
if isinstance(token_value, str):
551+
required_tokens = Decimal(token_value)
552+
else:
553+
required_tokens = Decimal(str(token_value))
554+
546555
return PriceResponse(
547-
required_tokens=response_json["required_tokens"],
556+
required_tokens=required_tokens,
548557
payment_type=response_json["payment_type"],
549558
)
550559
except aiohttp.ClientResponseError as e:

src/aleph/sdk/query/responses.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ 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
8383
payment_type: str
8484

8585

tests/unit/test_price.py

Lines changed: 47 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,51 @@ 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.001527777777777777"),
50+
payment_type=expected["payment_type"],
51+
)
52+
53+
# Expected model for the old format
54+
expected_model_old = PriceResponse(
55+
required_tokens=Decimal(str(expected_old["required_tokens"])),
56+
payment_type=expected_old["payment_type"],
57+
)
58+
59+
mock_session = make_mock_get_session(expected)
60+
mock_session_old = make_mock_get_session(expected_old)
61+
62+
async with mock_session:
63+
response = await mock_session.get_program_price("cacacacacacaca")
64+
assert response == expected_model
65+
66+
async with mock_session_old:
67+
response = await mock_session_old.get_program_price("cacacacacacaca")
68+
assert response == expected_model_old
69+
70+
2471
@pytest.mark.asyncio
2572
async def test_get_program_price_invalid():
2673
"""

0 commit comments

Comments
 (0)