1
1
# pylint: disable=redefined-outer-name
2
+ from random import Random
3
+ from uuid import UUID
4
+
5
+ import pytest
6
+ import pytest_cases
7
+
2
8
from 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
4
10
from use_case_executor .adapters .flow_validation .flow import Flow
5
11
from use_case_executor .domain .flow .edge_data .edge_type import EdgeType
6
12
from use_case_executor .domain .flow .node_data .answer_data .answer_data import ButtonType
7
13
8
14
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
11
46
reference_flow ,
12
47
start_node_uuid ,
13
48
button_uuid ,
@@ -33,16 +68,20 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
33
68
edge_to_second_user_input_uuid ,
34
69
edge_to_create_ticket_uuid ,
35
70
edge_to_empty_node_uuid ,
71
+ flow_dict ,
72
+ convert_into_domain_object ,
36
73
):
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
+
38
78
assert flow .schema_version == "v0.2"
39
79
assert flow .start_node_uuid == start_node_uuid
40
80
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 }
44
83
helpers .check_answer_node (
45
- node = nodes [ 0 ],
84
+ node = nodes_per_uuid [ UUID ( reference_flow [ " nodes" ][ 0 ][ "uuid" ]) ],
46
85
node_uuid = start_node_uuid ,
47
86
bubbles = reference_flow ["nodes" ][0 ]["data" ]["bubbles" ],
48
87
buttons = [
@@ -66,17 +105,17 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
66
105
is_deflection = True ,
67
106
)
68
107
helpers .check_go_to_flow_node (
69
- node = nodes [ 1 ],
108
+ node = nodes_per_uuid [ UUID ( reference_flow [ " nodes" ][ 1 ][ "uuid" ]) ],
70
109
node_uuid = go_to_flow_uuid ,
71
110
target_use_case_uuid = target_use_case_uuid ,
72
111
)
73
112
helpers .check_go_to_advanced_node (
74
- node = nodes [ 2 ],
113
+ node = nodes_per_uuid [ UUID ( reference_flow [ " nodes" ][ 2 ][ "uuid" ]) ],
75
114
node_uuid = go_to_advanced_uuid ,
76
115
target_intent_record_id = target_intent_record_id ,
77
116
)
78
117
helpers .check_answer_node (
79
- node = nodes [ 3 ],
118
+ node = nodes_per_uuid [ UUID ( reference_flow [ " nodes" ][ 3 ][ "uuid" ]) ],
80
119
node_uuid = second_answer_node_uuid ,
81
120
bubbles = reference_flow ["nodes" ][3 ]["data" ]["bubbles" ],
82
121
buttons = [],
@@ -86,23 +125,23 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
86
125
is_deflection = False ,
87
126
)
88
127
helpers .check_agent_handover_node (
89
- node = nodes [ 4 ],
128
+ node = nodes_per_uuid [ UUID ( reference_flow [ " nodes" ][ 4 ][ "uuid" ]) ],
90
129
node_uuid = agent_handover_uuid ,
91
130
agent_channel_uuid = agent_handover_channel_uuid ,
92
131
handover_success_message_translations = {"en_US" : "Handover success text" },
93
132
)
94
133
helpers .check_user_input_node (
95
- node = nodes [ 5 ],
134
+ node = nodes_per_uuid [ UUID ( reference_flow [ " nodes" ][ 5 ][ "uuid" ]) ],
96
135
node_uuid = user_input_uuid ,
97
136
node_data_dict = reference_flow ["nodes" ][5 ]["data" ],
98
137
)
99
138
helpers .check_user_input_node (
100
- node = nodes [ 6 ],
139
+ node = nodes_per_uuid [ UUID ( reference_flow [ " nodes" ][ 6 ][ "uuid" ]) ],
101
140
node_uuid = second_user_input_uuid ,
102
141
node_data_dict = reference_flow ["nodes" ][6 ]["data" ],
103
142
)
104
143
helpers .check_answer_node (
105
- node = nodes [ 7 ],
144
+ node = nodes_per_uuid [ UUID ( reference_flow [ " nodes" ][ 7 ][ "uuid" ]) ],
106
145
node_uuid = third_answer_node_uuid ,
107
146
bubbles = reference_flow ["nodes" ][7 ]["data" ]["bubbles" ],
108
147
buttons = [],
@@ -111,16 +150,20 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
111
150
has_go_back_quick_reply = True ,
112
151
is_deflection = False ,
113
152
)
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
+ )
115
157
helpers .check_create_ticket_node (
116
- node = nodes [ 9 ],
158
+ node = nodes_per_uuid [ UUID ( reference_flow [ " nodes" ][ 9 ][ "uuid" ]) ],
117
159
node_uuid = create_ticket_node_uuid ,
118
160
node_data_dict = reference_flow ["nodes" ][9 ]["data" ],
119
161
)
120
162
121
163
assert len (flow .edges ) == 9
164
+ edges_per_uuid = {edge .data .uuid : edge for edge in flow .edges }
122
165
helpers .check_quick_reply_edge (
123
- edge = flow . edges [ 0 ],
166
+ edge = edges_per_uuid [ UUID ( reference_flow [ " edges" ][ 0 ][ "data" ][ "uuid" ]) ],
124
167
source = start_node_uuid ,
125
168
target = go_to_flow_uuid ,
126
169
data = {
@@ -133,7 +176,7 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
133
176
},
134
177
)
135
178
helpers .check_quick_reply_edge (
136
- edge = flow . edges [ 1 ],
179
+ edge = edges_per_uuid [ UUID ( reference_flow [ " edges" ][ 1 ][ "data" ][ "uuid" ]) ],
137
180
source = start_node_uuid ,
138
181
target = go_to_advanced_uuid ,
139
182
data = {
@@ -146,7 +189,7 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
146
189
},
147
190
)
148
191
helpers .check_quick_reply_edge (
149
- edge = flow . edges [ 2 ],
192
+ edge = edges_per_uuid [ UUID ( reference_flow [ " edges" ][ 2 ][ "data" ][ "uuid" ]) ],
150
193
source = start_node_uuid ,
151
194
target = second_answer_node_uuid ,
152
195
data = {
@@ -159,7 +202,7 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
159
202
},
160
203
)
161
204
helpers .check_quick_reply_edge (
162
- edge = flow . edges [ 3 ],
205
+ edge = edges_per_uuid [ UUID ( reference_flow [ " edges" ][ 3 ][ "data" ][ "uuid" ]) ],
163
206
source = start_node_uuid ,
164
207
target = agent_handover_uuid ,
165
208
data = {
@@ -170,7 +213,7 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
170
213
},
171
214
)
172
215
helpers .check_quick_reply_edge (
173
- edge = flow . edges [ 4 ],
216
+ edge = edges_per_uuid [ UUID ( reference_flow [ " edges" ][ 4 ][ "data" ][ "uuid" ]) ],
174
217
source = start_node_uuid ,
175
218
target = user_input_uuid ,
176
219
data = {
@@ -181,7 +224,7 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
181
224
},
182
225
)
183
226
helpers .check_quick_reply_edge (
184
- edge = flow . edges [ 5 ],
227
+ edge = edges_per_uuid [ UUID ( reference_flow [ " edges" ][ 5 ][ "data" ][ "uuid" ]) ],
185
228
source = start_node_uuid ,
186
229
target = second_user_input_uuid ,
187
230
data = {
@@ -194,7 +237,7 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
194
237
},
195
238
)
196
239
helpers .check_quick_reply_edge (
197
- edge = flow . edges [ 6 ],
240
+ edge = edges_per_uuid [ UUID ( reference_flow [ " edges" ][ 6 ][ "data" ][ "uuid" ]) ],
198
241
source = start_node_uuid ,
199
242
target = empty_node_uuid ,
200
243
data = {
@@ -205,7 +248,7 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
205
248
},
206
249
)
207
250
helpers .check_quick_reply_edge (
208
- edge = flow . edges [ 7 ],
251
+ edge = edges_per_uuid [ UUID ( reference_flow [ " edges" ][ 7 ][ "data" ][ "uuid" ]) ],
209
252
source = start_node_uuid ,
210
253
target = create_ticket_node_uuid ,
211
254
data = {
@@ -216,7 +259,7 @@ def test_working_flow_is_loaded( # pylint: disable=too-many-locals
216
259
},
217
260
)
218
261
helpers .check_direct_link_edge (
219
- flow . edges [ 8 ],
262
+ edge = edges_per_uuid [ UUID ( reference_flow [ " edges" ][ 8 ][ "data" ][ "uuid" ]) ],
220
263
source = user_input_uuid ,
221
264
target = third_answer_node_uuid ,
222
265
data = {"type" : EdgeType .direct_link , "uuid" : edge_to_third_answer_uuid },
0 commit comments