1
+ """Unit tests for AnsariClaude system_prompt_file parameter."""
2
+
3
+ import pytest
4
+ from unittest .mock import MagicMock , patch , mock_open
5
+ import anthropic
6
+
7
+
8
+ @pytest .fixture
9
+ def mock_settings ():
10
+ """Mock settings for testing."""
11
+ settings = MagicMock ()
12
+ settings .ANTHROPIC_API_KEY = MagicMock ()
13
+ settings .ANTHROPIC_API_KEY .get_secret_value .return_value = "test-api-key"
14
+ settings .ANTHROPIC_MODEL = "claude-3-opus-20240229"
15
+ settings .KALEMAT_API_KEY = MagicMock ()
16
+ settings .KALEMAT_API_KEY .get_secret_value .return_value = "test-kalemat-key"
17
+ settings .VECTARA_API_KEY = MagicMock ()
18
+ settings .VECTARA_API_KEY .get_secret_value .return_value = "test-vectara-key"
19
+ settings .MAWSUAH_VECTARA_CORPUS_KEY = "test-corpus-key"
20
+ settings .TAFSIR_VECTARA_CORPUS_KEY = "test-tafsir-key"
21
+ settings .USUL_API_TOKEN = MagicMock ()
22
+ settings .USUL_API_TOKEN .get_secret_value .return_value = "test-usul-token"
23
+ settings .MODEL = "test-model"
24
+ settings .PROMPT_PATH = "/test/prompts"
25
+ settings .SYSTEM_PROMPT_FILE_NAME = "system_msg_default"
26
+ settings .AYAH_SYSTEM_PROMPT_FILE_NAME = "system_msg_ayah"
27
+ return settings
28
+
29
+
30
+ class TestAnsariClaudeSystemPrompt :
31
+ """Test AnsariClaude system prompt file parameter."""
32
+
33
+ def test_default_system_prompt_file (self , mock_settings ):
34
+ """Test that AnsariClaude uses default system prompt file when not specified."""
35
+ with patch ("anthropic.Anthropic" ), \
36
+ patch ("src.ansari.util.prompt_mgr.PromptMgr" ) as mock_prompt_mgr :
37
+ # Mock the prompt manager
38
+ mock_prompt = MagicMock ()
39
+ mock_prompt .render .return_value = "Test system prompt"
40
+ mock_prompt_mgr .return_value .bind .return_value = mock_prompt
41
+
42
+ from src .ansari .agents .ansari_claude import AnsariClaude
43
+
44
+ # Initialize without system_prompt_file parameter
45
+ ansari = AnsariClaude (mock_settings )
46
+
47
+ # Verify default is used
48
+ assert ansari .system_prompt_file == "system_msg_claude"
49
+
50
+ def test_custom_system_prompt_file (self , mock_settings ):
51
+ """Test that AnsariClaude uses custom system prompt file when specified."""
52
+ with patch ("anthropic.Anthropic" ), \
53
+ patch ("src.ansari.util.prompt_mgr.PromptMgr" ) as mock_prompt_mgr :
54
+ # Mock the prompt manager
55
+ mock_prompt = MagicMock ()
56
+ mock_prompt .render .return_value = "Test system prompt"
57
+ mock_prompt_mgr .return_value .bind .return_value = mock_prompt
58
+
59
+ from src .ansari .agents .ansari_claude import AnsariClaude
60
+
61
+ # Initialize with custom system_prompt_file
62
+ ansari = AnsariClaude (mock_settings , system_prompt_file = "system_msg_ayah" )
63
+
64
+ # Verify custom file is used
65
+ assert ansari .system_prompt_file == "system_msg_ayah"
66
+
67
+ def test_system_prompt_loaded_in_process_one_round (self , mock_settings ):
68
+ """Test that the correct system prompt file is loaded during process_one_round."""
69
+ with patch ("anthropic.Anthropic" ) as mock_anthropic :
70
+ # Mock the Anthropic client
71
+ mock_client = MagicMock ()
72
+ mock_anthropic .return_value = mock_client
73
+
74
+ # Mock the response stream
75
+ mock_response = MagicMock ()
76
+ mock_response .__iter__ = MagicMock (return_value = iter ([]))
77
+ mock_client .messages .create .return_value = mock_response
78
+
79
+ from src .ansari .agents .ansari_claude import AnsariClaude
80
+ from src .ansari .util .prompt_mgr import PromptMgr
81
+
82
+ # Initialize with custom system prompt file
83
+ ansari = AnsariClaude (mock_settings , system_prompt_file = "system_msg_ayah" )
84
+
85
+ # Add a message to history
86
+ ansari .message_history = [{"role" : "user" , "content" : "test question" }]
87
+
88
+ # Mock PromptMgr to verify the correct file is loaded
89
+ with patch .object (PromptMgr , 'bind' ) as mock_bind :
90
+ mock_prompt = MagicMock ()
91
+ mock_prompt .render .return_value = "Test ayah system prompt"
92
+ mock_bind .return_value = mock_prompt
93
+
94
+ # Call process_one_round
95
+ result = list (ansari .process_one_round ())
96
+
97
+ # Verify the correct system prompt file was loaded
98
+ mock_bind .assert_called_with ("system_msg_ayah" )
99
+
100
+ def test_ayah_endpoint_initialization (self , mock_settings ):
101
+ """Test that the ayah-claude endpoint can initialize AnsariClaude with custom system prompt."""
102
+ with patch ("anthropic.Anthropic" ):
103
+ from src .ansari .agents .ansari_claude import AnsariClaude
104
+
105
+ # Simulate ayah endpoint initialization
106
+ ansari = AnsariClaude (
107
+ mock_settings ,
108
+ system_prompt_file = mock_settings .AYAH_SYSTEM_PROMPT_FILE_NAME
109
+ )
110
+
111
+ # Verify the ayah system prompt file is used
112
+ assert ansari .system_prompt_file == "system_msg_ayah"
113
+
114
+ def test_process_one_round_with_different_prompts (self , mock_settings ):
115
+ """Test that different system prompts are used based on initialization."""
116
+ with patch ("anthropic.Anthropic" ) as mock_anthropic :
117
+ # Mock the Anthropic client
118
+ mock_client = MagicMock ()
119
+ mock_anthropic .return_value = mock_client
120
+
121
+ # Mock the response stream
122
+ mock_response = MagicMock ()
123
+ mock_response .__iter__ = MagicMock (return_value = iter ([]))
124
+ mock_client .messages .create .return_value = mock_response
125
+
126
+ from src .ansari .agents .ansari_claude import AnsariClaude
127
+ from src .ansari .util .prompt_mgr import PromptMgr
128
+
129
+ # Test with default prompt
130
+ ansari_default = AnsariClaude (mock_settings )
131
+ ansari_default .message_history = [{"role" : "user" , "content" : "test" }]
132
+
133
+ with patch .object (PromptMgr , 'bind' ) as mock_bind :
134
+ mock_prompt = MagicMock ()
135
+ mock_prompt .render .return_value = "Default system prompt"
136
+ mock_bind .return_value = mock_prompt
137
+
138
+ list (ansari_default .process_one_round ())
139
+ mock_bind .assert_called_with ("system_msg_claude" )
140
+
141
+ # Test with ayah prompt
142
+ ansari_ayah = AnsariClaude (mock_settings , system_prompt_file = "system_msg_ayah" )
143
+ ansari_ayah .message_history = [{"role" : "user" , "content" : "test" }]
144
+
145
+ with patch .object (PromptMgr , 'bind' ) as mock_bind :
146
+ mock_prompt = MagicMock ()
147
+ mock_prompt .render .return_value = "Ayah system prompt"
148
+ mock_bind .return_value = mock_prompt
149
+
150
+ list (ansari_ayah .process_one_round ())
151
+ mock_bind .assert_called_with ("system_msg_ayah" )
0 commit comments