#include "TestHarness.h" #include "src/ai/AIDiagnostics.h" #include #include QA_TEST(AIDiagnostics, RedactsCredentialsFromContextAndFreeText) { AIConfig config; config.provider = QStringLiteral("custom"); config.protocol = QStringLiteral("openai-compatible"); config.model = QStringLiteral("test-model"); config.apiKey = QStringLiteral("sk-super-secret-value"); const QString context = AIDiagnostics::diagnosticContext( config, QUrl(QStringLiteral("https://example.test/v1/chat?api_key=query-secret&trace=visible"))); const QString freeText = AIDiagnostics::safeTextSummary( QStringLiteral("Authorization: Bearer bearer-secret token=token-secret sk-another-secret-value")); QA_EXPECT(!context.contains(QStringLiteral("sk-super-secret-value"))); QA_EXPECT(!context.contains(QStringLiteral("query-secret"))); QA_EXPECT(context.contains(QStringLiteral("trace=visible"))); QA_EXPECT(!freeText.contains(QStringLiteral("bearer-secret"))); QA_EXPECT(!freeText.contains(QStringLiteral("token-secret"))); QA_EXPECT(!freeText.contains(QStringLiteral("sk-another-secret-value"))); } QA_TEST(AIDiagnostics, RedactsConversationAndCredentialFieldsFromJson) { const QByteArray body = QByteArrayLiteral( R"({"safe":"visible","apiKey":"api-secret","authorization":"Bearer header-secret","messages":[{"content":"private prompt"}],"nested":{"token":"token-secret"}})"); const QString summary = AIDiagnostics::responseBodySummary(body); QA_EXPECT(summary.contains(QStringLiteral("visible"))); QA_EXPECT(!summary.contains(QStringLiteral("api-secret"))); QA_EXPECT(!summary.contains(QStringLiteral("header-secret"))); QA_EXPECT(!summary.contains(QStringLiteral("private prompt"))); QA_EXPECT(!summary.contains(QStringLiteral("token-secret"))); } QA_TEST(AIDiagnostics, KeepsUsefulErrorMetadataWithoutCredentialLeakage) { const QByteArray body = QByteArrayLiteral( R"({"error":{"message":"API key sk-super-secret-value is invalid","code":"invalid_api_key","type":"authentication_error"},"content":"private response"})"); const QString error = AIDiagnostics::errorMessageFromBody(body); QA_EXPECT(error.contains(QStringLiteral("invalid"))); QA_EXPECT(error.contains(QStringLiteral("invalid_api_key"))); QA_EXPECT(!error.contains(QStringLiteral("sk-super-secret-value"))); QA_EXPECT(!error.contains(QStringLiteral("private response"))); }