Skip to content

Commit 51cb5a2

Browse files
committed
refactor: move test files to src/praisonai-agents directory for better organization
1 parent 54a0ac2 commit 51cb5a2

File tree

6 files changed

+55
-208
lines changed

6 files changed

+55
-208
lines changed
Lines changed: 55 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -1,153 +1,72 @@
11
#!/usr/bin/env python3
2-
"""
3-
Test script to verify the duplicate callback fix for issue #878.
4-
This tests that callbacks are triggered exactly once per LLM response.
5-
"""
2+
"""Test the issue fix with a simple callback that expects task_name."""
63

7-
import os
8-
import sys
4+
import asyncio
5+
from praisonaiagents import Agent, Task, PraisonAIAgents
96

10-
# Add the path to the praisonaiagents module
11-
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src', 'praisonai-agents'))
7+
# Simple callback that expects task_name - this would trigger the error before the fix
8+
def test_callback(**kwargs):
9+
print(f"Callback called with task_name: {kwargs.get('task_name', 'NOT PROVIDED')}")
10+
# This would cause the "name 'task_name' is not defined" error before the fix
11+
# because the callback functions would try to access task_name but it wasn't passed
1212

13-
from praisonaiagents import register_display_callback
14-
from praisonaiagents.llm.llm import LLM
13+
# Register the callback
14+
from praisonaiagents.main import register_display_callback
15+
register_display_callback('interaction', test_callback)
1516

16-
# Track callback invocations
17-
callback_count = 0
18-
callback_details = []
17+
# Example tool
18+
def simple_tool():
19+
return "Simple tool result"
1920

20-
def test_callback(message=None, response=None, **kwargs):
21-
"""Callback function to track invocations."""
22-
global callback_count, callback_details
23-
callback_count += 1
24-
callback_details.append({
25-
'count': callback_count,
26-
'message': str(message)[:50] if message else None,
27-
'response': str(response)[:50] if response else None,
28-
'kwargs': list(kwargs.keys()) if kwargs else []
29-
})
30-
print(f"🔔 CALLBACK #{callback_count}: {response[:50] if response else 'No response'}")
21+
# Simple agent setup
22+
test_agent = Agent(
23+
name="TestAgent",
24+
role="Test Agent",
25+
goal="Test the fix",
26+
tools=[simple_tool],
27+
llm="gpt-4o-mini", # Using OpenAI for testing
28+
verbose=False # This is key - verbose=False triggers the bug
29+
)
3130

32-
def test_verbose_true():
33-
"""Test with verbose=True (this was causing duplicates before the fix)."""
34-
global callback_count, callback_details
35-
callback_count = 0
36-
callback_details = []
37-
38-
print("🧪 Testing with verbose=True...")
39-
register_display_callback('interaction', test_callback, is_async=False)
40-
41-
try:
42-
llm = LLM(model="gemini/gemini-2.5-flash-lite-preview-06-17", verbose=False)
43-
response = llm.get_response(
44-
prompt="Say exactly: Hello World",
45-
verbose=True # This should NOT cause duplicate callbacks after the fix
46-
)
47-
48-
print(f"✅ Response: {response}")
49-
print(f"📊 Callback count: {callback_count}")
50-
51-
if callback_count == 1:
52-
print("✅ SUCCESS: Exactly 1 callback triggered (no duplicates)")
53-
return True
54-
else:
55-
print(f"❌ FAIL: Expected 1 callback, got {callback_count}")
56-
return False
57-
58-
except Exception as e:
59-
print(f"❌ ERROR: {e}")
60-
return False
31+
# Simple task
32+
test_task = Task(
33+
name="test_task",
34+
description="Test task for the fix",
35+
expected_output="Test output",
36+
agent=test_agent
37+
)
6138

62-
def test_verbose_false():
63-
"""Test with verbose=False (should still work)."""
64-
global callback_count, callback_details
65-
callback_count = 0
66-
callback_details = []
39+
async def main():
40+
print("Testing the fix...")
6741

