band-aider-pub/tests/band_aider/test_failure_context_lifecycle.py
2026-10-17 11:57:37 -07:00

69 lines
2.4 KiB
Python

# SPDX-FileCopyrightText: 2026 Art Sea LLC
#
# SPDX-License-Identifier: AGPL-3.0-only
"""Behavioral coverage for durable current-execution failure context."""
from __future__ import annotations
import pickle
from band_aider.context.class_meta import ClassMeta, ContentType
from band_aider.context.failing_test import FailingTest
from band_aider.context.working_backlog import FailedQAItem, TestingBacklog
def _test_meta() -> ClassMeta:
"""Return one minimal focused test metadata record."""
return ClassMeta("tests/test_widget.py", "widget", [], {}, content_type=ContentType.Test)
def _source_meta(location: str) -> ClassMeta:
"""Return one minimal source metadata record."""
return ClassMeta(location, location, [], {})
def test_testing_backlog_replaces_then_clears_current_failure_context() -> None:
"""Verify a passing result clears the exact failure record it supersedes."""
item = TestingBacklog(focused_spotlight=_test_meta(), summary="repair")
first = _source_meta("src/first.py")
second = _source_meta("src/second.py")
item.record_failure(
FailingTest(_test_meta(), ["first trace"], "first failure", "first output"),
[first, second, first],
)
item.record_failure(
FailingTest(_test_meta(), ["second trace"], "second failure", "second output"),
[second],
)
assert item.failure_error_message == "second failure"
assert item.failure_stack_trace == ["second trace"]
assert item.failure_raw_output == "second output"
assert item.failure_context_sources == [second]
item.clear_failure()
assert item.failure_error_message == ""
assert item.failure_stack_trace == []
assert item.failure_raw_output == ""
assert item.failure_context_sources == []
def test_legacy_testing_and_remediation_items_restore_empty_failure_context() -> None:
"""Verify inherited legacy backlog state receives an empty failure-context field."""
testing = TestingBacklog(focused_spotlight=_test_meta(), summary="testing")
remediation = FailedQAItem(focused_spotlight=_source_meta("src/widget.py"), summary="remediation")
del testing.failure_context_sources
del remediation.failure_context_sources
restored_testing = pickle.loads(pickle.dumps(testing))
restored_remediation = pickle.loads(pickle.dumps(remediation))
assert restored_testing.failure_context_sources == []
assert restored_remediation.failure_context_sources == []