Files
bd2/go/internal/server/gamedata/database_test.go
T
Flechazo 5b5a219dc2 feat(server): add special loot and data-driven gameplay rules
Generate equipment loot atomically, grant random boxes and prevent repeat claims.
Read gacha pools, pity, products, tickets, missions, presets, chapter rewards
and inventory costs from GameData; extend both collaboration UR ticket pools.
Sync owned recipes, configure startup state and calendars in versioned seeds,
and validate unlock tickets and revival talents.
2026-10-04 19:15:59 +08:00

95 lines
2.2 KiB
Go

package gamedata
import (
"archive/zip"
"bytes"
"os"
"path/filepath"
"testing"
"bd2server/internal/server/dbcrypt"
)
// These tests cover the production archive/decryption contract. Interactive
// queries against the installed 178 MB GameData belong in tools/gamedata_db.py
// so ordinary Go tests never double as an ad-hoc database console.
func TestReadDatabase(t *testing.T) {
root := t.TempDir()
release := filepath.Join(root, "123", "release")
if err := os.MkdirAll(release, 0o755); err != nil {
t.Fatal(err)
}
plain := make([]byte, dbcrypt.PageSize)
copy(plain, dbcrypt.Header)
copy(plain[100:], []byte("CREATE TABLE QuestTable21"))
encrypted, err := dbcrypt.EncryptPages(plain)
if err != nil {
t.Fatal(err)
}
name, err := DatabaseName("pack21")
if err != nil {
t.Fatal(err)
}
writeDatabaseTestArchive(t, filepath.Join(release, ArchiveName), name, encrypted)
got, err := ReadDatabase(root, "123", "pack21")
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(got, plain) {
t.Fatal("decrypted database mismatch")
}
}
func TestReadQuestDatabase(t *testing.T) {
root := t.TempDir()
release := filepath.Join(root, "123", "release")
if err := os.MkdirAll(release, 0o755); err != nil {
t.Fatal(err)
}
plain := make([]byte, dbcrypt.PageSize)
copy(plain, dbcrypt.Header)
copy(plain[100:], []byte("CREATE TABLE QuestTable21"))
encrypted, err := dbcrypt.EncryptPages(plain)
if err != nil {
t.Fatal(err)
}
member, err := DatabaseName("common")
if err != nil {
t.Fatal(err)
}
writeDatabaseTestArchive(t, filepath.Join(release, ArchiveName), member, encrypted)
got, err := ReadQuestDatabase(root, "123")
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(got, plain) {
t.Fatal("decrypted quest database mismatch")
}
}
func writeDatabaseTestArchive(t *testing.T, path, member string, content []byte) {
t.Helper()
file, err := os.Create(path)
if err != nil {
t.Fatal(err)
}
archive := zip.NewWriter(file)
entry, err := archive.Create(member)
if err != nil {
file.Close()
t.Fatal(err)
}
if _, err := entry.Write(content); err != nil {
archive.Close()
file.Close()
t.Fatal(err)
}
if err := archive.Close(); err != nil {
file.Close()
t.Fatal(err)
}
if err := file.Close(); err != nil {
t.Fatal(err)
}
}