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

74 lines
2.9 KiB
Python

from __future__ import annotations
from pathlib import Path
from dataclasses import dataclass
from band_aider.ai_client.llm_logging import (
initialize_llm_logging,
log_markdown_document,
reset_llm_logging_for_tests,
)
from band_aider.context.band_aider_facts import BandAiderFacts
from band_aider.context.contex_bag import ContextBag
from band_aider.context.context_factory import ContextFactory
from band_aider.context.resume_state import configure_resume_settings, reset_resume_state_for_tests
from band_aider.judgement.code_parser import CodeParser
from band_aider.judgement.file_parser import FileParser
from band_aider.judgement.prompt_formatter import MarkdownPromptFormatterBuilder
from tests.support.completion_clients import StaticOpenAICompatibleClient
from tests.support.memory_repo_exec import MemoryRepoExec
@dataclass
class TinyContext(ContextBag):
marker: str = ""
def test_context_checkpoint_round_trip_and_pruning_use_repo_exec() -> None:
adapter = MemoryRepoExec()
reset_resume_state_for_tests()
configure_resume_settings(checkpoint_dir=Path("/testbed/.band-aider-chkpts"), keep=1, repo_exec=adapter)
first = TinyContext(goal="goal", classes=[], marker="one").persist()
second_context = TinyContext(goal="goal", classes=[], marker="two")
second = second_context.persist()
assert not adapter.exists(first)
assert adapter.exists(second)
restored = ContextFactory().latest_payload_for(TinyContext)
assert restored is not None
assert restored["marker"] == "two"
def test_facts_use_the_supplied_repo_exec() -> None:
adapter = MemoryRepoExec()
checkpoint_dir = Path("/testbed/.band-aider-chkpts")
reset_resume_state_for_tests()
configure_resume_settings(checkpoint_dir=checkpoint_dir, repo_exec=adapter)
facts = BandAiderFacts()
facts.record_llm_call(tokens_spent=7, wait_seconds=0, wall_time=1)
facts.persist(checkpoint_dir, repo_exec=adapter)
restored_facts = BandAiderFacts()
restored_facts.restore(checkpoint_dir, repo_exec=adapter)
assert restored_facts.total_tokens_spent == 7
def test_file_parser_and_project_log_use_repo_exec() -> None:
adapter = MemoryRepoExec()
source_path = Path("/testbed/src/example.py")
adapter.write_text(source_path, "VALUE = 1\n")
parser = FileParser(
StaticOpenAICompatibleClient('{"location":"","summary":"ok","relevance":[],"relevant_symbols":{}}'),
MarkdownPromptFormatterBuilder(),
repo_exec=adapter,
)
assert parser.parse_file(str(source_path), "inspect").summary == "ok"
reset_llm_logging_for_tests()
try:
initialize_llm_logging(Path("/testbed"), adapter)
log_markdown_document("boundary", "project evidence")
log_files = adapter.list_files(Path("/testbed/.band-aider-logs"), patterns=["*.md"], recursive=True)
assert len(log_files) == 1
assert "project evidence" in adapter.read_text(log_files[0])
finally:
reset_llm_logging_for_tests()