11"""Unit tests for pure functions in memory.py."""
22
3+ import hashlib
34from unittest .mock import MagicMock , patch
45
56import pytest
67
7- from memory import _SCHEMA_VERSION , _validate_repo , write_repo_learnings , write_task_episode
8+ from memory import (
9+ _SCHEMA_VERSION ,
10+ MEMORY_SOURCE_TYPES ,
11+ _validate_repo ,
12+ write_repo_learnings ,
13+ write_task_episode ,
14+ )
15+ from sanitization import sanitize_external_content
816
917
1018class TestValidateRepo :
@@ -43,6 +51,14 @@ def test_schema_version_is_3(self):
4351 assert _SCHEMA_VERSION == "3"
4452
4553
54+ class TestMemorySourceTypes :
55+ def test_contains_expected_values (self ):
56+ assert {"agent_episode" , "agent_learning" , "orchestrator_fallback" } == MEMORY_SOURCE_TYPES
57+
58+ def test_is_frozen (self ):
59+ assert isinstance (MEMORY_SOURCE_TYPES , frozenset )
60+
61+
4662class TestWriteTaskEpisode :
4763 @patch ("memory._get_client" )
4864 def test_includes_source_type_in_metadata (self , mock_get_client ):
@@ -54,10 +70,11 @@ def test_includes_source_type_in_metadata(self, mock_get_client):
5470 call_kwargs = mock_client .create_event .call_args [1 ]
5571 metadata = call_kwargs ["metadata" ]
5672 assert metadata ["source_type" ] == {"stringValue" : "agent_episode" }
73+ assert metadata ["source_type" ]["stringValue" ] in MEMORY_SOURCE_TYPES
5774 assert metadata ["schema_version" ] == {"stringValue" : "3" }
5875
5976 @patch ("memory._get_client" )
60- def test_includes_content_sha256_in_metadata (self , mock_get_client ):
77+ def test_content_sha256_matches_sanitized_content (self , mock_get_client ):
6178 mock_client = MagicMock ()
6279 mock_get_client .return_value = mock_client
6380
@@ -66,8 +83,14 @@ def test_includes_content_sha256_in_metadata(self, mock_get_client):
6683 call_kwargs = mock_client .create_event .call_args [1 ]
6784 metadata = call_kwargs ["metadata" ]
6885 assert "content_sha256" in metadata
69- # SHA-256 hex is 64 chars
70- assert len (metadata ["content_sha256" ]["stringValue" ]) == 64
86+ hash_value = metadata ["content_sha256" ]["stringValue" ]
87+ assert len (hash_value ) == 64
88+
89+ # Verify hash matches the sanitized content that was actually stored
90+ content = call_kwargs ["payload" ][0 ]["conversational" ]["content" ]["text" ]
91+ sanitized = sanitize_external_content (content )
92+ expected = hashlib .sha256 (sanitized .encode ("utf-8" )).hexdigest ()
93+ assert hash_value == expected
7194
7295
7396class TestWriteRepoLearnings :
@@ -81,10 +104,11 @@ def test_includes_source_type_in_metadata(self, mock_get_client):
81104 call_kwargs = mock_client .create_event .call_args [1 ]
82105 metadata = call_kwargs ["metadata" ]
83106 assert metadata ["source_type" ] == {"stringValue" : "agent_learning" }
107+ assert metadata ["source_type" ]["stringValue" ] in MEMORY_SOURCE_TYPES
84108 assert metadata ["schema_version" ] == {"stringValue" : "3" }
85109
86110 @patch ("memory._get_client" )
87- def test_includes_content_sha256_in_metadata (self , mock_get_client ):
111+ def test_content_sha256_matches_sanitized_content (self , mock_get_client ):
88112 mock_client = MagicMock ()
89113 mock_get_client .return_value = mock_client
90114
@@ -93,4 +117,10 @@ def test_includes_content_sha256_in_metadata(self, mock_get_client):
93117 call_kwargs = mock_client .create_event .call_args [1 ]
94118 metadata = call_kwargs ["metadata" ]
95119 assert "content_sha256" in metadata
96- assert len (metadata ["content_sha256" ]["stringValue" ]) == 64
120+ hash_value = metadata ["content_sha256" ]["stringValue" ]
121+ assert len (hash_value ) == 64
122+
123+ content = call_kwargs ["payload" ][0 ]["conversational" ]["content" ]["text" ]
124+ sanitized = sanitize_external_content (content )
125+ expected = hashlib .sha256 (sanitized .encode ("utf-8" )).hexdigest ()
126+ assert hash_value == expected
0 commit comments