prepare_sqlite_test.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package database
  2. import (
  3. "path/filepath"
  4. "strings"
  5. "testing"
  6. "github.com/mhsanaei/3x-ui/v3/internal/database/model"
  7. "gorm.io/driver/sqlite"
  8. "gorm.io/gorm"
  9. "gorm.io/gorm/logger"
  10. )
  11. func TestPrepareSQLiteForMigration(t *testing.T) {
  12. t.Run("rejects non-panel database", func(t *testing.T) {
  13. dbPath := filepath.Join(t.TempDir(), "random.db")
  14. gdb, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{Logger: logger.Discard})
  15. if err != nil {
  16. t.Fatalf("open sqlite: %v", err)
  17. }
  18. if err := gdb.Exec("CREATE TABLE notes(id integer primary key, body text)").Error; err != nil {
  19. t.Fatalf("create table: %v", err)
  20. }
  21. closeGorm(gdb)
  22. err = PrepareSQLiteForMigration(dbPath)
  23. if err == nil {
  24. t.Fatal("PrepareSQLiteForMigration accepted a non-panel database, want error")
  25. }
  26. if !strings.Contains(err.Error(), "not a 3x-ui panel database") {
  27. t.Fatalf("error = %q, want it to contain %q", err.Error(), "not a 3x-ui panel database")
  28. }
  29. })
  30. t.Run("upgrades old panel schema", func(t *testing.T) {
  31. dbPath := filepath.Join(t.TempDir(), "old.db")
  32. gdb, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{Logger: logger.Discard})
  33. if err != nil {
  34. t.Fatalf("open sqlite: %v", err)
  35. }
  36. if err := gdb.AutoMigrate(&model.User{}, &model.Setting{}, &model.Inbound{}); err != nil {
  37. t.Fatalf("automigrate legacy subset: %v", err)
  38. }
  39. closeGorm(gdb)
  40. if err := PrepareSQLiteForMigration(dbPath); err != nil {
  41. t.Fatalf("PrepareSQLiteForMigration rejected an old panel database: %v", err)
  42. }
  43. check, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{Logger: logger.Discard})
  44. if err != nil {
  45. t.Fatalf("reopen sqlite: %v", err)
  46. }
  47. defer closeGorm(check)
  48. sqlDB, err := check.DB()
  49. if err != nil {
  50. t.Fatalf("sql db: %v", err)
  51. }
  52. for _, table := range []string{"client_groups", "client_global_traffics", "outbound_subscriptions"} {
  53. if !sqliteTableExists(sqlDB, table) {
  54. t.Errorf("table %s was not created by the schema upgrade", table)
  55. }
  56. }
  57. })
  58. }