Files
wangjia 40760aa884
ci / server (push) Failing after 14s
ci / design-tokens (push) Failing after 11s
dudu MVP:五端语音输入法初始提交
- server:Go 网关(WS 流式识别中继/计费配额/微信登录支付 mock/反馈/埋点),gummy provider 已真实联调
- desktop:Tauri 2(全局快捷键 push-to-talk/浮层/托盘/设置/登录购买/反馈/首启引导)
- android:Compose 主 App + IME(键盘内录音直传)
- ios:App + 键盘扩展(1A spike 实证键盘内不可录音,走 deep link 听写)
- design/design-pipeline:设计系统 + token 导出 iOS/Android 主题
- doc:前后端设计文档(HTML);web:官网宣传页;todo:任务看板

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 00:38:37 +08:00

56 lines
1.6 KiB
Go

package telemetry
import (
"context"
"fmt"
"testing"
"time"
"github.com/alicebob/miniredis/v2"
"github.com/glebarez/sqlite"
"github.com/redis/go-redis/v9"
"gorm.io/datatypes"
"gorm.io/gorm"
"dudu/server/internal/store"
)
func TestAggregateDay(t *testing.T) {
mr := miniredis.RunT(t)
rdb := redis.NewClient(&redis.Options{Addr: mr.Addr()})
db, _ := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
_ = db.AutoMigrate(store.AllModels()...)
h := New(db, rdb)
cst := time.FixedZone("CST", 8*3600)
day := time.Now().In(cst).Format("2006-01-02")
noon, _ := time.ParseInLocation("2006-01-02 15", day+" 12", cst)
// 100 条延迟事件:ms = 1..100 → P50≈50, P95≈95
for i := 1; i <= 100; i++ {
db.Create(&store.MetricEvent{
DeviceID: "d1", Platform: "mac", Event: "asr.first_partial_ms",
Props: datatypes.JSON(fmt.Sprintf(`{"ms":%d}`, i)), ReceivedAt: noon,
})
}
// 计数型事件不参与分位
db.Create(&store.MetricEvent{
DeviceID: "d1", Platform: "mac", Event: "login.success",
Props: datatypes.JSON(`{}`), ReceivedAt: noon,
})
if err := h.AggregateDay(context.Background(), day); err != nil {
t.Fatal(err)
}
var md store.MetricDaily
if err := db.First(&md, "date = ? AND event = ? AND platform = ?", day, "asr.first_partial_ms", "mac").Error; err != nil {
t.Fatal(err)
}
if md.Count != 100 || md.P50Ms < 45 || md.P50Ms > 55 || md.P95Ms < 90 || md.P95Ms > 100 {
t.Fatalf("bad aggregate: %+v", md)
}
var login store.MetricDaily
if err := db.First(&login, "date = ? AND event = ?", day, "login.success").Error; err != nil || login.Count != 1 {
t.Fatalf("login aggregate missing: %+v err=%v", login, err)
}
}