package strategy import ( "bindbox-game/internal/repository/mysql/dao" "bindbox-game/internal/repository/mysql/model" "context" "crypto/sha256" "fmt" "testing" "gorm.io/driver/sqlite" "gorm.io/gorm" ) func TestIchibanProofHasSeedHash(t *testing.T) { // 1. Setup In-Memory DB db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) if err != nil { t.Fatalf("db open err: %v", err) } // 2. Migrate Tables db.Exec(`CREATE TABLE activities (id INTEGER PRIMARY KEY AUTOINCREMENT, commitment_seed_master BLOB, commitment_state_version INTEGER, deleted_at DATETIME);`) db.Exec(`CREATE TABLE activity_reward_settings (id INTEGER PRIMARY KEY AUTOINCREMENT, created_at DATETIME, updated_at DATETIME, issue_id INTEGER NOT NULL, product_id INTEGER, name TEXT NOT NULL, weight INTEGER NOT NULL, quantity INTEGER NOT NULL, original_qty INTEGER NOT NULL, level INTEGER NOT NULL, sort INTEGER NOT NULL, is_boss INTEGER NOT NULL, deleted_at DATETIME);`) q := dao.Use(db) // 3. Insert Test Data seedBytes := []byte("testseedvalue") expectedHash := fmt.Sprintf("%x", sha256.Sum256(seedBytes)) db.Exec("INSERT INTO activities (id, commitment_seed_master, commitment_state_version) VALUES (?, ?, ?)", 100, seedBytes, 1) r1 := &model.ActivityRewardSettings{IssueID: 10, Name: "A", Weight: 10, Quantity: 10, OriginalQty: 5, Level: 1, Sort: 1} q.ActivityRewardSettings.Create(r1) // 4. Test SelectItemBySlot s := NewIchiban(q, q) ctx := context.Background() _, proof, err := s.SelectItemBySlot(ctx, 100, 10, 0) if err != nil { t.Fatalf("SelectItemBySlot failed: %v", err) } // 5. Verify seed_hash is in proof if proof == nil { t.Fatal("proof is nil") } val, ok := proof["seed_hash"] if !ok { t.Fatal("seed_hash missing from proof") } seedHash, ok := val.(string) if !ok { t.Fatalf("seed_hash is not a string, got %T", val) } if seedHash != expectedHash { t.Fatalf("seed_hash mismatch. got %s, want %s", seedHash, expectedHash) } t.Logf("Success: seed_hash found in proof: %s", seedHash) }