This commit is contained in:
2026-05-13 23:02:47 +03:00
parent d0f8315cf1
commit 78f95bc88e
49 changed files with 2747 additions and 987 deletions

36
tests/fakes.py Normal file
View File

@@ -0,0 +1,36 @@
"""Shared test fixtures."""
from __future__ import annotations
import subprocess
from typing import Any
from flow.core.runtime import CommandRunner
class FakeRunner(CommandRunner):
"""CommandRunner that captures calls instead of executing.
Response matching uses keyword containment: a response keyed by
``("ps", "{{.Names}}")`` matches any command whose argv contains
both ``"ps"`` and ``"{{.Names}}"``.
"""
def __init__(self, responses: dict[tuple[str, ...], Any] | None = None):
self.calls: list[list[str]] = []
self.timeouts: list[float | None] = []
self._responses: dict[tuple[str, ...], Any] = responses or {}
def run(self, argv, *, cwd=None, env=None, capture_output=True, check=False, timeout=None):
parts = list(argv)
self.calls.append(parts)
self.timeouts.append(timeout)
for key, resp in self._responses.items():
if all(k in parts for k in key):
return resp
return subprocess.CompletedProcess(parts, 0, stdout="", stderr="")
def run_shell(self, command, *, cwd=None, env=None, capture_output=True, check=False, timeout=None):
self.calls.append(["__shell__", command])
self.timeouts.append(timeout)
return subprocess.CompletedProcess(command, 0, stdout="", stderr="")