Files
bd2/go/internal/server/missions/user_level_reward_test.go
T
Flechazo d04791dd31 feat(server): add colored logs, level rewards, hunting dispatch and fiend hunt
Persist claims, AP, teams and presets with session receipts and atomic request rollback. Read rewards and growth from GameData; replace fixed Fiend Hunt user state and preserve the account initialization contract.
2026-10-04 21:27:19 +08:00

63 lines
2.2 KiB
Go

package missions
import (
"bd2server/internal/server/gamedata"
"bd2server/internal/server/player"
"bd2server/internal/server/stateio"
"bd2server/internal/server/wire"
"testing"
)
func TestUserLevelRewardEligibilityBatchPersistenceAndRetry(t *testing.T) {
store := stateio.NewMemory()
inv, _ := player.OpenInventory(store, &player.Starter{Version: "2.35.10"})
d := &gamedata.MissionDesign{Achievements: map[gamedata.AchievementKey]gamedata.AchievementDesign{{GroupID: 9, ID: 1}: {AddExp: 10}}}
s, _ := Open(store, d, inv)
levels := &gamedata.AchievementLevelDesign{Levels: []gamedata.AchievementLevel{{ID: 17, NeedEXP: 4, Rewards: []gamedata.Reward{{Type: 8, ID: 987, Count: 3}}}, {ID: 23, NeedEXP: 8, Rewards: []gamedata.Reward{{Type: 8, ID: 988, Count: 7}}}, {ID: 41, NeedEXP: 10, Rewards: []gamedata.Reward{{Type: 8, ID: 989, Count: 9}}}}}
if err := s.AttachUserLevelRewards(levels); err != nil {
t.Fatal(err)
}
req := func(ids ...uint64) []byte {
r := wire.AppendVarint(nil, 1, 1)
for _, id := range ids {
r = wire.AppendVarint(r, 2, id)
}
return r
}
for _, ids := range [][]uint64{{23}, {17, 23}, {17, 17}, {99}} {
if _, _, _, err := s.Handle("/UserLevelReward", req(ids...)); err == nil {
t.Fatalf("accepted %v", ids)
}
}
if len(inv.All()) != 0 {
t.Fatal("invalid batch granted rewards")
}
s.state.Claimed = []string{"achievement:" + achievementName(gamedata.AchievementKey{GroupID: 9, ID: 1})}
if _, _, _, err := s.Handle("/UserLevelReward", req(17, 23, 41)); err == nil {
t.Fatal("accepted unearned level")
}
if _, _, _, err := s.Handle("/UserLevelReward", req(17, 23)); err != nil {
t.Fatal(err)
}
if count, _ := s.LevelRewardCount(); count != 23 {
t.Fatalf("count=%d", count)
}
if len(inv.All()) != 2 || inv.All()[0].Count+inv.All()[1].Count != 10 {
t.Fatalf("items=%+v", inv.All())
}
reopened, _ := Open(store, d, inv)
if err := reopened.AttachUserLevelRewards(levels); err != nil {
t.Fatal(err)
}
reopened.state.Claimed = s.state.Claimed
if _, _, _, err := reopened.Handle("/UserLevelReward", req(17, 23)); err != nil {
t.Fatal(err)
}
if len(inv.All()) != 2 {
t.Fatal("retry granted twice")
}
if n, _ := reopened.LevelRewardCount(); n != 23 {
t.Fatalf("reopened=%d", n)
}
}