Files
wx_service/internal/quitcheckin/service/hp_persistence_test.go
T

157 lines
4.1 KiB
Go

package service
import (
"context"
"testing"
"time"
quitmodel "wx_service/internal/quitcheckin/model"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
func setupQuitHPTestDB(t *testing.T) *gorm.DB {
t.Helper()
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
})
if err != nil {
t.Fatalf("open sqlite: %v", err)
}
if err := db.AutoMigrate(
&quitmodel.Profile{},
&quitmodel.DailyStatus{},
&quitmodel.RelapseEvent{},
&quitmodel.HPChangeLog{},
&quitmodel.RewardGoal{},
&quitmodel.DreamPreset{},
); err != nil {
t.Fatalf("auto migrate: %v", err)
}
return db
}
func TestQuitCheckinHomeInitializesHP(t *testing.T) {
t.Parallel()
db := setupQuitHPTestDB(t)
svc := NewService(db)
ctx := context.Background()
uid := 2001
startDate := time.Date(2026, 4, 10, 0, 0, 0, 0, time.Local)
now := time.Date(2026, 4, 10, 9, 0, 0, 0, time.Local)
if _, err := svc.UpsertProfile(ctx, uid, UpsertProfileRequest{
QuitStartDate: &startDate,
PackPriceCent: intPtr(2500),
BaselineCigsPerDay: intPtr(12),
}, "测试用户", "", now); err != nil {
t.Fatalf("upsert profile: %v", err)
}
home, err := svc.Home(ctx, uid, now)
if err != nil {
t.Fatalf("home: %v", err)
}
if home.Summary.HPCurrent <= 0 {
t.Fatalf("hp_current=%d, want > 0", home.Summary.HPCurrent)
}
if home.Summary.HPChangeToday != 0 {
t.Fatalf("hp_change_today=%d, want 0", home.Summary.HPChangeToday)
}
}
func TestQuitCheckinCheckinIncreasesHPAndTracksTodayDelta(t *testing.T) {
t.Parallel()
db := setupQuitHPTestDB(t)
svc := NewService(db)
ctx := context.Background()
uid := 2002
startDate := time.Date(2026, 4, 10, 0, 0, 0, 0, time.Local)
day1 := time.Date(2026, 4, 10, 9, 0, 0, 0, time.Local)
if _, err := svc.UpsertProfile(ctx, uid, UpsertProfileRequest{
QuitStartDate: &startDate,
PackPriceCent: intPtr(2500),
BaselineCigsPerDay: intPtr(10),
}, "测试用户", "", day1); err != nil {
t.Fatalf("upsert profile: %v", err)
}
before, err := svc.Home(ctx, uid, day1)
if err != nil {
t.Fatalf("home before: %v", err)
}
_, err = svc.Checkin(ctx, uid, CheckinRequest{Date: day1, Note: "day1"}, day1)
if err != nil {
t.Fatalf("checkin: %v", err)
}
after, err := svc.Home(ctx, uid, day1)
if err != nil {
t.Fatalf("home after: %v", err)
}
if after.Summary.HPCurrent <= before.Summary.HPCurrent {
t.Fatalf("hp_current before=%d after=%d, want after > before", before.Summary.HPCurrent, after.Summary.HPCurrent)
}
if after.Summary.HPChangeToday <= 0 {
t.Fatalf("hp_change_today=%d, want > 0", after.Summary.HPChangeToday)
}
}
func TestQuitCheckinSmokeSlipDecreasesHPAndMarksRelapsed(t *testing.T) {
t.Parallel()
db := setupQuitHPTestDB(t)
svc := NewService(db)
ctx := context.Background()
uid := 2003
startDate := time.Date(2026, 4, 10, 0, 0, 0, 0, time.Local)
day1 := time.Date(2026, 4, 10, 9, 0, 0, 0, time.Local)
if _, err := svc.UpsertProfile(ctx, uid, UpsertProfileRequest{
QuitStartDate: &startDate,
PackPriceCent: intPtr(2500),
BaselineCigsPerDay: intPtr(8),
}, "测试用户", "", day1); err != nil {
t.Fatalf("upsert profile: %v", err)
}
before, err := svc.Home(ctx, uid, day1)
if err != nil {
t.Fatalf("home before: %v", err)
}
slipAt := time.Date(2026, 4, 10, 10, 15, 0, 0, time.Local)
if err := svc.RecordSmokeSlip(ctx, uid, slipAt, 1, "slip"); err != nil {
t.Fatalf("record slip: %v", err)
}
after, err := svc.Home(ctx, uid, day1)
if err != nil {
t.Fatalf("home after: %v", err)
}
if after.DailyStatus.Status != quitmodel.DailyStatusRelapsed {
t.Fatalf("daily status=%s, want=%s", after.DailyStatus.Status, quitmodel.DailyStatusRelapsed)
}
if after.Summary.HPCurrent >= before.Summary.HPCurrent {
t.Fatalf("hp_current before=%d after=%d, want after < before", before.Summary.HPCurrent, after.Summary.HPCurrent)
}
if after.Summary.HPChangeToday >= 0 {
t.Fatalf("hp_change_today=%d, want < 0", after.Summary.HPChangeToday)
}
if after.Summary.CurrentStreakDays != 0 {
t.Fatalf("current_streak_days=%d, want 0", after.Summary.CurrentStreakDays)
}
}