Skip to content

Commit 9670231

Browse files
Test the README quickstart workflow
Test README quickstart workflow
1 parent 6b26d55 commit 9670231

2 files changed

Lines changed: 57 additions & 0 deletions

File tree

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ pip install -e '.[dev]'
1919
## Quickstart
2020

2121
```python
22+
import asyncio
23+
2224
from durable_workflow import Client, Worker, workflow, activity
2325

2426
@activity.defn(name="greet")
@@ -48,6 +50,9 @@ async def main():
4850
await worker.run_until(workflow_id="greet-1", timeout=30.0)
4951
result = await client.get_result(handle)
5052
print(result) # "hello, world"
53+
54+
if __name__ == "__main__":
55+
asyncio.run(main())
5156
```
5257

5358
For a fuller deployable example, see

tests/test_readme_quickstart.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
from __future__ import annotations
2+
3+
import re
4+
from pathlib import Path
5+
from types import FunctionType
6+
7+
from durable_workflow import serializer
8+
from durable_workflow.workflow import CompleteWorkflow, ScheduleActivity, replay
9+
10+
11+
def _readme_quickstart_code() -> str:
12+
readme = Path(__file__).resolve().parents[1] / "README.md"
13+
text = readme.read_text(encoding="utf-8")
14+
match = re.search(r"## Quickstart\s+```python\n(?P<code>.*?)\n```", text, flags=re.DOTALL)
15+
assert match is not None, "README Quickstart must contain a Python code block"
16+
17+
return match.group("code")
18+
19+
20+
def _completed(result: object) -> dict[str, object]:
21+
return {
22+
"event_type": "ActivityCompleted",
23+
"payload": {
24+
"result": serializer.encode(result, codec="json"),
25+
"payload_codec": "json",
26+
},
27+
}
28+
29+
30+
def test_readme_quickstart_is_a_runnable_script() -> None:
31+
namespace = {"__name__": "readme_quickstart_test"}
32+
exec(_readme_quickstart_code(), namespace)
33+
34+
assert isinstance(namespace["main"], FunctionType)
35+
assert namespace["asyncio"].__name__ == "asyncio"
36+
37+
38+
def test_readme_quickstart_replays_documented_greeter() -> None:
39+
namespace = {"__name__": "readme_quickstart_test"}
40+
exec(_readme_quickstart_code(), namespace)
41+
42+
workflow_class = namespace["GreeterWorkflow"]
43+
greet = namespace["greet"]
44+
45+
first = replay(workflow_class, [], ["world"]).commands[0]
46+
assert isinstance(first, ScheduleActivity)
47+
assert first.activity_type == "greet"
48+
assert first.arguments == ["world"]
49+
50+
final = replay(workflow_class, [_completed(greet("world"))], ["world"]).commands[0]
51+
assert isinstance(final, CompleteWorkflow)
52+
assert final.result == "hello, world"

0 commit comments

Comments
 (0)