1- import unittest
1+ import json
2+ import re
3+
4+ import pytest
5+
26from conductor .client .http .models .action import Action
37from conductor .client .http .models .start_workflow import StartWorkflow
48from conductor .client .http .models .task_details import TaskDetails
59from conductor .client .http .models .terminate_workflow import TerminateWorkflow
6- from conductor .client .http .models .update_workflow_variables import UpdateWorkflowVariables
10+ from conductor .client .http .models .update_workflow_variables import (
11+ UpdateWorkflowVariables ,
12+ )
713from tests .serdesertest .util .serdeser_json_resolver_utility import JsonTemplateResolver
8- import json
9- import re
10-
11-
12- class TestActionSerDes (unittest .TestCase ):
13- def setUp (self ):
14- # Load the JSON template
15- self .server_json_str = JsonTemplateResolver .get_json_string ("EventHandler.Action" )
16- self .server_json = json .loads (self .server_json_str )
17-
18- def _camel_to_snake (self , name ):
19- """Convert camelCase to snake_case"""
20- # Insert underscore before uppercase letters and convert to lowercase
21- s1 = re .sub ('(.)([A-Z][a-z]+)' , r'\1_\2' , name )
22- return re .sub ('([a-z0-9])([A-Z])' , r'\1_\2' , s1 ).lower ()
23-
24- def _create_model_object (self , model_class , json_data ):
25- """Generic method to create model objects with proper camelCase to snake_case conversion"""
26- if not json_data :
27- return None
28-
29- # Create an instance of the model class
30- obj = model_class ()
31-
32- # Iterate through the JSON data and set attributes on the model object
33- for key , value in json_data .items ():
34- # Convert camelCase to snake_case
35- snake_key = self ._camel_to_snake (key )
36-
37- # Try to set the attribute if it exists on the model
38- if hasattr (obj , snake_key ):
39- setattr (obj , snake_key , value )
40-
41- return obj
42-
43- def test_action_serdes (self ):
44- # 1. Test deserialization of server JSON to SDK model
45- action_obj = Action (
46- action = self .server_json .get ("action" ),
47- start_workflow = self ._create_model_object (StartWorkflow , self .server_json .get ("start_workflow" )),
48- complete_task = self ._create_model_object (TaskDetails , self .server_json .get ("complete_task" )),
49- fail_task = self ._create_model_object (TaskDetails , self .server_json .get ("fail_task" )),
50- expand_inline_json = self .server_json .get ("expandInlineJSON" ),
51- terminate_workflow = self ._create_model_object (TerminateWorkflow , self .server_json .get ("terminate_workflow" )),
52- update_workflow_variables = self ._create_model_object (UpdateWorkflowVariables ,
53- self .server_json .get ("update_workflow_variables" ))
54- )
55-
56- # 2. Verify all fields are properly populated
57- self .assertEqual (self .server_json .get ("action" ), action_obj .action )
58-
59- # Check if start_workflow exists in the JSON
60- if "start_workflow" in self .server_json :
61- self .assertIsNotNone (action_obj .start_workflow )
62-
63- # Check if complete_task exists in the JSON
64- if "complete_task" in self .server_json :
65- self .assertIsNotNone (action_obj .complete_task )
66-
67- # Check if fail_task exists in the JSON
68- if "fail_task" in self .server_json :
69- self .assertIsNotNone (action_obj .fail_task )
70-
71- # Check if expandInlineJSON exists in the JSON
72- if "expandInlineJSON" in self .server_json :
73- self .assertEqual (self .server_json .get ("expandInlineJSON" ), action_obj .expand_inline_json )
74-
75- # Check if terminate_workflow exists in the JSON
76- if "terminate_workflow" in self .server_json :
77- self .assertIsNotNone (action_obj .terminate_workflow )
78-
79- # Check if update_workflow_variables exists in the JSON
80- if "update_workflow_variables" in self .server_json :
81- self .assertIsNotNone (action_obj .update_workflow_variables )
82-
83- # 3. Verify the action enum value is valid
84- allowed_values = ["start_workflow" , "complete_task" , "fail_task" , "terminate_workflow" ,
85- "update_workflow_variables" ]
86- self .assertIn (action_obj .action , allowed_values )
87-
88- # 4. Test serialization back to JSON
89- result_json = action_obj .to_dict ()
90-
91- # 5. Verify the result JSON has the same keys and values as the original
92- for key in self .server_json :
93- if key == "expandInlineJSON" :
94- # Handle camelCase to snake_case conversion
95- self .assertEqual (self .server_json [key ], result_json ["expand_inline_json" ])
96- elif key in ["terminate_workflow" , "start_workflow" , "complete_task" , "fail_task" ,
97- "update_workflow_variables" ]:
98- # For nested objects, verify they exist in result_json
99- if self .server_json [key ] is not None :
100- self .assertIsNotNone (result_json [key ])
101-
102- # For terminate_workflow, check specific camelCase fields
103- if key == "terminate_workflow" and key in result_json :
104- term_json = self .server_json [key ]
105- result_term = result_json [key ]
106-
107- # Maps the expected field names from server JSON to the result JSON
108- if "workflowId" in term_json and "workflowId" in result_term :
109- self .assertEqual (term_json ["workflowId" ], result_term ["workflowId" ])
110- if "terminationReason" in term_json and "terminationReason" in result_term :
111- self .assertEqual (term_json ["terminationReason" ], result_term ["terminationReason" ])
112-
113- # For update_workflow_variables, check specific camelCase fields
114- if key == "update_workflow_variables" and key in result_json :
115- update_json = self .server_json [key ]
116- result_update = result_json [key ]
117-
118- # Maps the expected field names from server JSON to the result JSON
119- if "workflowId" in update_json and "workflowId" in result_update :
120- self .assertEqual (update_json ["workflowId" ], result_update ["workflowId" ])
121- if "variables" in update_json and "variables" in result_update :
122- self .assertEqual (update_json ["variables" ], result_update ["variables" ])
123- if "appendArray" in update_json and "appendArray" in result_update :
124- self .assertEqual (update_json ["appendArray" ], result_update ["appendArray" ])
125- elif key in result_json :
126- # Direct comparison for keys that match
127- self .assertEqual (self .server_json [key ], result_json [key ])
12814
12915
130- if __name__ == '__main__' :
131- unittest .main ()
16+ def camel_to_snake (name ):
17+ s1 = re .sub ("(.)([A-Z][a-z]+)" , r"\1_\2" , name )
18+ return re .sub ("([a-z0-9])([A-Z])" , r"\1_\2" , s1 ).lower ()
19+
20+
21+ def create_model_object (model_class , json_data ):
22+ if not json_data :
23+ return None
24+ obj = model_class ()
25+ for key , value in json_data .items ():
26+ snake_key = camel_to_snake (key )
27+ if hasattr (obj , snake_key ):
28+ setattr (obj , snake_key , value )
29+ return obj
30+
31+
32+ @pytest .fixture
33+ def server_json ():
34+ return json .loads (JsonTemplateResolver .get_json_string ("EventHandler.Action" ))
35+
36+
37+ def test_action_serdes (server_json ):
38+ action_obj = Action (
39+ action = server_json .get ("action" ),
40+ start_workflow = create_model_object (
41+ StartWorkflow , server_json .get ("start_workflow" )
42+ ),
43+ complete_task = create_model_object (
44+ TaskDetails , server_json .get ("complete_task" )
45+ ),
46+ fail_task = create_model_object (TaskDetails , server_json .get ("fail_task" )),
47+ expand_inline_json = server_json .get ("expandInlineJSON" ),
48+ terminate_workflow = create_model_object (
49+ TerminateWorkflow , server_json .get ("terminate_workflow" )
50+ ),
51+ update_workflow_variables = create_model_object (
52+ UpdateWorkflowVariables , server_json .get ("update_workflow_variables" )
53+ ),
54+ )
55+ assert server_json .get ("action" ) == action_obj .action
56+ if "start_workflow" in server_json :
57+ assert action_obj .start_workflow is not None
58+ if "complete_task" in server_json :
59+ assert action_obj .complete_task is not None
60+ if "fail_task" in server_json :
61+ assert action_obj .fail_task is not None
62+ if "expandInlineJSON" in server_json :
63+ assert server_json .get ("expandInlineJSON" ) == action_obj .expand_inline_json
64+ if "terminate_workflow" in server_json :
65+ assert action_obj .terminate_workflow is not None
66+ if "update_workflow_variables" in server_json :
67+ assert action_obj .update_workflow_variables is not None
68+ allowed_values = [
69+ "start_workflow" ,
70+ "complete_task" ,
71+ "fail_task" ,
72+ "terminate_workflow" ,
73+ "update_workflow_variables" ,
74+ ]
75+ assert action_obj .action in allowed_values
76+ result_json = action_obj .to_dict ()
77+ for key in server_json :
78+ if key == "expandInlineJSON" :
79+ assert server_json [key ] == result_json ["expand_inline_json" ]
80+ elif key in [
81+ "terminate_workflow" ,
82+ "start_workflow" ,
83+ "complete_task" ,
84+ "fail_task" ,
85+ "update_workflow_variables" ,
86+ ]:
87+ if server_json [key ] is not None :
88+ assert result_json [key ] is not None
89+ if key == "terminate_workflow" and key in result_json :
90+ term_json = server_json [key ]
91+ result_term = result_json [key ]
92+ if "workflowId" in term_json and "workflowId" in result_term :
93+ assert term_json ["workflowId" ] == result_term ["workflowId" ]
94+ if (
95+ "terminationReason" in term_json
96+ and "terminationReason" in result_term
97+ ):
98+ assert (
99+ term_json ["terminationReason" ]
100+ == result_term ["terminationReason" ]
101+ )
102+ if key == "update_workflow_variables" and key in result_json :
103+ update_json = server_json [key ]
104+ result_update = result_json [key ]
105+ if "workflowId" in update_json and "workflowId" in result_update :
106+ assert update_json ["workflowId" ] == result_update ["workflowId" ]
107+ if "variables" in update_json and "variables" in result_update :
108+ assert update_json ["variables" ] == result_update ["variables" ]
109+ if "appendArray" in update_json and "appendArray" in result_update :
110+ assert (
111+ update_json ["appendArray" ] == result_update ["appendArray" ]
112+ )
113+ elif key in result_json :
114+ assert server_json [key ] == result_json [key ]
0 commit comments