package roomturnoverreward import ( "context" "testing" "chatapp3-golang/internal/config" "chatapp3-golang/internal/model" "gorm.io/driver/sqlite" "gorm.io/gorm" ) func newTestService(t *testing.T) (*Service, *gorm.DB) { t.Helper() db, err := gorm.Open(sqlite.Open("file:"+t.Name()+"?mode=memory&cache=shared"), &gorm.Config{}) if err != nil { t.Fatalf("open sqlite: %v", err) } if err := db.AutoMigrate( &model.RoomTurnoverRewardConfig{}, &model.RoomTurnoverRewardLevel{}, &model.RoomTurnoverRewardRecord{}, ); err != nil { t.Fatalf("auto migrate: %v", err) } service := NewService(config.Config{ RoomTurnoverReward: config.RoomTurnoverRewardConfig{ DefaultSysOrigin: "LIKEI", Timezone: "Asia/Riyadh", }, }, db) return service, db } func TestGetConfigReturnsDefaultLevelsWhenMissing(t *testing.T) { service, _ := newTestService(t) resp, err := service.GetConfig(context.Background(), "") if err != nil { t.Fatalf("GetConfig() error = %v", err) } if resp.Configured || resp.Enabled { t.Fatalf("GetConfig() configured/enabled = %v/%v, want false/false", resp.Configured, resp.Enabled) } if resp.SysOrigin != "LIKEI" || resp.Timezone != "Asia/Riyadh" { t.Fatalf("GetConfig() sys/timezone = %q/%q", resp.SysOrigin, resp.Timezone) } if len(resp.LevelConfigs) != 4 { t.Fatalf("default level count = %d, want 4", len(resp.LevelConfigs)) } if got := resp.LevelConfigs[3]; got.TurnoverThreshold != 5000000 || got.RewardGold != 250000 { t.Fatalf("highest default level = %+v", got) } } func TestSaveConfigRejectsDuplicateThreshold(t *testing.T) { service, _ := newTestService(t) _, err := service.SaveConfig(context.Background(), SaveRoomTurnoverRewardConfigRequest{ SysOrigin: "LIKEI", Enabled: true, Timezone: "Asia/Riyadh", LevelConfigs: []RoomTurnoverRewardLevelInput{ {Level: 1, TurnoverThreshold: 100000, RewardGold: 2000, Enabled: true}, {Level: 2, TurnoverThreshold: 100000, RewardGold: 3000, Enabled: true}, }, }) if err == nil { t.Fatalf("SaveConfig() error = nil, want duplicate threshold error") } } func TestSaveConfigUpsertsBySysOrigin(t *testing.T) { service, _ := newTestService(t) ctx := context.Background() first, err := service.SaveConfig(ctx, SaveRoomTurnoverRewardConfigRequest{ SysOrigin: "likei", Enabled: true, Timezone: "Asia/Riyadh", LevelConfigs: []RoomTurnoverRewardLevelInput{ {Level: 1, TurnoverThreshold: 100000, RewardGold: 2000, Enabled: true}, }, }) if err != nil { t.Fatalf("first SaveConfig() error = %v", err) } second, err := service.SaveConfig(ctx, SaveRoomTurnoverRewardConfigRequest{ SysOrigin: "LIKEI", Enabled: true, Timezone: "Asia/Riyadh", LevelConfigs: []RoomTurnoverRewardLevelInput{ {Level: 1, TurnoverThreshold: 200000, RewardGold: 5000, Enabled: true}, }, }) if err != nil { t.Fatalf("second SaveConfig() error = %v", err) } if first.ID != second.ID { t.Fatalf("config ID changed on upsert: first=%d second=%d", first.ID, second.ID) } if got := second.LevelConfigs[0]; got.TurnoverThreshold != 200000 || got.RewardGold != 5000 { t.Fatalf("upserted level = %+v", got) } }