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

56 lines
1.6 KiB
Python

# SPDX-FileCopyrightText: 2026 Art Sea LLC
#
# SPDX-License-Identifier: AGPL-3.0-only
from __future__ import annotations
import logging
from band_aider.ai_client.completion_client import CompletionClient, OpenAIConfig
from band_aider.ai_client.fence_crashing_client import FenceCrashingClient
class _Client(CompletionClient):
"""_Client returns one configured completion response."""
model = "default"
api_base = "https://example.invalid"
api_key = "key"
temperature = 0
max_tokens = None
max_attempts = 8
retry_temperature_step = 0.2
max_retry_temperature = 0.8
def __init__(self, response: str) -> None:
"""Store the response returned from complete."""
self.response = response
def complete(self, prompt: str, logger: logging.Logger | None = None) -> str:
"""Return the configured response."""
del prompt, logger
return self.response
@property
def inner(self) -> CompletionClient | None:
"""Declare this client as the root completion boundary."""
return None
@property
def openai_configs(self) -> tuple[OpenAIConfig, ...]:
"""Expose no external config for the stationary response."""
return ()
def test_fence_crashing_client_strips_json_fence_and_preserves_raw_text() -> None:
"""Verify the fence stripper behaves as a completion client decorator."""
fenced = FenceCrashingClient(_Client("```json\n{\"ok\": true}\n```"))
raw = FenceCrashingClient(_Client("{\"ok\": true}"))
assert fenced.complete("prompt") == "{\"ok\": true}"
assert raw.complete("prompt") == "{\"ok\": true}"