2917aa7ddb
CI / lint (pull_request) Successful in 24s
CI / typecheck (pull_request) Successful in 51s
CI / quality (pull_request) Successful in 46s
CI / security (pull_request) Successful in 1m0s
CI / build (pull_request) Successful in 38s
CI / helm (pull_request) Successful in 24s
CI / unit_tests (pull_request) Successful in 6m47s
CI / e2e_tests (pull_request) Successful in 18m26s
CI / docker (pull_request) Successful in 1m29s
CI / integration_tests (pull_request) Successful in 22m58s
CI / coverage (pull_request) Successful in 10m55s
CI / status-check (pull_request) Successful in 2s
CI / benchmark-publish (pull_request) Has been skipped
CI / benchmark-regression (pull_request) Successful in 56m49s
Extend _check_providers() in system.py to report diagnostic status for all 9 providers supported by ProviderRegistry: OpenAI, Anthropic, Google, Azure, OpenRouter, Gemini, Cohere, Groq, and Together AI. Previously only 4 providers (OpenAI, Anthropic, Google, OpenRouter) were checked, leaving users of Groq, Together AI, Cohere, Azure, and Gemini with no diagnostic feedback about their provider configuration. Changes: - Add Azure (AZURE_OPENAI_API_KEY), Gemini (GEMINI_API_KEY), Cohere (COHERE_API_KEY), Groq (GROQ_API_KEY), and Together AI (TOGETHER_API_KEY) to the provider_checks list - Add Behave feature file with 11 scenarios covering all 9 providers (presence, OK status when configured, WARN with recommendation when not) ISSUES CLOSED: #3422
171 lines
6.2 KiB
Python
171 lines
6.2 KiB
Python
"""Step definitions for diagnostics_provider_coverage.feature.
|
|
|
|
Tests that _check_providers() in system.py reports diagnostic status for
|
|
all 9 supported providers: openai, anthropic, google, azure, openrouter,
|
|
gemini, cohere, groq, together.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from unittest.mock import patch
|
|
|
|
from behave import given, then, when
|
|
from behave.runner import Context
|
|
|
|
from features.mocks.settings_mock import make_settings_mock
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Given
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
@given("the diagnostics provider check module is loaded")
|
|
def step_provider_check_module_loaded(context: Context) -> None:
|
|
context.provider_results = None
|
|
context.configured_providers: set[str] = set()
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# When
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
@when("I call check_providers with no providers configured")
|
|
def step_check_providers_none_configured(context: Context) -> None:
|
|
from cleveragents.cli.commands.system import _check_providers
|
|
|
|
ms = make_settings_mock(configured_providers=set())
|
|
with patch("cleveragents.config.settings.get_settings", return_value=ms):
|
|
context.provider_results = _check_providers()
|
|
|
|
|
|
@when('I call check_providers with "{provider}" configured')
|
|
def step_check_providers_one_configured(context: Context, provider: str) -> None:
|
|
from cleveragents.cli.commands.system import _check_providers
|
|
|
|
ms = make_settings_mock(configured_providers={provider})
|
|
with patch("cleveragents.config.settings.get_settings", return_value=ms):
|
|
context.provider_results = _check_providers()
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Then — count assertions
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
@then("the provider check results should contain exactly {count:d} entries")
|
|
def step_assert_result_count(context: Context, count: int) -> None:
|
|
results = context.provider_results
|
|
assert results is not None, "provider_results is None"
|
|
actual = len(results)
|
|
assert actual == count, (
|
|
f"Expected exactly {count} provider check entries, got {actual}. "
|
|
f"Entries: {[r['name'] for r in results]}"
|
|
)
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Then — provider presence assertions
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
@then('the provider check results should include provider "{provider}"')
|
|
def step_assert_provider_present(context: Context, provider: str) -> None:
|
|
results = context.provider_results
|
|
assert results is not None, "provider_results is None"
|
|
names_lower = [r["name"].lower() for r in results]
|
|
assert any(provider.lower() in name for name in names_lower), (
|
|
f"Expected provider '{provider}' in results, but got: "
|
|
f"{[r['name'] for r in results]}"
|
|
)
|
|
|
|
|
|
def _find_provider_result(results: list[dict], provider: str) -> dict | None:
|
|
"""Find the result entry for a given provider name."""
|
|
for r in results:
|
|
if provider.lower() in r["name"].lower():
|
|
return r
|
|
return None
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Then — per-provider status/details/recommendation assertions
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
@then(
|
|
'the provider check result for "{provider}" should have status "{expected_status}"'
|
|
)
|
|
def step_assert_provider_status(
|
|
context: Context, provider: str, expected_status: str
|
|
) -> None:
|
|
results = context.provider_results
|
|
assert results is not None, "provider_results is None"
|
|
entry = _find_provider_result(results, provider)
|
|
assert entry is not None, (
|
|
f"No result found for provider '{provider}'. "
|
|
f"Available: {[r['name'] for r in results]}"
|
|
)
|
|
actual = str(entry["status"])
|
|
assert actual == expected_status, (
|
|
f"Provider '{provider}': expected status '{expected_status}', got '{actual}'"
|
|
)
|
|
|
|
|
|
@then(
|
|
'the provider check result for "{provider}" should have details "{expected_details}"'
|
|
)
|
|
def step_assert_provider_details(
|
|
context: Context, provider: str, expected_details: str
|
|
) -> None:
|
|
results = context.provider_results
|
|
assert results is not None, "provider_results is None"
|
|
entry = _find_provider_result(results, provider)
|
|
assert entry is not None, (
|
|
f"No result found for provider '{provider}'. "
|
|
f"Available: {[r['name'] for r in results]}"
|
|
)
|
|
actual = entry["details"]
|
|
assert actual == expected_details, (
|
|
f"Provider '{provider}': expected details '{expected_details}', got '{actual}'"
|
|
)
|
|
|
|
|
|
@then('the provider check result for "{provider}" should have no recommendation')
|
|
def step_assert_provider_no_recommendation(context: Context, provider: str) -> None:
|
|
results = context.provider_results
|
|
assert results is not None, "provider_results is None"
|
|
entry = _find_provider_result(results, provider)
|
|
assert entry is not None, (
|
|
f"No result found for provider '{provider}'. "
|
|
f"Available: {[r['name'] for r in results]}"
|
|
)
|
|
rec = entry.get("recommendation")
|
|
assert rec is None, (
|
|
f"Provider '{provider}': expected no recommendation, got '{rec}'"
|
|
)
|
|
|
|
|
|
@then(
|
|
'the provider check result for "{provider}" should have a recommendation mentioning "{env_var}"'
|
|
)
|
|
def step_assert_provider_recommendation_mentions(
|
|
context: Context, provider: str, env_var: str
|
|
) -> None:
|
|
results = context.provider_results
|
|
assert results is not None, "provider_results is None"
|
|
entry = _find_provider_result(results, provider)
|
|
assert entry is not None, (
|
|
f"No result found for provider '{provider}'. "
|
|
f"Available: {[r['name'] for r in results]}"
|
|
)
|
|
rec = entry.get("recommendation")
|
|
assert rec is not None, (
|
|
f"Provider '{provider}': expected a recommendation mentioning '{env_var}', "
|
|
f"but recommendation is None"
|
|
)
|
|
assert env_var in rec, (
|
|
f"Provider '{provider}': expected recommendation to mention '{env_var}', "
|
|
f"got '{rec}'"
|
|
)
|