package model import ( "path/filepath" "testing" "github.com/glebarez/sqlite" "gorm.io/gorm" ) func openTestSQLiteDB(t *testing.T, name string) *gorm.DB { t.Helper() db, err := gorm.Open(sqlite.Open(filepath.Join(t.TempDir(), name)), &gorm.Config{}) if err != nil { t.Fatalf("open sqlite db: %v", err) } if err := autoMigrateAll(db); err != nil { t.Fatalf("auto migrate db: %v", err) } sqlDB, err := db.DB() if err != nil { t.Fatalf("get sql db: %v", err) } t.Cleanup(func() { _ = sqlDB.Close() }) return db } func findDBModelByTableName(t *testing.T, tableName string) dbModel { t.Helper() models, err := buildDBModels() if err != nil { t.Fatalf("build db models: %v", err) } for _, item := range models { if item.tableName == tableName { return item } } t.Fatalf("db model not found for table %s", tableName) return dbModel{} } func TestIsDatabaseEmpty(t *testing.T) { db := openTestSQLiteDB(t, "empty.db") empty, err := isDatabaseEmpty(db) if err != nil { t.Fatalf("isDatabaseEmpty returned error: %v", err) } if !empty { t.Fatal("expected database to be empty") } if err := db.Create(&User{ Username: "alice", Password: "secret", DisplayName: "Alice", Role: 1, Status: 1, }).Error; err != nil { t.Fatalf("seed user: %v", err) } empty, err = isDatabaseEmpty(db) if err != nil { t.Fatalf("isDatabaseEmpty after seed returned error: %v", err) } if empty { t.Fatal("expected database to be non-empty") } } func TestMigrateTableDataCopiesRows(t *testing.T) { source := openTestSQLiteDB(t, "source.db") target := openTestSQLiteDB(t, "target.db") user := User{ Id: 1, Username: "root", Password: "hashed", DisplayName: "Root User", Role: 100, Status: 1, } option := Option{ Key: "AgentHeartbeatInterval", Value: "10000", } if err := source.Create(&user).Error; err != nil { t.Fatalf("seed source user: %v", err) } if err := source.Create(&option).Error; err != nil { t.Fatalf("seed source option: %v", err) } if err := migrateTableData(source, target, findDBModelByTableName(t, "users")); err != nil { t.Fatalf("migrate users: %v", err) } if err := migrateTableData(source, target, findDBModelByTableName(t, "options")); err != nil { t.Fatalf("migrate options: %v", err) } var gotUser User if err := target.First(&gotUser, 1).Error; err != nil { t.Fatalf("query migrated user: %v", err) } if gotUser.Username != user.Username || gotUser.DisplayName != user.DisplayName { t.Fatalf("unexpected migrated user: %+v", gotUser) } var gotOption Option if err := target.First(&gotOption, "key = ?", option.Key).Error; err != nil { t.Fatalf("query migrated option: %v", err) } if gotOption.Value != option.Value { t.Fatalf("unexpected migrated option value: %s", gotOption.Value) } }