Files
zclaw_openfang/crates/zclaw-saas/tests/telemetry_test.rs
iven 5fdf96c3f5 chore: 提交所有工作进度 — SaaS 后端增强、Admin UI、桌面端集成
包含大量 SaaS 平台改进、Admin 管理后台更新、桌面端集成完善、
文档同步、测试文件重构等内容。为 QA 测试准备干净工作树。
2026-03-29 10:46:41 +08:00

124 lines
4.4 KiB
Rust

mod common;
use axum::http::StatusCode;
use common::*;
// ═══════════════════════════════════════════════════════════════════
// Report telemetry
// ═══════════════════════════════════════════════════════════════════
#[tokio::test]
async fn telemetry_report_success() {
let (app, _pool) = build_test_app().await;
let token = register_token(&app, "teluser").await;
let now = chrono::Utc::now().to_rfc3339();
let (status, body) = send(
&app,
post(
"/api/v1/telemetry/report",
&token,
serde_json::json!({
"device_id": "test-device-001",
"app_version": "0.1.0",
"entries": [{
"model_id": "test-model-v1",
"input_tokens": 100,
"output_tokens": 50,
"latency_ms": 200,
"success": true,
"timestamp": now,
"connection_mode": "tauri"
}]
}),
),
).await;
assert_eq!(status, StatusCode::OK, "report telemetry: {body}");
assert_eq!(body["accepted"], 1);
assert_eq!(body["rejected"], 0);
}
#[tokio::test]
async fn telemetry_report_batch() {
let (app, _pool) = build_test_app().await;
let token = register_token(&app, "telbatch").await;
let now = chrono::Utc::now().to_rfc3339();
let entries: Vec<serde_json::Value> = (0..5)
.map(|i| {
serde_json::json!({
"model_id": format!("model-{i}"),
"input_tokens": 100 + i,
"output_tokens": 50 + i,
"success": true,
"timestamp": now,
"connection_mode": "tauri"
})
})
.collect();
let (status, body) = send(
&app,
post(
"/api/v1/telemetry/report",
&token,
serde_json::json!({
"device_id": "batch-device",
"app_version": "0.1.0",
"entries": entries
}),
),
).await;
assert_eq!(status, StatusCode::OK);
assert_eq!(body["accepted"], 5);
}
// ═══════════════════════════════════════════════════════════════════
// Stats query
// ═══════════════════════════════════════════════════════════════════
#[tokio::test]
async fn telemetry_stats() {
let (app, _pool) = build_test_app().await;
let token = register_token(&app, "telstats").await;
let (status, _) = send(&app, get("/api/v1/telemetry/stats", &token)).await;
assert_eq!(status, StatusCode::OK);
}
#[tokio::test]
async fn telemetry_daily() {
let (app, _pool) = build_test_app().await;
let token = register_token(&app, "teldaily").await;
let (status, _) = send(&app, get("/api/v1/telemetry/daily", &token)).await;
assert_eq!(status, StatusCode::OK);
}
// ═══════════════════════════════════════════════════════════════════
// Audit summary
// ═══════════════════════════════════════════════════════════════════
#[tokio::test]
async fn telemetry_audit_report() {
let (app, _pool) = build_test_app().await;
let token = register_token(&app, "telaudit").await;
let now = chrono::Utc::now().to_rfc3339();
let (status, _) = send(
&app,
post(
"/api/v1/telemetry/audit",
&token,
serde_json::json!({
"device_id": "audit-device",
"entries": [{
"action": "hand.trigger",
"target": "Browser",
"result": "success",
"timestamp": now
}]
}),
),
).await;
assert_eq!(status, StatusCode::OK);
}