Dragon-Knight/internal/drops/drops_test.go
2025-08-08 23:14:47 -05:00

271 lines
5.9 KiB
Go

package drops
import (
"os"
"testing"
"dk/internal/database"
)
func setupTestDB(t *testing.T) *database.DB {
testDB := "test_drops.db"
t.Cleanup(func() {
os.Remove(testDB)
})
db, err := database.Open(testDB)
if err != nil {
t.Fatalf("Failed to open test database: %v", err)
}
// Create drops table
createTable := `CREATE TABLE drops (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL DEFAULT '',
level INTEGER NOT NULL DEFAULT 0,
type INTEGER NOT NULL DEFAULT 0,
att TEXT NOT NULL DEFAULT ''
)`
if err := db.Exec(createTable); err != nil {
t.Fatalf("Failed to create drops table: %v", err)
}
// Insert test data
testDrops := `INSERT INTO drops (name, level, type, att) VALUES
('Life Pebble', 1, 1, 'maxhp,10'),
('Magic Stone', 10, 1, 'maxmp,25'),
('Dragon''s Scale', 10, 1, 'defensepower,25'),
('Angel''s Joy', 25, 1, 'maxhp,25,strength,25')`
if err := db.Exec(testDrops); err != nil {
t.Fatalf("Failed to insert test drops: %v", err)
}
return db
}
func TestFind(t *testing.T) {
db := setupTestDB(t)
defer db.Close()
// Test finding existing drop
drop, err := Find(db, 1)
if err != nil {
t.Fatalf("Failed to find drop: %v", err)
}
if drop.ID != 1 {
t.Errorf("Expected ID 1, got %d", drop.ID)
}
if drop.Name != "Life Pebble" {
t.Errorf("Expected name 'Life Pebble', got '%s'", drop.Name)
}
if drop.Level != 1 {
t.Errorf("Expected level 1, got %d", drop.Level)
}
if drop.Type != TypeConsumable {
t.Errorf("Expected type %d, got %d", TypeConsumable, drop.Type)
}
if drop.Att != "maxhp,10" {
t.Errorf("Expected att1 'maxhp,10', got '%s'", drop.Att)
}
// Test finding non-existent drop
_, err = Find(db, 999)
if err == nil {
t.Error("Expected error when finding non-existent drop")
}
}
func TestAll(t *testing.T) {
db := setupTestDB(t)
defer db.Close()
drops, err := All(db)
if err != nil {
t.Fatalf("Failed to get all drops: %v", err)
}
if len(drops) != 4 {
t.Errorf("Expected 4 drops, got %d", len(drops))
}
// Check first drop
if drops[0].Name != "Life Pebble" {
t.Errorf("Expected first drop to be 'Life Pebble', got '%s'", drops[0].Name)
}
}
func TestByLevel(t *testing.T) {
db := setupTestDB(t)
defer db.Close()
// Test drops available at level 10
drops, err := ByLevel(db, 10)
if err != nil {
t.Fatalf("Failed to get drops by level: %v", err)
}
if len(drops) != 3 {
t.Errorf("Expected 3 drops at level 10, got %d", len(drops))
}
// Verify they are ordered by level
if drops[0].Level != 1 {
t.Errorf("Expected first drop level 1, got %d", drops[0].Level)
}
if drops[1].Level != 10 {
t.Errorf("Expected second drop level 10, got %d", drops[1].Level)
}
// Test drops available at level 1
lowLevelDrops, err := ByLevel(db, 1)
if err != nil {
t.Fatalf("Failed to get drops by level 1: %v", err)
}
if len(lowLevelDrops) != 1 {
t.Errorf("Expected 1 drop at level 1, got %d", len(lowLevelDrops))
}
}
func TestByType(t *testing.T) {
db := setupTestDB(t)
defer db.Close()
consumables, err := ByType(db, TypeConsumable)
if err != nil {
t.Fatalf("Failed to get consumable drops: %v", err)
}
if len(consumables) != 4 {
t.Errorf("Expected 4 consumable drops, got %d", len(consumables))
}
// Verify they are ordered by level, then ID
if consumables[0].Level > consumables[1].Level {
t.Error("Expected drops to be ordered by level")
}
}
func TestBuilder(t *testing.T) {
db := setupTestDB(t)
defer db.Close()
// Create new drop using builder
drop, err := NewBuilder(db).
WithName("Test Drop").
WithLevel(15).
WithType(TypeConsumable).
WithAtt("strength,20,dexterity,15").
Create()
if err != nil {
t.Fatalf("Failed to create drop with builder: %v", err)
}
if drop.ID == 0 {
t.Error("Expected non-zero ID after creation")
}
if drop.Name != "Test Drop" {
t.Errorf("Expected name 'Test Drop', got '%s'", drop.Name)
}
if drop.Level != 15 {
t.Errorf("Expected level 15, got %d", drop.Level)
}
if drop.Type != TypeConsumable {
t.Errorf("Expected type %d, got %d", TypeConsumable, drop.Type)
}
if drop.Att != "strength,20,dexterity,15" {
t.Errorf("Expected att 'strength,20,dexterity,15', got '%s'", drop.Att)
}
// Verify it was saved to database
foundDrop, err := Find(db, drop.ID)
if err != nil {
t.Fatalf("Failed to find created drop: %v", err)
}
if foundDrop.Name != "Test Drop" {
t.Errorf("Created drop not found in database")
}
}
func TestSave(t *testing.T) {
db := setupTestDB(t)
defer db.Close()
drop, err := Find(db, 1)
if err != nil {
t.Fatalf("Failed to find drop: %v", err)
}
// Modify drop
drop.Name = "Updated Life Pebble"
drop.Level = 5
drop.Att = "maxhp,15"
// Save changes
err = drop.Save()
if err != nil {
t.Fatalf("Failed to save drop: %v", err)
}
// Verify changes were saved
updatedDrop, err := Find(db, 1)
if err != nil {
t.Fatalf("Failed to find updated drop: %v", err)
}
if updatedDrop.Name != "Updated Life Pebble" {
t.Errorf("Expected updated name 'Updated Life Pebble', got '%s'", updatedDrop.Name)
}
if updatedDrop.Level != 5 {
t.Errorf("Expected updated level 5, got %d", updatedDrop.Level)
}
if updatedDrop.Att != "maxhp,15" {
t.Errorf("Expected updated att 'maxhp,15', got '%s'", updatedDrop.Att)
}
}
func TestDelete(t *testing.T) {
db := setupTestDB(t)
defer db.Close()
drop, err := Find(db, 1)
if err != nil {
t.Fatalf("Failed to find drop: %v", err)
}
// Delete drop
err = drop.Delete()
if err != nil {
t.Fatalf("Failed to delete drop: %v", err)
}
// Verify drop was deleted
_, err = Find(db, 1)
if err == nil {
t.Error("Expected error when finding deleted drop")
}
}
func TestDropMethods(t *testing.T) {
db := setupTestDB(t)
defer db.Close()
pebble, _ := Find(db, 1)
// Test IsConsumable
if !pebble.IsConsumable() {
t.Error("Expected pebble to be consumable")
}
// Test TypeName
if pebble.TypeName() != "Consumable" {
t.Errorf("Expected pebble type name 'Consumable', got '%s'", pebble.TypeName())
}
}