Skip to content

Commit 40d4466

Browse files
committed
( #275 ) Allow context Use in WorkflowRehearsal
This addresses the issue outlined in #275. The shape of the context I created for the unit tests is `st2` similar to the runtime context provided by the `st2` `orquesta` runner.
1 parent 5ba1467 commit 40d4466

6 files changed

Lines changed: 143 additions & 2 deletions

File tree

orquesta/rehearsing.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ class WorkflowTestCase(native_v1_specs.Spec, WorkflowTestCaseMixin):
186186
"type": "object",
187187
"properties": {
188188
"workflow": spec_types.NONEMPTY_STRING,
189+
"context": {"type": "object", "default": {}},
189190
"inputs": {"type": "object", "default": {}},
190191
"expected_inspection_errors": MockInspectionErrors,
191192
"expected_routes": {"type": "array", "items": {"type": "array"}, "default": [[]]},
@@ -316,7 +317,7 @@ def runTest(self):
316317
pass
317318

318319
def assert_spec_inspection(self):
319-
self.inspection_errors = self.wf_spec.inspect()
320+
self.inspection_errors = self.wf_spec.inspect(app_ctx=self.session.context)
320321
self.assertDictEqual(self.inspection_errors, self.session.expected_inspection_errors)
321322

322323
def assert_conducting_sequence(self):
@@ -336,7 +337,9 @@ def assert_conducting_sequence(self):
336337

337338
if not self.rerun:
338339
# Instantiate a workflow conductor to check conducting sequences.
339-
self.conductor = conducting.WorkflowConductor(self.wf_spec, inputs=self.session.inputs)
340+
self.conductor = conducting.WorkflowConductor(
341+
self.wf_spec, inputs=self.session.inputs, context=self.session.context
342+
)
340343
self.conductor.request_workflow_status(statuses.RUNNING)
341344
else:
342345
# Request workflow rerun and assert workflow status is running.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
---
2+
workflow: workflows/sequential_w_context.yaml
3+
inputs:
4+
name: Stanley
5+
context:
6+
st2:
7+
api_url: http://localhost
8+
token: faketoken
9+
expected_task_sequence:
10+
- task1
11+
- task2
12+
- task3
13+
- continue
14+
mock_action_executions:
15+
- task_id: task1
16+
result: Stanley
17+
- task_id: task2
18+
result: All your base are belong to us!
19+
- task_id: task3
20+
result: Stanley, All your base are belong to us!
21+
expected_output:
22+
greeting: Stanley, All your base are belong to us!
23+
api_url: http://localhost
24+
token: faketoken
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
version: 1.0
2+
3+
description: A basic sequential workflow.
4+
5+
input:
6+
- name
7+
8+
vars:
9+
- greeting: null
10+
11+
output:
12+
- greeting: <% ctx().greeting %>
13+
- api_url: <% ctx().st2.api_url %>
14+
- token: <% ctx().st2.token %>
15+
16+
tasks:
17+
task1:
18+
action: core.echo message=<% ctx().name %>
19+
next:
20+
- when: <% succeeded() %>
21+
publish: greeting=<% result() %>
22+
do: task2
23+
task2:
24+
action: core.echo
25+
input:
26+
message: "All your base are belong to us!"
27+
next:
28+
- when: <% succeeded() %>
29+
publish:
30+
- greeting: <% ctx("greeting") %>, <% result() %>
31+
do:
32+
- task3
33+
task3:
34+
action: core.echo message=<% ctx('greeting') %>
35+
next:
36+
- when: <% succeeded() %>
37+
publish: greeting=<% result() %>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
version: 1.0
2+
3+
description: A basic sequential workflow.
4+
5+
input:
6+
- name
7+
8+
vars:
9+
- greeting: null
10+
11+
output:
12+
- greeting: <% ctx().greeting %>
13+
- api_url: <% ctx().st2.api_url %>
14+
- token: <% ctx().st2.token %>
15+
16+
tasks:
17+
task1:
18+
action: core.echo message=<% ctx().name %>
19+
next:
20+
- when: <% succeeded() %>
21+
publish: greeting=<% result() %>
22+
do: task2
23+
task2:
24+
action: core.echo
25+
input:
26+
message: "All your base are belong to us!"
27+
next:
28+
- when: <% succeeded() %>
29+
publish:
30+
- greeting: <% ctx("greeting") %>, <% result() %>
31+
do:
32+
- task3
33+
task3:
34+
action: core.echo message=<% ctx('greeting') %>
35+
next:
36+
- when: <% succeeded() %>
37+
publish: greeting=<% result() %>

orquesta/tests/unit/commands/test_rehearse_command.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,3 +148,18 @@ def test_rehearse_multiple(self):
148148
"There are errors processing test specs. Please review details above.",
149149
rehearsal.rehearse,
150150
)
151+
152+
@mock.patch.object(
153+
argparse.ArgumentParser,
154+
"parse_args",
155+
mock.MagicMock(
156+
return_value=argparse.Namespace(
157+
base_path=fixture_loader.get_rehearsal_fixtures_base_path(),
158+
test_spec="tests/sequential_success_w_context.yaml",
159+
test_spec_dir=None,
160+
debug=False,
161+
)
162+
),
163+
)
164+
def test_rehearse_success_w_context(self):
165+
rehearsal.rehearse()

orquesta/tests/unit/specs/native/test_workflow_rehearsal_spec.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,3 +599,28 @@ def test_init_test_spec_bad_result_path(self):
599599
rehearsing.WorkflowRehearsal,
600600
test_case,
601601
)
602+
603+
def test_load_test_spec_dict_with_context(self):
604+
test_spec = {
605+
"workflow": self.get_wf_file_path("sequential_w_context"),
606+
"context": {"st2": {"api_url": "http://localhost", "token": "faketoken"}},
607+
"expected_task_sequence": ["task1", "task2", "task3", "continue"],
608+
"mock_action_executions": [{"task_id": "task1"}, {"task_id": "task2"}],
609+
}
610+
611+
rehearsal = rehearsing.load_test_spec(test_spec)
612+
613+
self.assertEqual(len(rehearsal.session.mock_action_executions), 2)
614+
self.assertEqual(rehearsal.session.mock_action_executions[0].task_id, "task1")
615+
self.assertEqual(rehearsal.session.mock_action_executions[1].task_id, "task2")
616+
self.assertEqual(rehearsal.session.context, test_spec["context"])
617+
618+
for ac_ex in rehearsal.session.mock_action_executions:
619+
self.assertIsInstance(ac_ex, rehearsing.MockActionExecution)
620+
self.assertEqual(ac_ex.route, 0)
621+
self.assertIsNone(ac_ex.seq_id)
622+
self.assertIsNone(ac_ex.item_id)
623+
self.assertEqual(ac_ex.iter_id, 0)
624+
self.assertEqual(ac_ex.num_iter, 1)
625+
self.assertEqual(ac_ex.status, statuses.SUCCEEDED)
626+
self.assertIsNone(ac_ex.result)

0 commit comments

Comments
 (0)