inbound_exclude_from_sub_migration_test.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package database
  2. import (
  3. "path/filepath"
  4. "testing"
  5. "github.com/mhsanaei/3x-ui/v3/internal/database/model"
  6. "gorm.io/driver/sqlite"
  7. "gorm.io/gorm"
  8. )
  9. // Legacy inbounds schema without exclude_from_sub — the upgrade path AddColumn must cover.
  10. const legacyInboundNoExcludeFromSubDDL = "CREATE TABLE `inbounds` (`id` integer PRIMARY KEY AUTOINCREMENT,`user_id` integer,`up` integer,`down` integer,`total` integer,`remark` text,`enable` numeric,`expiry_time` integer,`listen` text,`port` integer,`protocol` text,`settings` text,`stream_settings` text,`tag` text UNIQUE,`sniffing` text)"
  11. func TestMigrateInboundExcludeFromSubColumn(t *testing.T) {
  12. dbPath := filepath.Join(t.TempDir(), "x-ui.db")
  13. legacy, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{})
  14. if err != nil {
  15. t.Fatalf("open legacy db: %v", err)
  16. }
  17. if err := legacy.Exec(legacyInboundNoExcludeFromSubDDL).Error; err != nil {
  18. t.Fatalf("create legacy inbounds: %v", err)
  19. }
  20. if err := legacy.Exec(
  21. `INSERT INTO inbounds (user_id, remark, enable, port, protocol, settings, stream_settings, tag, sniffing)
  22. VALUES (1, 'preexisting', 1, 443, 'vless', '{"clients":[]}', '{}', 'in-443-tcp', '{}')`,
  23. ).Error; err != nil {
  24. t.Fatalf("seed legacy inbound: %v", err)
  25. }
  26. sqlDB, err := legacy.DB()
  27. if err != nil {
  28. t.Fatalf("legacy db handle: %v", err)
  29. }
  30. if err := sqlDB.Close(); err != nil {
  31. t.Fatalf("close legacy db: %v", err)
  32. }
  33. if err := InitDB(dbPath); err != nil {
  34. t.Fatalf("InitDB over legacy schema: %v", err)
  35. }
  36. t.Cleanup(func() { _ = CloseDB() })
  37. if !GetDB().Migrator().HasColumn(&model.Inbound{}, "exclude_from_sub") {
  38. t.Fatal("exclude_from_sub column missing after migrateInboundExcludeFromSubColumn")
  39. }
  40. var row model.Inbound
  41. if err := GetDB().Where("tag = ?", "in-443-tcp").First(&row).Error; err != nil {
  42. t.Fatalf("preexisting inbound lost: %v", err)
  43. }
  44. if row.ExcludeFromSub {
  45. t.Fatal("preexisting row must default exclude_from_sub to false, got true")
  46. }
  47. if err := migrateInboundExcludeFromSubColumn(); err != nil {
  48. t.Fatalf("idempotent migrate: %v", err)
  49. }
  50. }