11# pylint: disable=redefined-outer-name
2+ from random import Random
3+ from uuid import UUID
4+
5+ import pytest
6+ import pytest_cases
7+
28from tests .adapters .flow_validation import helpers
3- from tests .fixtures .valid_flow_json import * # noqa: F401, F403, pylint: disable=wildcard-import,unused-wildcard-import
9+ from tests .fixtures .valid_flow_json import * # noqa: F403, pylint: disable=wildcard-import,unused-wildcard-import
410from use_case_executor .adapters .flow_validation .flow import Flow
511from use_case_executor .domain .flow .edge_data .edge_type import EdgeType
612from use_case_executor .domain .flow .node_data .answer_data .answer_data import ButtonType
713
814
9- def test_working_flow_is_loaded ( # pylint: disable=too-many-locals
10- * ,
15+ def _shuffled (objects : list , random_instance : Random ) -> list :
16+ objects = list (objects )
17+ random_instance .shuffle (objects )
18+ return objects
19+
20+
21+ @pytest .fixture
22+ def shuffled_reference_flow (reference_flow : dict ) -> dict :
23+ random_instance = Random (123 )
24+ return {
25+ ** reference_flow ,
26+ "nodes" : _shuffled (reference_flow ["nodes" ], random_instance = random_instance ),
27+ "edges" : _shuffled (reference_flow ["edges" ], random_instance = random_instance ),
28+ }
29+
30+
31+ @pytest .fixture
32+ def inverted_reference_flow (reference_flow : dict ) -> dict :
33+ return {
34+ ** reference_flow ,
35+ "nodes" : reference_flow ["nodes" ][::- 1 ],
36+ "edges" : reference_flow ["edges" ][::- 1 ],
37+ }
38+
39+
40+ @pytest_cases .parametrize (
41+ "flow_dict" ,
42+ [reference_flow , shuffled_reference_flow , inverted_reference_flow ], # noqa: F405
43+ )
44+ @pytest .mark .parametrize ("convert_into_domain_object" , [False , True ])
45+ def test_working_flow_is_loaded ( # pylint: disable=too-many-locals,too-many-arguments
1146 reference_flow ,
1247 start_node_uuid ,
1348 button_uuid ,
@@ -33,16 +68,20 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
3368 edge_to_second_user_input_uuid ,
3469 edge_to_create_ticket_uuid ,
3570 edge_to_empty_node_uuid ,
71+ flow_dict ,
72+ convert_into_domain_object ,
3673):
37- flow = Flow .load_flow (reference_flow )
74+ flow = Flow .load_flow (flow_dict )
75+ if convert_into_domain_object :
76+ flow = Flow .from_domain_object (domain_flow = flow .to_domain_object ())
77+
3878 assert flow .schema_version == "v0.2"
3979 assert flow .start_node_uuid == start_node_uuid
4080
41- nodes = flow .nodes
42- assert len (nodes ) == 10
43-
81+ assert len (flow .nodes ) == 10
82+ nodes_per_uuid = {node .uuid : node for node in flow .nodes }
4483 helpers .check_answer_node (
45- node = nodes [ 0 ],
84+ node = nodes_per_uuid [ UUID ( reference_flow [ " nodes" ][ 0 ][ "uuid" ]) ],
4685 node_uuid = start_node_uuid ,
4786 bubbles = reference_flow ["nodes" ][0 ]["data" ]["bubbles" ],
4887 buttons = [
@@ -66,17 +105,17 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
66105 is_deflection = True ,
67106 )
68107 helpers .check_go_to_flow_node (
69- node = nodes [ 1 ],
108+ node = nodes_per_uuid [ UUID ( reference_flow [ " nodes" ][ 1 ][ "uuid" ]) ],
70109 node_uuid = go_to_flow_uuid ,
71110 target_use_case_uuid = target_use_case_uuid ,
72111 )
73112 helpers .check_go_to_advanced_node (
74- node = nodes [ 2 ],
113+ node = nodes_per_uuid [ UUID ( reference_flow [ " nodes" ][ 2 ][ "uuid" ]) ],
75114 node_uuid = go_to_advanced_uuid ,
76115 target_intent_record_id = target_intent_record_id ,
77116 )
78117 helpers .check_answer_node (
79- node = nodes [ 3 ],
118+ node = nodes_per_uuid [ UUID ( reference_flow [ " nodes" ][ 3 ][ "uuid" ]) ],
80119 node_uuid = second_answer_node_uuid ,
81120 bubbles = reference_flow ["nodes" ][3 ]["data" ]["bubbles" ],
82121 buttons = [],
@@ -86,23 +125,23 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
86125 is_deflection = False ,
87126 )
88127 helpers .check_agent_handover_node (
89- node = nodes [ 4 ],
128+ node = nodes_per_uuid [ UUID ( reference_flow [ " nodes" ][ 4 ][ "uuid" ]) ],
90129 node_uuid = agent_handover_uuid ,
91130 agent_channel_uuid = agent_handover_channel_uuid ,
92131 handover_success_message_translations = {"en_US" : "Handover success text" },
93132 )
94133 helpers .check_user_input_node (
95- node = nodes [ 5 ],
134+ node = nodes_per_uuid [ UUID ( reference_flow [ " nodes" ][ 5 ][ "uuid" ]) ],
96135 node_uuid = user_input_uuid ,
97136 node_data_dict = reference_flow ["nodes" ][5 ]["data" ],
98137 )
99138 helpers .check_user_input_node (
100- node = nodes [ 6 ],
139+ node = nodes_per_uuid [ UUID ( reference_flow [ " nodes" ][ 6 ][ "uuid" ]) ],
101140 node_uuid = second_user_input_uuid ,
102141 node_data_dict = reference_flow ["nodes" ][6 ]["data" ],
103142 )
104143 helpers .check_answer_node (
105- node = nodes [ 7 ],
144+ node = nodes_per_uuid [ UUID ( reference_flow [ " nodes" ][ 7 ][ "uuid" ]) ],
106145 node_uuid = third_answer_node_uuid ,
107146 bubbles = reference_flow ["nodes" ][7 ]["data" ]["bubbles" ],
108147 buttons = [],
@@ -111,16 +150,20 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
111150 has_go_back_quick_reply = True ,
112151 is_deflection = False ,
113152 )
114- helpers .check_empty_node (node = nodes [8 ], node_uuid = empty_node_uuid )
153+ helpers .check_empty_node (
154+ node = nodes_per_uuid [UUID (reference_flow ["nodes" ][8 ]["uuid" ])],
155+ node_uuid = empty_node_uuid ,
156+ )
115157 helpers .check_create_ticket_node (
116- node = nodes [ 9 ],
158+ node = nodes_per_uuid [ UUID ( reference_flow [ " nodes" ][ 9 ][ "uuid" ]) ],
117159 node_uuid = create_ticket_node_uuid ,
118160 node_data_dict = reference_flow ["nodes" ][9 ]["data" ],
119161 )
120162
121163 assert len (flow .edges ) == 9
164+ edges_per_uuid = {edge .data .uuid : edge for edge in flow .edges }
122165 helpers .check_quick_reply_edge (
123- edge = flow . edges [ 0 ],
166+ edge = edges_per_uuid [ UUID ( reference_flow [ " edges" ][ 0 ][ "data" ][ "uuid" ]) ],
124167 source = start_node_uuid ,
125168 target = go_to_flow_uuid ,
126169 data = {
@@ -133,7 +176,7 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
133176 },
134177 )
135178 helpers .check_quick_reply_edge (
136- edge = flow . edges [ 1 ],
179+ edge = edges_per_uuid [ UUID ( reference_flow [ " edges" ][ 1 ][ "data" ][ "uuid" ]) ],
137180 source = start_node_uuid ,
138181 target = go_to_advanced_uuid ,
139182 data = {
@@ -146,7 +189,7 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
146189 },
147190 )
148191 helpers .check_quick_reply_edge (
149- edge = flow . edges [ 2 ],
192+ edge = edges_per_uuid [ UUID ( reference_flow [ " edges" ][ 2 ][ "data" ][ "uuid" ]) ],
150193 source = start_node_uuid ,
151194 target = second_answer_node_uuid ,
152195 data = {
@@ -159,7 +202,7 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
159202 },
160203 )
161204 helpers .check_quick_reply_edge (
162- edge = flow . edges [ 3 ],
205+ edge = edges_per_uuid [ UUID ( reference_flow [ " edges" ][ 3 ][ "data" ][ "uuid" ]) ],
163206 source = start_node_uuid ,
164207 target = agent_handover_uuid ,
165208 data = {
@@ -170,7 +213,7 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
170213 },
171214 )
172215 helpers .check_quick_reply_edge (
173- edge = flow . edges [ 4 ],
216+ edge = edges_per_uuid [ UUID ( reference_flow [ " edges" ][ 4 ][ "data" ][ "uuid" ]) ],
174217 source = start_node_uuid ,
175218 target = user_input_uuid ,
176219 data = {
@@ -181,7 +224,7 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
181224 },
182225 )
183226 helpers .check_quick_reply_edge (
184- edge = flow . edges [ 5 ],
227+ edge = edges_per_uuid [ UUID ( reference_flow [ " edges" ][ 5 ][ "data" ][ "uuid" ]) ],
185228 source = start_node_uuid ,
186229 target = second_user_input_uuid ,
187230 data = {
@@ -194,7 +237,7 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
194237 },
195238 )
196239 helpers .check_quick_reply_edge (
197- edge = flow . edges [ 6 ],
240+ edge = edges_per_uuid [ UUID ( reference_flow [ " edges" ][ 6 ][ "data" ][ "uuid" ]) ],
198241 source = start_node_uuid ,
199242 target = empty_node_uuid ,
200243 data = {
@@ -205,7 +248,7 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
205248 },
206249 )
207250 helpers .check_quick_reply_edge (
208- edge = flow . edges [ 7 ],
251+ edge = edges_per_uuid [ UUID ( reference_flow [ " edges" ][ 7 ][ "data" ][ "uuid" ]) ],
209252 source = start_node_uuid ,
210253 target = create_ticket_node_uuid ,
211254 data = {
@@ -216,7 +259,7 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
216259 },
217260 )
218261 helpers .check_direct_link_edge (
219- flow . edges [ 8 ],
262+ edge = edges_per_uuid [ UUID ( reference_flow [ " edges" ][ 8 ][ "data" ][ "uuid" ]) ],
220263 source = user_input_uuid ,
221264 target = third_answer_node_uuid ,
222265 data = {"type" : EdgeType .direct_link , "uuid" : edge_to_third_answer_uuid },
0 commit comments