1
1
"""Tests for DynamoDBSessionManager."""
2
2
3
3
import time
4
+ from decimal import Decimal
4
5
5
6
import boto3
6
7
import pytest
7
8
from botocore .config import Config as BotocoreConfig
8
9
from moto import mock_aws
9
10
10
11
from 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
12
14
from strands .types .content import ContentBlock
13
15
from strands .types .exceptions import SessionException
14
16
from strands .types .session import Session , SessionAgent , SessionMessage , SessionType
@@ -202,6 +204,7 @@ def test_read_agent(dynamodb_manager, sample_session, sample_agent):
202
204
203
205
assert result .agent_id == sample_agent .agent_id
204
206
assert result .state == sample_agent .state
207
+ assert isinstance (result .conversation_manager_state .get ("removed_message_count" ), int )
205
208
206
209
207
210
def test_read_nonexistent_agent (dynamodb_manager , sample_session ):
@@ -265,7 +268,7 @@ def test_read_message(dynamodb_manager, sample_session, sample_agent, sample_mes
265
268
dynamodb_manager .create_message (sample_session .session_id , sample_agent .agent_id , sample_message )
266
269
267
270
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 )
269
272
assert result .message_id == sample_message .message_id
270
273
assert result .message ["role" ] == sample_message .message ["role" ]
271
274
assert result .message ["content" ] == sample_message .message ["content" ]
@@ -306,6 +309,8 @@ def test_list_messages_all(dynamodb_manager, sample_session, sample_agent):
306
309
result = dynamodb_manager .list_messages (sample_session .session_id , sample_agent .agent_id )
307
310
308
311
assert len (result ) == 5
312
+ for msg in result :
313
+ assert isinstance (msg .message_id , int )
309
314
310
315
311
316
def 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):
398
403
"""Test that message_id that is not an integer raises ValueError."""
399
404
with pytest .raises (ValueError , match = r"message_id=<.*> \| message id must be an integer" ):
400
405
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