1+ import unittest
2+ from unittest .mock import MagicMock , patch
3+ from easilyai .enhanced_pipeline import (
4+ EnhancedPipeline , TaskStatus , ExecutionMode , TaskResult , PipelineTask
5+ )
6+
7+
8+ class TestEnhancedPipeline (unittest .TestCase ):
9+ def setUp (self ):
10+ self .mock_app = MagicMock ()
11+ self .pipeline = EnhancedPipeline ("test_pipeline" )
12+
13+ def test_pipeline_init (self ):
14+ self .assertEqual (self .pipeline .name , "test_pipeline" )
15+ self .assertEqual (len (self .pipeline .tasks ), 0 )
16+ self .assertEqual (self .pipeline .execution_mode , ExecutionMode .SEQUENTIAL )
17+
18+ def test_add_task_simple (self ):
19+ task_id = self .pipeline .add_task ("task1" , self .mock_app , "generate_text" , "Hello" )
20+ self .assertEqual (len (self .pipeline .tasks ), 1 )
21+ self .assertIsInstance (task_id , str )
22+
23+ task = self .pipeline .tasks [task_id ]
24+ self .assertEqual (task .task_type , "generate_text" )
25+ self .assertEqual (task .prompt , "Hello" )
26+ self .assertEqual (task .status , TaskStatus .PENDING )
27+
28+ def test_add_task_with_dependencies (self ):
29+ task1_id = self .pipeline .add_task ("task1" , self .mock_app , "generate_text" , "Task 1" )
30+ task2_id = self .pipeline .add_task ("task2" , self .mock_app , "generate_text" , "Task 2" , dependencies = [task1_id ])
31+
32+ self .assertEqual (len (self .pipeline .tasks ), 2 )
33+ task2 = self .pipeline .tasks [task2_id ]
34+ self .assertEqual (task2 .dependencies , [task1_id ])
35+
36+ def test_add_task_with_condition (self ):
37+ condition = lambda results : True
38+ task_id = self .pipeline .add_task ("task1" , self .mock_app , "generate_text" , "Conditional task" , condition = condition )
39+
40+ task = self .pipeline .tasks [task_id ]
41+ self .assertEqual (task .condition , condition )
42+
43+ def test_task_status_enum (self ):
44+ self .assertEqual (TaskStatus .PENDING .value , "pending" )
45+ self .assertEqual (TaskStatus .RUNNING .value , "running" )
46+ self .assertEqual (TaskStatus .COMPLETED .value , "completed" )
47+ self .assertEqual (TaskStatus .FAILED .value , "failed" )
48+ self .assertEqual (TaskStatus .SKIPPED .value , "skipped" )
49+
50+ def test_execution_mode_enum (self ):
51+ self .assertEqual (ExecutionMode .SEQUENTIAL .value , "sequential" )
52+ self .assertEqual (ExecutionMode .PARALLEL .value , "parallel" )
53+ self .assertEqual (ExecutionMode .CONDITIONAL .value , "conditional" )
54+
55+ def test_task_result_creation (self ):
56+ result = TaskResult (
57+ task_id = "test-task" ,
58+ status = TaskStatus .COMPLETED ,
59+ result = "Test result" ,
60+ duration = 1.5
61+ )
62+
63+ self .assertEqual (result .task_id , "test-task" )
64+ self .assertEqual (result .status , TaskStatus .COMPLETED )
65+ self .assertEqual (result .result , "Test result" )
66+ self .assertEqual (result .duration , 1.5 )
67+ self .assertIsNone (result .error )
68+ self .assertEqual (result .metadata , {})
69+
70+ def test_set_execution_mode (self ):
71+ self .pipeline .set_execution_mode (ExecutionMode .PARALLEL )
72+ self .assertEqual (self .pipeline .execution_mode , ExecutionMode .PARALLEL )
73+
74+ def test_clear_tasks (self ):
75+ self .pipeline .add_task ("task1" , self .mock_app , "generate_text" , "Task 1" )
76+ self .pipeline .add_task ("task2" , self .mock_app , "generate_text" , "Task 2" )
77+ self .assertEqual (len (self .pipeline .tasks ), 2 )
78+
79+ self .pipeline .tasks .clear () # Simplified clear method
80+ self .assertEqual (len (self .pipeline .tasks ), 0 )
81+
82+ @patch ('easilyai.enhanced_pipeline.time.time' )
83+ def test_simple_execution_simulation (self , mock_time ):
84+ # Mock time for duration calculation
85+ mock_time .side_effect = [0.0 , 1.0 ] # Start and end times
86+
87+ # Mock app response
88+ self .mock_app .request .return_value = "Generated response"
89+
90+ # Add a simple task
91+ task_id = self .pipeline .add_task ("task1" , self .mock_app , "generate_text" , "Hello" )
92+
93+ # This test verifies the structure, but actual execution would require
94+ # the full implementation which might involve async/threading
95+ self .assertEqual (len (self .pipeline .tasks ), 1 )
96+ task = self .pipeline .tasks [task_id ]
97+ self .assertEqual (task .task_id , task_id )
98+ self .assertEqual (task .status , TaskStatus .PENDING )
99+
100+ def test_variable_substitution_pattern (self ):
101+ # Test that the pipeline can handle variable patterns
102+ prompt_with_vars = "Hello {name}, how are you?"
103+ task_id = self .pipeline .add_task ("task1" , self .mock_app , "generate_text" , prompt_with_vars )
104+
105+ task = self .pipeline .tasks [task_id ]
106+ self .assertIn ("{name}" , task .prompt )
107+
108+ def test_pipeline_task_attributes (self ):
109+ task_id = self .pipeline .add_task (
110+ "task1" ,
111+ self .mock_app ,
112+ "generate_text" ,
113+ "Test" ,
114+ dependencies = ["dep1" ],
115+ condition = lambda x : True ,
116+ retry_count = 3 ,
117+ timeout = 30
118+ )
119+
120+ task = self .pipeline .tasks [task_id ]
121+ self .assertEqual (task .task_type , "generate_text" )
122+ self .assertEqual (task .dependencies , ["dep1" ])
123+ self .assertIsNotNone (task .condition )
124+ self .assertEqual (task .retry_count , 3 )
125+ self .assertEqual (task .timeout , 30 )
126+
127+
128+ if __name__ == "__main__" :
129+ unittest .main ()
0 commit comments