-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_workflow.py
More file actions
117 lines (102 loc) · 5.3 KB
/
Copy pathtest_workflow.py
File metadata and controls
117 lines (102 loc) · 5.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
"""Exhaustive tests for WorkflowService."""
from __future__ import annotations
from underwrite.__bus__ import LocalBus
from underwrite.__events__ import Event, EventType
from underwrite.services.workflow.service import WorkflowService
class TestWorkflowService:
def test_start_creates_workflow(self) -> None:
svc = WorkflowService(service_id="workflow")
svc.handle(
Event(event_type="workflow.start", source="test", payload={"type": "origination", "entity_id": "app_1"})
)
rec = svc.store.get("workflow:app_1")
assert rec is not None
assert rec["type"] == "origination"
assert rec["current_stage"] == "created"
assert rec["status"] == "active"
def test_start_emits_workflow_started(self) -> None:
bus = LocalBus()
received: list = []
bus.subscribe(EventType.WORKFLOW_STARTED, lambda e: received.append(e))
svc = WorkflowService(service_id="workflow", bus=bus)
bus.start()
svc.handle(
Event(event_type="workflow.start", source="test", payload={"type": "recovery", "entity_id": "loan_1"})
)
assert len(received) == 1
assert received[0].payload["workflow_type"] == "recovery"
def test_rejects_empty_type(self) -> None:
svc = WorkflowService(service_id="workflow")
svc.handle(Event(event_type="workflow.start", source="test", payload={"type": "", "entity_id": "x"}))
assert len(svc.store.keys("workflow:")) == 0
def test_rejects_empty_entity_id(self) -> None:
svc = WorkflowService(service_id="workflow")
svc.handle(Event(event_type="workflow.start", source="test", payload={"type": "origination", "entity_id": ""}))
assert len(svc.store.keys("workflow:")) == 0
def test_advance_moves_to_next_stage(self) -> None:
svc = WorkflowService(service_id="workflow")
svc.handle(
Event(event_type="workflow.start", source="test", payload={"type": "origination", "entity_id": "app_2"})
)
svc.handle(Event(event_type="workflow.advance", source="test", payload={"entity_id": "app_2"}))
rec = svc.store.get("workflow:app_2")
assert rec is not None
assert rec["current_stage"] == "kyc_pending"
assert rec["stage_index"] == 1
def test_advance_completes_workflow(self) -> None:
svc = WorkflowService(service_id="workflow")
svc.handle(
Event(event_type="workflow.start", source="test", payload={"type": "origination", "entity_id": "app_3"})
)
for _ in range(6):
svc.handle(Event(event_type="workflow.advance", source="test", payload={"entity_id": "app_3"}))
rec = svc.store.get("workflow:app_3")
assert rec is not None
assert rec["status"] == "completed"
assert "completed_at" in rec
def test_advance_completed_emits_workflow_completed(self) -> None:
bus = LocalBus()
received: list = []
bus.subscribe(EventType.WORKFLOW_COMPLETED, lambda e: received.append(e))
svc = WorkflowService(service_id="workflow", bus=bus)
bus.start()
svc.handle(
Event(event_type="workflow.start", source="test", payload={"type": "origination", "entity_id": "app_4"})
)
for _ in range(6):
svc.handle(Event(event_type="workflow.advance", source="test", payload={"entity_id": "app_4"}))
assert len(received) == 1
def test_advance_unknown_entity_noop(self) -> None:
svc = WorkflowService(service_id="workflow")
svc.handle(Event(event_type="workflow.advance", source="test", payload={"entity_id": "NONEXISTENT"}))
def test_auto_starts_on_origination_submitted(self) -> None:
svc = WorkflowService(service_id="workflow")
svc.handle(
Event(event_type=EventType.ORIGINATION_SUBMITTED, source="test", payload={"application_id": "app_5"})
)
rec = svc.store.get("workflow:app_5")
assert rec is not None
assert rec["type"] == "origination"
def test_auto_advances_on_underwriter_approved(self) -> None:
svc = WorkflowService(service_id="workflow")
svc.handle(
Event(event_type=EventType.ORIGINATION_SUBMITTED, source="test", payload={"application_id": "app_6"})
)
svc.handle(Event(event_type=EventType.UNDERWRITER_APPROVED, source="test", payload={"application_id": "app_6"}))
rec = svc.store.get("workflow:app_6")
assert rec is not None
assert rec["current_stage"] == "kyc_pending"
def test_ignores_unrelated_events(self) -> None:
svc = WorkflowService(service_id="workflow")
svc.handle(Event(event_type="seed.added", source="test", payload={}))
assert len(svc.store.keys("workflow:")) == 0
def test_multiple_workflows_independent(self) -> None:
svc = WorkflowService(service_id="workflow")
svc.handle(Event(event_type="workflow.start", source="test", payload={"type": "origination", "entity_id": "a"}))
svc.handle(Event(event_type="workflow.start", source="test", payload={"type": "recovery", "entity_id": "b"}))
rec_a = svc.store.get("workflow:a")
assert rec_a is not None
assert rec_a["type"] == "origination"
rec_b = svc.store.get("workflow:b")
assert rec_b is not None
assert rec_b["type"] == "recovery"