inbound_tgbot_lookup_test.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package service
  2. import (
  3. "path/filepath"
  4. "testing"
  5. "github.com/mhsanaei/3x-ui/v3/internal/database"
  6. "github.com/mhsanaei/3x-ui/v3/internal/database/model"
  7. "github.com/mhsanaei/3x-ui/v3/internal/xray"
  8. )
  9. // TestGetClientTrafficTgBot_SettingsSerializationStyles guards against the
  10. // prefilter regressing into a formatting-sensitive string match (#5805): the
  11. // lookup must find clients whether inbounds.settings stores compact JSON
  12. // ("tgId":N, as written by node sync/import) or indented JSON ("tgId": N, as
  13. // written by the panel's MarshalIndent).
  14. func TestGetClientTrafficTgBot_SettingsSerializationStyles(t *testing.T) {
  15. dbDir := t.TempDir()
  16. t.Setenv("XUI_DB_FOLDER", dbDir)
  17. if err := database.InitDB(filepath.Join(dbDir, "x-ui.db")); err != nil {
  18. t.Fatalf("InitDB: %v", err)
  19. }
  20. t.Cleanup(func() { _ = database.CloseDB() })
  21. db := database.GetDB()
  22. const tgId int64 = 123456789
  23. cases := []struct {
  24. name string
  25. settings string
  26. email string
  27. port int
  28. }{
  29. {"compact", `{"clients":[{"id":"u1","email":"compact-user","tgId":123456789}]}`, "compact-user", 41001},
  30. {"spaced", `{"clients": [{"id": "u2", "email": "spaced-user", "tgId": 123456789}]}`, "spaced-user", 41002},
  31. }
  32. for _, c := range cases {
  33. inbound := &model.Inbound{UserId: 1, Tag: "tg-" + c.name, Enable: true, Port: c.port, Protocol: model.VLESS, Settings: c.settings}
  34. if err := db.Create(inbound).Error; err != nil {
  35. t.Fatalf("create %s inbound: %v", c.name, err)
  36. }
  37. if err := db.Create(&xray.ClientTraffic{InboundId: inbound.Id, Email: c.email, Enable: true, Up: 10, Down: 20}).Error; err != nil {
  38. t.Fatalf("create %s client_traffics: %v", c.name, err)
  39. }
  40. }
  41. svc := InboundService{}
  42. traffics, err := svc.GetClientTrafficTgBot(tgId)
  43. if err != nil {
  44. t.Fatalf("GetClientTrafficTgBot: %v", err)
  45. }
  46. got := make(map[string]bool, len(traffics))
  47. for _, tr := range traffics {
  48. got[tr.Email] = true
  49. }
  50. if len(traffics) != 2 || !got["compact-user"] || !got["spaced-user"] {
  51. t.Fatalf("expected traffic for compact-user and spaced-user, got %v", got)
  52. }
  53. other, err := svc.GetClientTrafficTgBot(42)
  54. if err != nil {
  55. t.Fatalf("GetClientTrafficTgBot(42): %v", err)
  56. }
  57. if len(other) != 0 {
  58. t.Fatalf("expected no traffic for unknown tgId, got %d rows", len(other))
  59. }
  60. }