test: add tests for graph all_deps and defaults inheritance
- add test_all_deps_combines_hard_and_soft to verify all_deps returns correct hard+soft deps in order - add multiple tests for GraphDefaults field inheritance, including normal inheritance and non-override of custom values
This commit is contained in:
@@ -338,6 +338,63 @@ class TestGraphDefaults:
|
|||||||
assert report.success
|
assert report.success
|
||||||
assert calls["n"] == 3
|
assert calls["n"] == 3
|
||||||
|
|
||||||
|
def test_defaults_strategy_env_cwd(self) -> None:
|
||||||
|
"""测试strategy、env、cwd字段的继承。"""
|
||||||
|
defaults = px.GraphDefaults(
|
||||||
|
strategy="thread",
|
||||||
|
env={"VAR": "value"},
|
||||||
|
cwd="/tmp",
|
||||||
|
)
|
||||||
|
graph = px.Graph(defaults=defaults)
|
||||||
|
graph.add(px.TaskSpec("a", lambda: "ok"))
|
||||||
|
resolved = graph.resolved_spec("a")
|
||||||
|
assert resolved.strategy == "thread"
|
||||||
|
assert resolved.env == {"VAR": "value"}
|
||||||
|
assert resolved.cwd == "/tmp"
|
||||||
|
|
||||||
|
def test_defaults_continue_on_error_concurrency_key_verbose(self) -> None:
|
||||||
|
"""测试continue_on_error、concurrency_key、verbose字段的继承。"""
|
||||||
|
defaults = px.GraphDefaults(
|
||||||
|
continue_on_error=True,
|
||||||
|
concurrency_key="pool",
|
||||||
|
verbose=True,
|
||||||
|
)
|
||||||
|
graph = px.Graph(defaults=defaults)
|
||||||
|
graph.add(px.TaskSpec("a", lambda: "ok"))
|
||||||
|
resolved = graph.resolved_spec("a")
|
||||||
|
assert resolved.continue_on_error is True
|
||||||
|
assert resolved.concurrency_key == "pool"
|
||||||
|
assert resolved.verbose is True
|
||||||
|
|
||||||
|
def test_defaults_spec_excludes_non_default_values(self) -> None:
|
||||||
|
"""测试当spec已有非默认值时,不应被defaults覆盖。"""
|
||||||
|
defaults = px.GraphDefaults(
|
||||||
|
strategy="thread",
|
||||||
|
continue_on_error=True,
|
||||||
|
verbose=True,
|
||||||
|
priority=5,
|
||||||
|
)
|
||||||
|
graph = px.Graph(defaults=defaults)
|
||||||
|
graph.add(
|
||||||
|
px.TaskSpec(
|
||||||
|
"a",
|
||||||
|
lambda: "ok",
|
||||||
|
strategy="sequential",
|
||||||
|
continue_on_error=True, # True是非默认值,不会被覆盖
|
||||||
|
verbose=True, # True是非默认值,不会被覆盖
|
||||||
|
priority=10, # 非0值,不会被覆盖
|
||||||
|
)
|
||||||
|
)
|
||||||
|
resolved = graph.resolved_spec("a")
|
||||||
|
# strategy已有非默认值,不会被覆盖
|
||||||
|
assert resolved.strategy == "sequential"
|
||||||
|
# continue_on_error=True不会被defaults覆盖(只有False才会被覆盖)
|
||||||
|
assert resolved.continue_on_error is True
|
||||||
|
# verbose=True不会被defaults覆盖(只有False才会被覆盖)
|
||||||
|
assert resolved.verbose is True
|
||||||
|
# priority非0值不会被覆盖
|
||||||
|
assert resolved.priority == 10
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------- #
|
# ---------------------------------------------------------------------- #
|
||||||
# 软依赖 soft_depends_on
|
# 软依赖 soft_depends_on
|
||||||
|
|||||||
@@ -162,6 +162,19 @@ def test_all_specs_returns_view() -> None:
|
|||||||
assert view is graph.all_specs() or view == graph.all_specs()
|
assert view is graph.all_specs() or view == graph.all_specs()
|
||||||
|
|
||||||
|
|
||||||
|
def test_all_deps_combines_hard_and_soft() -> None:
|
||||||
|
"""all_deps 应返回硬依赖 + 软依赖的组合。"""
|
||||||
|
graph = px.Graph.from_specs([
|
||||||
|
px.TaskSpec("a", _fn),
|
||||||
|
px.TaskSpec("b", _fn),
|
||||||
|
px.TaskSpec("c", _fn, depends_on=("a",), soft_depends_on=("b",)),
|
||||||
|
])
|
||||||
|
all_deps = graph.all_deps("c")
|
||||||
|
assert set(all_deps) == {"a", "b"}
|
||||||
|
# 硬依赖在前,软依赖在后
|
||||||
|
assert all_deps == ("a", "b")
|
||||||
|
|
||||||
|
|
||||||
def test_spec_accessor() -> None:
|
def test_spec_accessor() -> None:
|
||||||
graph = px.Graph.from_specs([px.TaskSpec("a", _fn)])
|
graph = px.Graph.from_specs([px.TaskSpec("a", _fn)])
|
||||||
assert graph.spec("a").name == "a"
|
assert graph.spec("a").name == "a"
|
||||||
|
|||||||
Reference in New Issue
Block a user