package database import ( "testing" "github.com/DATA-DOG/go-sqlmock" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" ) func newMockDB(t *testing.T) (*gorm.DB, sqlmock.Sqlmock, func()) { t.Helper() sqlDB, mock, err := sqlmock.New() if err != nil { t.Fatalf("sqlmock.New: %v", err) } gdb, err := gorm.Open(mysql.New(mysql.Config{ Conn: sqlDB, SkipInitializeWithVersion: true, }), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) if err != nil { _ = sqlDB.Close() t.Fatalf("gorm.Open: %v", err) } return gdb, mock, func() { _ = sqlDB.Close() } } func TestRepairSmokeAINextSmokeIndexesRecreatesBrokenIndex(t *testing.T) { t.Parallel() db, mock, cleanup := newMockDB(t) defer cleanup() mock.ExpectQuery("SHOW INDEX FROM `fa_smoke_ai_next_smoke` WHERE Key_name = \\?"). WithArgs("uniq_smoke_ai_next_node"). WillReturnRows( sqlmock.NewRows([]string{"Key_name", "Seq_in_index", "Column_name"}). AddRow("uniq_smoke_ai_next_node", 1, "node_type"). AddRow("uniq_smoke_ai_next_node", 2, "node_at"), ) mock.ExpectExec("ALTER TABLE `fa_smoke_ai_next_smoke` DROP INDEX `uniq_smoke_ai_next_node`"). WillReturnResult(sqlmock.NewResult(0, 0)) mock.ExpectExec("ALTER TABLE `fa_smoke_ai_next_smoke` ADD UNIQUE KEY `uniq_smoke_ai_next_node` \\(`ai_advice_id`,`node_type`,`node_at`\\)"). WillReturnResult(sqlmock.NewResult(0, 0)) if err := repairSmokeAINextSmokeIndexes(db); err != nil { t.Fatalf("repairSmokeAINextSmokeIndexes: %v", err) } if err := mock.ExpectationsWereMet(); err != nil { t.Fatalf("unmet expectations: %v", err) } } func TestRepairSmokeAINextSmokeIndexesKeepsCorrectIndex(t *testing.T) { t.Parallel() db, mock, cleanup := newMockDB(t) defer cleanup() mock.ExpectQuery("SHOW INDEX FROM `fa_smoke_ai_next_smoke` WHERE Key_name = \\?"). WithArgs("uniq_smoke_ai_next_node"). WillReturnRows( sqlmock.NewRows([]string{"Key_name", "Seq_in_index", "Column_name"}). AddRow("uniq_smoke_ai_next_node", 1, "ai_advice_id"). AddRow("uniq_smoke_ai_next_node", 2, "node_type"). AddRow("uniq_smoke_ai_next_node", 3, "node_at"), ) if err := repairSmokeAINextSmokeIndexes(db); err != nil { t.Fatalf("repairSmokeAINextSmokeIndexes: %v", err) } if err := mock.ExpectationsWereMet(); err != nil { t.Fatalf("unmet expectations: %v", err) } }