11"""Tests for DynamoDBSessionManager."""
22
33import time
4+ from decimal import Decimal
45
56import boto3
67import pytest
78from botocore .config import Config as BotocoreConfig
89from moto import mock_aws
910
1011from strands .agent .conversation_manager .null_conversation_manager import NullConversationManager
11- from strands .session .dynamodb_session_manager import DynamoDBSessionManager
12+ from strands .session .dynamodb_session_manager import DynamoDBSessionManager , \
13+ _convert_decimals_to_native_types
1214from strands .types .content import ContentBlock
1315from strands .types .exceptions import SessionException
1416from strands .types .session import Session , SessionAgent , SessionMessage , SessionType
@@ -202,6 +204,7 @@ def test_read_agent(dynamodb_manager, sample_session, sample_agent):
202204
203205 assert result .agent_id == sample_agent .agent_id
204206 assert result .state == sample_agent .state
207+ assert isinstance (result .conversation_manager_state .get ("removed_message_count" ), int )
205208
206209
207210def test_read_nonexistent_agent (dynamodb_manager , sample_session ):
@@ -265,7 +268,7 @@ def test_read_message(dynamodb_manager, sample_session, sample_agent, sample_mes
265268 dynamodb_manager .create_message (sample_session .session_id , sample_agent .agent_id , sample_message )
266269
267270 result = dynamodb_manager .read_message (sample_session .session_id , sample_agent .agent_id , sample_message .message_id )
268-
271+ assert isinstance ( result . message_id , int )
269272 assert result .message_id == sample_message .message_id
270273 assert result .message ["role" ] == sample_message .message ["role" ]
271274 assert result .message ["content" ] == sample_message .message ["content" ]
@@ -306,6 +309,8 @@ def test_list_messages_all(dynamodb_manager, sample_session, sample_agent):
306309 result = dynamodb_manager .list_messages (sample_session .session_id , sample_agent .agent_id )
307310
308311 assert len (result ) == 5
312+ for msg in result :
313+ assert isinstance (msg .message_id , int )
309314
310315
311316def test_list_messages_with_pagination (dynamodb_manager , sample_session , sample_agent ):
@@ -398,3 +403,51 @@ def test__get_message_sk_invalid_message_id(message_id, dynamodb_manager):
398403 """Test that message_id that is not an integer raises ValueError."""
399404 with pytest .raises (ValueError , match = r"message_id=<.*> \| message id must be an integer" ):
400405 dynamodb_manager ._get_message_sk ("agent1" , message_id )
406+
407+
408+ def test_convert_decimals_to_native_types ():
409+ """Test the Decimal conversion utility function."""
410+ # Test simple Decimal conversion
411+ assert _convert_decimals_to_native_types (Decimal ('10' )) == 10
412+ assert _convert_decimals_to_native_types (Decimal ('10.5' )) == 10.5
413+ assert _convert_decimals_to_native_types (Decimal ('0' )) == 0
414+
415+ # Test nested dictionary conversion
416+ data = {
417+ 'limit' : Decimal ('10' ),
418+ 'max_length' : Decimal ('8000' ),
419+ 'temperature' : Decimal ('0.5' ),
420+ 'name' : 'test' ,
421+ 'enabled' : True ,
422+ 'nested' : {
423+ 'count' : Decimal ('42' ),
424+ 'ratio' : Decimal ('3.14' )
425+ }
426+ }
427+
428+ result = _convert_decimals_to_native_types (data )
429+
430+ assert result ['limit' ] == 10
431+ assert isinstance (result ['limit' ], int )
432+ assert result ['max_length' ] == 8000
433+ assert isinstance (result ['max_length' ], int )
434+ assert result ['temperature' ] == 0.5
435+ assert isinstance (result ['temperature' ], float )
436+ assert result ['name' ] == 'test'
437+ assert result ['enabled' ] is True
438+ assert result ['nested' ]['count' ] == 42
439+ assert isinstance (result ['nested' ]['count' ], int )
440+ assert result ['nested' ]['ratio' ] == 3.14
441+ assert isinstance (result ['nested' ]['ratio' ], float )
442+
443+ # Test list conversion
444+ list_data = [Decimal ('1' ), Decimal ('2.5' ), 'string' , {'nested' : Decimal ('100' )}]
445+ result = _convert_decimals_to_native_types (list_data )
446+
447+ assert result [0 ] == 1
448+ assert isinstance (result [0 ], int )
449+ assert result [1 ] == 2.5
450+ assert isinstance (result [1 ], float )
451+ assert result [2 ] == 'string'
452+ assert result [3 ]['nested' ] == 100
453+ assert isinstance (result [3 ]['nested' ], int )
0 commit comments