271 lines
5.9 KiB
Go
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())
|
|
}
|
|
|
|
}
|