Files
cleveragents-core/features/steps/sandbox_dirs_cache_steps.py
HAL9000 9d5128c265 fix(cleanup): fix CI failures and address review feedback (#7527)
- Remove unused typing.Any import from dirs_cache.py (ruff lint)
- Collapse multiline expressions without trailing commas (ruff format)
- Rename ambiguous behave step "the result should be {True,False}" to
  "the dir membership result should be {True,False}" — resolves conflict
  with existing step @then('the result should be {expected}') in
  cli_steps.py that caused all 31 feature workers to crash on load
- Add self._sandbox_dirs_cache = None invalidation to
  CleanupService._purge_sandboxes() — the actual fix for issue #7527;
  without this, subsequent scan() calls return stale deleted paths
- Fix CONTRIBUTORS.md PR reference from #10989 to #11091

ISSUES CLOSED: #7527
2026-06-12 12:08:13 -04:00

140 lines
4.2 KiB
Python

"""Step definitions for sandbox dirs cache BDD tests (#7527 / PR #10989)."""
from __future__ import annotations
from behave import given, then, when
from cleveragents.infrastructure.sandbox.dirs_cache import SandboxDirsCache
def _make_cache() -> SandboxDirsCache:
"""Create a fresh cache instance, always starting clean."""
return SandboxDirsCache()
# Each scenario sets context._sdc (SandboxDirsCache) and context._last_* for result tracking.
@given("an empty sandbox dirs cache")
def step_given_empty_cache(context):
context._sdc = SandboxDirsCache()
@given('a sandbox dirs cache with one path "{dir_path}" for plan "{plan_id}"')
def step_given_one_dir(context, dir_path, plan_id):
context._sdc = SandboxDirsCache()
context._sdc.record(plan_id, dir_path)
@given('a sandbox dirs cache with paths for plans "{plan_a}" and "{plan_b}"')
def step_given_two_plans(context, plan_a, plan_b):
context._sdc = SandboxDirsCache()
context._sdc.record(plan_a, f"/tmp/sandboxes/{plan_a}-dir")
context._sdc.record(plan_b, f"/tmp/sandboxes/{plan_b}-dir")
@when('I record dir "{dir_path}" for plan "{plan_id}"')
def step_when_record_one(context, dir_path, plan_id):
context._last_result = None
context._sdc.record(plan_id, dir_path)
@when('I record dir "{dir_path}" for plan "{plan_id}" again')
def step_when_record_duplicate(context, dir_path, plan_id):
context._last_result = None
context._sdc.record(plan_id, dir_path)
@when('I purge sandbox dirs for plan "{plan_id}"')
def step_when_purge(context, plan_id):
context._purged = context._sdc.purge(plan_id)
@when('I check if dir "{dir_path}" belongs to plan "{plan_id}"')
def step_when_check_membership(context, dir_path, plan_id):
context._check_result = context._sdc.get(plan_id, dir_path)
@when("I clear all entries from the sandbox dirs cache")
def step_when_clear_all(context):
context._sdc.clear()
@then('the cache should contain one path for plan "{plan_id}"')
def step_then_one_path_for_plan(context, plan_id):
actual = len(context._sdc._dirs.get(plan_id, set()))
assert actual == 1, f"Expected 1 path for {plan_id}, got {actual}"
@then('the cache should contain two paths for plan "{plan_id}"')
def step_then_two_paths_for_plan(context, plan_id):
actual = len(context._sdc._dirs.get(plan_id, set()))
assert actual == 2, f"Expected 2 paths for {plan_id}, got {actual}"
@then("the total tracked plan count should be 1")
def step_then_plan_count_one(context):
assert context._sdc.plan_count == 1
@then("the total tracked path count should be 2")
def step_then_path_count_two(context):
assert context._sdc.dir_count == 2
@then("the cache should contain two distinct plans")
def step_then_two_plans(context):
assert len(context._sdc._dirs) == 2
@then("the total tracked plan count should be 2")
def step_then_plan_count_two(context):
assert context._sdc.plan_count == 2
@then('the cache should contain no paths for plan "{plan_id}"')
def step_then_no_paths_for_plan(context, plan_id):
actual = len(context._sdc._dirs.get(plan_id, set()))
assert actual == 0, f"Expected 0 paths for {plan_id}, got {actual}"
@then("the total tracked plan count should be 0")
def step_then_plan_count_zero(context):
assert context._sdc.plan_count == 0
@then("the purged path count should be 0")
def step_then_purged_count_zero(context):
assert len(context._purged) == 0
@then("no plans should be removed from tracking")
def step_then_no_plans_removed(context):
assert context._sdc.plan_count == 0
@then("the dir membership result should be True")
def step_then_membership_true(context):
assert context._check_result is True
@then("the dir membership result should be False")
def step_then_membership_false(context):
assert context._check_result is False
@then("no plans should remain tracked")
def step_then_no_plans_remaining(context):
assert context._sdc.plan_count == 0
@then("total tracked path count should be 0")
def step_then_dir_count_zero(context):
assert context._sdc.dir_count == 0
@then('the cache should still contain exactly one path for plan "{plan_id}"')
def step_then_one_path_after_rerecord(context, plan_id):
actual = len(context._sdc._dirs.get(plan_id, set()))
assert actual == 1, f"Expected 1 (idempotent), got {actual}"