完成 0.2.0 预发布收口与中文安装器

This commit is contained in:
2026-09-09 01:20:45 +08:00
parent 90262aaf6d
commit 1f5e26c361
30 changed files with 1826 additions and 121 deletions
@@ -0,0 +1,53 @@
#include "TestHarness.h"
#include "src/ai/AIDiagnostics.h"
#include <QByteArray>
#include <QUrl>
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")));
}