9d5128c265
- 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
140 lines
4.2 KiB
Python
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}"
|