Skip to content
Merged
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
13 changes: 12 additions & 1 deletion src/aleph/sdk/client/authenticated_http.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import datetime
import hashlib
import json
import logging
Expand Down Expand Up @@ -50,6 +51,16 @@
magic = None # type:ignore


def extended_json_encoder(obj: Any) -> str:
if (
isinstance(obj, datetime.datetime)
or isinstance(obj, datetime.date)
or isinstance(obj, datetime.time)
):
return obj.isoformat() # or any other format you prefer
return pydantic_encoder(obj)


class AuthenticatedAlephHttpClient(AlephHttpClient, AuthenticatedAlephClient):
account: Account

Expand Down Expand Up @@ -604,7 +615,7 @@ async def _prepare_aleph_message(

# Use the Pydantic encoder to serialize types like UUID, datetimes, etc.
item_content: str = json.dumps(
content, separators=(",", ":"), default=pydantic_encoder
content, separators=(",", ":"), default=extended_json_encoder
)

if allow_inlining and (len(item_content) < settings.MAX_INLINE_SIZE):
Expand Down
63 changes: 63 additions & 0 deletions tests/unit/test_asynchronous.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
import datetime
from unittest.mock import AsyncMock

import pytest as pytest
from aleph_message.models import (
AggregateMessage,
ForgetMessage,
InstanceMessage,
MessageType,
PostMessage,
ProgramMessage,
StoreMessage,
)
from aleph_message.models.execution.environment import MachineResources
from aleph_message.status import MessageStatus

from aleph.sdk.types import StorageEnum
Expand Down Expand Up @@ -121,3 +124,63 @@ async def test_forget(mock_session_with_post_success):

assert mock_session_with_post_success.http_session.post.called_once
assert isinstance(forget_message, ForgetMessage)


@pytest.mark.asyncio
@pytest.mark.parametrize(
"message_type, content",
[
(
MessageType.aggregate,
{
"content": {"Hello": datetime.datetime.now()},
"key": "test",
"address": "0x1",
"time": 1.0,
},
),
(
MessageType.aggregate,
{
"content": {"Hello": datetime.date.today()},
"key": "test",
"address": "0x1",
"time": 1.0,
},
),
(
MessageType.aggregate,
{
"content": {"Hello": datetime.time()},
"key": "test",
"address": "0x1",
"time": 1.0,
},
),
(
MessageType.aggregate,
{
"content": {
"Hello": MachineResources(
vcpus=1,
memory=1024,
seconds=1,
)
},
"key": "test",
"address": "0x1",
"time": 1.0,
},
),
],
)
async def test_prepare_aleph_message(
mock_session_with_post_success, message_type, content
):
# Call the function under test
async with mock_session_with_post_success as session:
await session._prepare_aleph_message(
message_type=message_type,
content=content,
channel="TEST",
)