mirror of
https://github.com/esphome/esphome.git
synced 2026-06-24 12:17:23 +00:00
[ci] Gate unconditional CI jobs on a single determine-jobs output instead of a path filter (#16580)
This commit is contained in:
@@ -775,6 +775,88 @@ def test_should_run_import_time_with_branch() -> None:
|
||||
mock_changed.assert_called_once_with("release")
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("path", "expected_result"),
|
||||
[
|
||||
# Exact-file matches in the CI-irrelevant set.
|
||||
(".yamllint", True),
|
||||
(".github/dependabot.yml", True),
|
||||
# Other top-level workflow files are irrelevant; ci.yml itself is not.
|
||||
(".github/workflows/codeql.yml", True),
|
||||
(".github/workflows/release.yml", True),
|
||||
(".github/workflows/ci.yml", False),
|
||||
# Nested files under workflows/ are not matched by the single-star glob.
|
||||
(".github/workflows/matchers/gcc.json", False),
|
||||
# build-image action: direct children only (single-star glob).
|
||||
(".github/actions/build-image/action.yml", True),
|
||||
(".github/actions/build-image/nested/file.yml", False),
|
||||
# Other actions are CI-relevant.
|
||||
(".github/actions/restore-python/action.yml", False),
|
||||
# docker/** covers everything under docker/.
|
||||
("docker/Dockerfile", True),
|
||||
("docker/scripts/run.sh", True),
|
||||
# Regular source files are CI-relevant.
|
||||
("esphome/__main__.py", False),
|
||||
("esphome/components/wifi/wifi_component.cpp", False),
|
||||
("README.md", False),
|
||||
("tests/script/test_determine_jobs.py", False),
|
||||
],
|
||||
)
|
||||
def test_is_ci_irrelevant_path(path: str, expected_result: bool) -> None:
|
||||
"""Test _is_ci_irrelevant_path mirrors the historic ci.yml path filter."""
|
||||
assert determine_jobs._is_ci_irrelevant_path(path) == expected_result
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("changed_files", "expected_result"),
|
||||
[
|
||||
# Empty diffs default to True — don't accidentally skip CI on a
|
||||
# broken probe.
|
||||
([], True),
|
||||
# Any CI-relevant file flips the result to True.
|
||||
(["esphome/__main__.py"], True),
|
||||
(["esphome/components/wifi/wifi_component.cpp"], True),
|
||||
(["README.md"], True),
|
||||
# All-irrelevant diffs return False.
|
||||
([".github/workflows/codeql.yml"], False),
|
||||
(
|
||||
[".github/workflows/codeql.yml", ".github/workflows/release.yml"],
|
||||
False,
|
||||
),
|
||||
([".yamllint"], False),
|
||||
([".github/dependabot.yml"], False),
|
||||
(["docker/Dockerfile"], False),
|
||||
(
|
||||
[
|
||||
".github/workflows/codeql.yml",
|
||||
".github/dependabot.yml",
|
||||
"docker/Dockerfile",
|
||||
],
|
||||
False,
|
||||
),
|
||||
# Mixed diffs always trigger CI.
|
||||
(
|
||||
[".github/workflows/codeql.yml", "esphome/__main__.py"],
|
||||
True,
|
||||
),
|
||||
# ci.yml itself is treated as CI-relevant.
|
||||
([".github/workflows/ci.yml"], True),
|
||||
],
|
||||
)
|
||||
def test_should_run_core_ci(changed_files: list[str], expected_result: bool) -> None:
|
||||
"""Test should_run_core_ci function."""
|
||||
with patch.object(determine_jobs, "changed_files", return_value=changed_files):
|
||||
assert determine_jobs.should_run_core_ci() == expected_result
|
||||
|
||||
|
||||
def test_should_run_core_ci_with_branch() -> None:
|
||||
"""Test should_run_core_ci passes the branch through to changed_files."""
|
||||
with patch.object(determine_jobs, "changed_files") as mock_changed:
|
||||
mock_changed.return_value = []
|
||||
determine_jobs.should_run_core_ci("release")
|
||||
mock_changed.assert_called_once_with("release")
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("changed_files", "expected_result"),
|
||||
[
|
||||
|
||||
Reference in New Issue
Block a user