DEVX-146: fix: scale check_test_speed limits on CI runners
Post-merge / detect-and-configure (push) Successful in 20s
Post-merge / release-and-maintain (push) Successful in 2m2s

Co-authored-by: emil User <emil.simeonov@tutanota.com>
This commit was merged in pull request #233.
This commit is contained in:
2026-08-03 21:40:17 +00:00
committed by emo
parent 32193a0e6d
commit 9bb461e12f
5 changed files with 115 additions and 10 deletions
+55
View File
@@ -10,6 +10,7 @@ from devx.tools.check_test_speed import (
DEFAULT_MAX_SECONDS,
DEFAULT_MAX_SINGLE_SECONDS,
TEST_COMMAND,
_ci_scale_limit,
check_per_test_speed,
check_speed,
cli,
@@ -144,7 +145,26 @@ def test_main_module_block() -> None:
mock_cli.assert_called_once_with([])
class TestCiScaleLimit:
def test_no_scaling_when_not_ci(self) -> None:
with patch("devx.tools.check_test_speed._IS_CI", False):
assert _ci_scale_limit(10.0) == 10.0
assert _ci_scale_limit(0.5) == 0.5
def test_scales_when_ci(self) -> None:
with patch("devx.tools.check_test_speed._IS_CI", True):
with patch("devx.tools.check_test_speed.CI_SCALE_FACTOR", 4.0):
assert _ci_scale_limit(10.0) == 40.0
assert _ci_scale_limit(0.5) == 2.0
def test_custom_scale_factor(self) -> None:
with patch("devx.tools.check_test_speed._IS_CI", True):
with patch("devx.tools.check_test_speed.CI_SCALE_FACTOR", 2.5):
assert _ci_scale_limit(10.0) == 25.0
class TestMain:
@patch("devx.tools.check_test_speed._IS_CI", False)
@patch("devx.tools.check_test_speed.run_tests")
@patch("devx.tools.check_test_speed.parse_duration")
@patch("devx.tools.check_test_speed.check_speed")
@@ -174,6 +194,7 @@ class TestMain:
mock_parse_per.assert_called_once()
mock_check_per.assert_called_once_with([], DEFAULT_MAX_SINGLE_SECONDS)
@patch("devx.tools.check_test_speed._IS_CI", False)
@patch("devx.tools.check_test_speed.run_tests")
@patch("devx.tools.check_test_speed.parse_duration")
def test_slow_total_exits(
@@ -189,6 +210,7 @@ class TestMain:
assert result.exit_code == 1
assert "too slow" in result.output.lower()
@patch("devx.tools.check_test_speed._IS_CI", False)
@patch("devx.tools.check_test_speed.run_tests")
@patch("devx.tools.check_test_speed.parse_duration")
@patch("devx.tools.check_test_speed.check_speed")
@@ -213,6 +235,7 @@ class TestMain:
assert "Per-test speed check FAILED" in result.output
assert "test_slow" in result.output
@patch("devx.tools.check_test_speed._IS_CI", False)
@patch("devx.tools.check_test_speed.run_tests")
def test_parse_failure_exits(
self,
@@ -225,6 +248,7 @@ class TestMain:
assert result.exit_code == 1
assert "Could not parse" in result.output
@patch("devx.tools.check_test_speed._IS_CI", False)
@patch("devx.tools.check_test_speed.run_tests")
@patch("devx.tools.check_test_speed.parse_duration")
@patch("devx.tools.check_test_speed.check_speed")
@@ -248,6 +272,7 @@ class TestMain:
assert result.exit_code == 0
mock_check.assert_called_once_with(0.5, 1.5)
@patch("devx.tools.check_test_speed._IS_CI", False)
@patch("devx.tools.check_test_speed.run_tests")
@patch("devx.tools.check_test_speed.parse_duration")
@patch("devx.tools.check_test_speed.check_speed")
@@ -270,6 +295,7 @@ class TestMain:
mock_parse_per.assert_not_called()
mock_check_per.assert_not_called()
@patch("devx.tools.check_test_speed._IS_CI", False)
@patch("devx.tools.check_test_speed.run_tests")
@patch("devx.tools.check_test_speed.parse_duration")
@patch("devx.tools.check_test_speed.check_speed")
@@ -292,3 +318,32 @@ class TestMain:
result = runner.invoke(cli, ["--max-single-seconds", "1.0"])
assert result.exit_code == 0
mock_check_per.assert_called_once_with([], 1.0)
@patch("devx.tools.check_test_speed._IS_CI", True)
@patch("devx.tools.check_test_speed.CI_SCALE_FACTOR", 4.0)
@patch("devx.tools.check_test_speed.run_tests")
@patch("devx.tools.check_test_speed.parse_duration")
@patch("devx.tools.check_test_speed.check_speed")
@patch("devx.tools.check_test_speed.parse_per_test_durations")
@patch("devx.tools.check_test_speed.check_per_test_speed")
def test_ci_scales_limits(
self,
mock_check_per: MagicMock,
mock_parse_per: MagicMock,
mock_check: MagicMock,
mock_parse: MagicMock,
mock_run: MagicMock,
) -> None:
mock_run.return_value = ("out\n", "err\n")
mock_parse.return_value = 30.0 # would fail local (10s) but pass CI (40s)
mock_parse_per.return_value = []
mock_check_per.return_value = []
runner = CliRunner()
result = runner.invoke(cli, [])
assert result.exit_code == 0
assert "CI environment detected" in result.output
assert "scaling limits by 4.0x" in result.output
# check_speed called with scaled limit
mock_check.assert_called_once_with(30.0, 40.0)
mock_check_per.assert_called_once_with([], 2.0)