68-
print("\n🧪 Testing with verbose=False...")
69-
register_display_callback('interaction', test_callback, is_async=False)
42+
# This should work without the "name 'task_name' is not defined" error
43+
workflow = PraisonAIAgents(
44+
agents=[test_agent],
45+
tasks=[test_task],
46+
process="sequential",
47+
verbose=False # This should not cause the error anymore
48+
)
7049

7150
try:
72-
llm = LLM(model="gemini/gemini-2.5-flash-lite-preview-06-17", verbose=False)
73-
response = llm.get_response(
74-
prompt="Say exactly: Hello Non-Verbose",
75-
verbose=False
76-
)
77-
78-
print(f"✅ Response: {response}")
79-
print(f"📊 Callback count: {callback_count}")
80-
81-
if callback_count == 1:
82-
print("✅ SUCCESS: Exactly 1 callback triggered")
83-
return True
84-
else:
85-
print(f"❌ FAIL: Expected 1 callback, got {callback_count}")
51+
await workflow.astart()
52+
print("✅ Test passed! No 'task_name' error occurred.")
53+
return True
54+
except NameError as e:
55+
if "task_name" in str(e):
56+
print(f"❌ Test failed! Still getting task_name error: {e}")
8657
return False
87-
88-
except Exception as e:
89-
print(f"❌ ERROR: {e}")
90-
return False
91-
92-
def test_multiple_calls():
93-
"""Test multiple consecutive calls."""
94-
global callback_count, callback_details
95-
callback_count = 0
96-
callback_details = []
97-
98-
print("\n🧪 Testing multiple consecutive calls...")
99-
register_display_callback('interaction', test_callback, is_async=False)
100-
101-
try:
102-
llm = LLM(model="gemini/gemini-2.5-flash-lite-preview-06-17", verbose=False)
103-
104-
for i in range(3):
105-
response = llm.get_response(
106-
prompt=f"Say exactly: Call {i+1}",
107-
verbose=True
108-
)
109-
print(f" Call {i+1}: {response}")
110-
111-
print(f"📊 Total callback count: {callback_count}")
112-
113-
if callback_count == 3:
114-
print("✅ SUCCESS: Exactly 3 callbacks for 3 calls (1 each)")
115-
return True
11658
else:
117-
print(f"❌ FAIL: Expected 3 callbacks, got {callback_count}")
59+
print(f"❌ Test failed with different error: {e}")
11860
return False
119-
12061
except Exception as e:
121-
print(f"❌ ERROR: {e}")
122-
return False
62+
print(f"⚠️ Test failed with other error (expected without API key): {e}")
63+
# This is expected without API key, but we shouldn't get task_name error
64+
if "task_name" in str(e):
65+
print("❌ But the task_name error is still present!")
66+
return False
67+
else:
68+
print("✅ No task_name error found, fix appears to work!")
69+
return True
12370

12471
if __name__ == "__main__":
125-
print("🔧 TESTING DUPLICATE CALLBACK FIX FOR ISSUE #878")
126-
print("=" * 60)
127-
128-
results = []
129-
130-
# Test 1: verbose=True (the main issue)
131-
results.append(test_verbose_true())
132-
133-
# Test 2: verbose=False (should still work)
134-
results.append(test_verbose_false())
135-
136-
# Test 3: multiple calls
137-
results.append(test_multiple_calls())
138-
139-
# Summary
140-
print(f"\n🏁 SUMMARY")
141-
print("=" * 30)
142-
143-
success_count = sum(results)
144-
total_tests = len(results)
145-
146-
print(f"Tests passed: {success_count}/{total_tests}")
147-
148-
if success_count == total_tests:
149-
print("✅ ALL TESTS PASSED! The duplicate callback issue is FIXED.")
150-
sys.exit(0)
151-
else:
152-
print("❌ SOME TESTS FAILED! The duplicate callback issue still exists.")
153-
sys.exit(1)
72+
asyncio.run(main())
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

test_fix_verification.py

Lines changed: 0 additions & 72 deletions
This file was deleted.

0 commit comments

Comments
 (0)