diff --git a/internal/service/voiceroomrocket/energy.go b/internal/service/voiceroomrocket/energy.go index df47451..47b5884 100644 --- a/internal/service/voiceroomrocket/energy.go +++ b/internal/service/voiceroomrocket/energy.go @@ -207,7 +207,7 @@ func containsGiftToken(list []string, token string) bool { func isDefaultBlockedGiftToken(token string) bool { switch normalizeGiftToken(token) { - case "BACKPACK", "BAG", "DIAMOND", "LUCKY", "ACTIVITY", "CP", "MAGIC", "FREE": + case "DIAMOND", "LUCKY", "ACTIVITY", "CP", "MAGIC", "FREE": return true default: return false diff --git a/internal/service/voiceroomrocket/event_test.go b/internal/service/voiceroomrocket/event_test.go index 57363d9..471f68e 100644 --- a/internal/service/voiceroomrocket/event_test.go +++ b/internal/service/voiceroomrocket/event_test.go @@ -217,11 +217,83 @@ func TestDecodeGiftEventPayloadEnvelope(t *testing.T) { } } -func TestGiftEnergyRulesRejectUnsupportedAndAllowConfiguredGift(t *testing.T) { +func TestBackpackGiftIncreasesRocketEnergy(t *testing.T) { service, db := newTestService(t) ctx := context.Background() seedRocketConfig(t, db) - seedLevelConfigs(t, db, []int64{100, 200, 300, 400, 500, 600}) + seedLevelConfigs(t, db, []int64{1000, 2000, 3000, 4000, 5000, 6000}) + + payloads := []struct { + raw string + energy int64 + }{ + { + energy: 30, + raw: `{ + "trackId":"track-root-bag-gift", + "sysOrigin":"LIKEI", + "sendUserId":"1001", + "roomId":"9001", + "quantity":1, + "bagGift":true, + "giftConfig":{"id":"11","giftCandy":30,"type":"GOLD","giftTab":"NORMAL"}, + "giftValue":{"actualAmount":30}, + "createTime":` + strconvFormatMillis(time.Now()) + ` + }`, + }, + { + energy: 40, + raw: `{ + "trackId":"track-value-bag-gift", + "sysOrigin":"LIKEI", + "sendUserId":"1001", + "roomId":"9001", + "quantity":1, + "giftConfig":{"id":"11","giftCandy":40,"type":"GOLD","giftTab":"NORMAL"}, + "giftValue":{"actualAmount":40,"bag":true}, + "createTime":` + strconvFormatMillis(time.Now().Add(time.Second)) + ` + }`, + }, + } + for _, payload := range payloads { + processed, err := service.ProcessGiftPayload(ctx, payload.raw) + if err != nil { + t.Fatalf("ProcessGiftPayload(backpack) error = %v", err) + } + if !processed.Processed || processed.AcceptedEnergy != payload.energy { + t.Fatalf("processed = %+v, want accepted energy %d", processed, payload.energy) + } + } + + var status model.VoiceRoomRocketStatus + if err := db.Where("sys_origin = ? AND room_id = ?", "LIKEI", 9001). + First(&status).Error; err != nil { + t.Fatalf("find status: %v", err) + } + if status.CurrentEnergy != 70 { + t.Fatalf("current energy = %d, want 70", status.CurrentEnergy) + } + + var logs []model.VoiceRoomRocketGiftEventLog + if err := db.Where("track_id IN ?", []string{"track-root-bag-gift", "track-value-bag-gift"}). + Find(&logs).Error; err != nil { + t.Fatalf("find logs: %v", err) + } + if len(logs) != 2 { + t.Fatalf("logs = %d, want 2", len(logs)) + } + for _, log := range logs { + if log.Status != eventStatusSuccess || log.AcceptedEnergy <= 0 { + t.Fatalf("log = %+v, want success with accepted energy", log) + } + } +} + +func TestGiftEnergyRulesAllowBackpackAndConfiguredGift(t *testing.T) { + service, db := newTestService(t) + ctx := context.Background() + seedRocketConfig(t, db) + seedLevelConfigs(t, db, []int64{1000, 2000, 3000, 4000, 5000, 6000}) backpackPayload := `{ "trackId":"track-backpack", @@ -232,12 +304,12 @@ func TestGiftEnergyRulesRejectUnsupportedAndAllowConfiguredGift(t *testing.T) { "giftConfig":{"id":"11","giftCandy":99,"type":"GOLD","giftTab":"BACKPACK"}, "createTime":` + strconvFormatMillis(time.Now()) + ` }` - ignored, err := service.ProcessGiftPayload(ctx, backpackPayload) + backpack, err := service.ProcessGiftPayload(ctx, backpackPayload) if err != nil { t.Fatalf("ProcessGiftPayload(backpack) error = %v", err) } - if ignored.Processed || ignored.Reason != "unsupported_gift" { - t.Fatalf("ignored = %+v, want unsupported_gift", ignored) + if !backpack.Processed || backpack.AcceptedEnergy != 99 { + t.Fatalf("backpack = %+v, want 99 energy", backpack) } if err := db.Model(&model.VoiceRoomRocketConfig{}).