From 246f293c56ed5682c511e538bc787329947914c9 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Mon, 8 Jun 2026 00:41:20 -0400 Subject: [PATCH] test(batcher): add red tests for plan() function --- tests/test_batcher.py | 65 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 tests/test_batcher.py diff --git a/tests/test_batcher.py b/tests/test_batcher.py new file mode 100644 index 00000000..e7b84fb8 --- /dev/null +++ b/tests/test_batcher.py @@ -0,0 +1,65 @@ +from pathlib import Path +import pytest +from categorizer import CategoryRecord, FixtureClass, Speed +from batcher import Batch, plan + +def _rec(name: str, fc: FixtureClass, bg: str = "core") -> CategoryRecord: + return CategoryRecord( + filename=name, + fixture_class=fc, + subsystems=[bg] if bg else [], + speed=Speed.MEDIUM, + batch_group=bg, + ) + +def test_plan_groups_unit_by_batch_group() -> None: + records = [ + _rec("test_a.py", FixtureClass.UNIT, "core"), + _rec("test_b.py", FixtureClass.UNIT, "gui"), + _rec("test_c.py", FixtureClass.UNIT, "core"), + ] + batches = plan(records) + unit_batches = [b for b in batches if b.tier == "1"] + labels = {b.label for b in unit_batches} + assert "tier-1-unit-core" in labels + assert "tier-1-unit-gui" in labels + +def test_plan_live_gui_tier_is_one_batch() -> None: + records = [ + _rec("test_a_sim.py", FixtureClass.LIVE_GUI, "gui"), + _rec("test_b_sim.py", FixtureClass.LIVE_GUI, "core"), + _rec("test_c_sim.py", FixtureClass.LIVE_GUI, "mma"), + ] + batches = plan(records) + live_batches = [b for b in batches if b.tier == "3"] + assert len(live_batches) == 1 + assert len(live_batches[0].files) == 3 + +def test_plan_opt_in_skipped_without_flag() -> None: + records = [ + _rec("test_clean_install.py", FixtureClass.OPT_IN), + _rec("test_docker_build.py", FixtureClass.OPT_IN), + ] + batches = plan(records, include_opt_in=False) + opt_batches = [b for b in batches if b.tier == "0"] + assert all(b.skip_reason for b in opt_batches) + +def test_plan_is_deterministic() -> None: + records = [ + _rec("test_a.py", FixtureClass.UNIT, "core"), + _rec("test_b.py", FixtureClass.UNIT, "gui"), + ] + a = plan(records) + b = plan(records) + assert [(x.tier, x.label, len(x.files)) for x in a] == [(y.tier, y.label, len(y.files)) for y in b] + +def test_plan_xdist_only_for_tier_1() -> None: + records = [_rec("test_a.py", FixtureClass.UNIT, "core")] + batches = plan(records, xdist=True) + unit = next(b for b in batches if b.tier == "1") + assert "-n" in unit.pytest_args + assert "auto" in unit.pytest_args + mock_records = [_rec("test_a.py", FixtureClass.MOCK_APP, "core")] + batches2 = plan(mock_records, xdist=True) + mock = next(b for b in batches2 if b.tier == "2") + assert "-n" not in mock.pytest_args