1
0

sub_fetch_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package sub
  2. import (
  3. "net/http"
  4. "net/http/httptest"
  5. "testing"
  6. "time"
  7. "github.com/gin-gonic/gin"
  8. "github.com/mhsanaei/3x-ui/v3/internal/database"
  9. "github.com/mhsanaei/3x-ui/v3/internal/database/model"
  10. "github.com/mhsanaei/3x-ui/v3/internal/xray"
  11. )
  12. func TestRecordSubscriptionFetch(t *testing.T) {
  13. initSubDB(t)
  14. db := database.GetDB()
  15. clients := []model.ClientRecord{
  16. {Email: "[email protected]", SubID: "sub-alpha", Enable: true},
  17. {Email: "[email protected]", SubID: "sub-bravo", Enable: true},
  18. }
  19. for i := range clients {
  20. if err := db.Create(&clients[i]).Error; err != nil {
  21. t.Fatalf("create client %s: %v", clients[i].Email, err)
  22. }
  23. if err := db.Create(&xray.ClientTraffic{Email: clients[i].Email}).Error; err != nil {
  24. t.Fatalf("create traffic %s: %v", clients[i].Email, err)
  25. }
  26. }
  27. before := time.Now().UnixMilli()
  28. if err := (&SubService{}).RecordSubscriptionFetch("sub-alpha"); err != nil {
  29. t.Fatalf("RecordSubscriptionFetch: %v", err)
  30. }
  31. var alpha, bravo xray.ClientTraffic
  32. if err := db.Where("email = ?", "[email protected]").First(&alpha).Error; err != nil {
  33. t.Fatalf("load alpha traffic: %v", err)
  34. }
  35. if err := db.Where("email = ?", "[email protected]").First(&bravo).Error; err != nil {
  36. t.Fatalf("load bravo traffic: %v", err)
  37. }
  38. if alpha.LastSubFetch < before {
  39. t.Fatalf("alpha lastSubFetch = %d, want >= %d", alpha.LastSubFetch, before)
  40. }
  41. if bravo.LastSubFetch != 0 {
  42. t.Fatalf("bravo lastSubFetch = %d, want 0", bravo.LastSubFetch)
  43. }
  44. if err := (&SubService{}).RecordSubscriptionFetch("unknown"); err != nil {
  45. t.Fatalf("unknown subId: %v", err)
  46. }
  47. if err := (&SubService{}).RecordSubscriptionFetch(""); err != nil {
  48. t.Fatalf("empty subId: %v", err)
  49. }
  50. }
  51. func TestRecordSubscriptionFetchStatusGate(t *testing.T) {
  52. initSubDB(t)
  53. db := database.GetDB()
  54. client := &model.ClientRecord{Email: "[email protected]", SubID: "sub-alpha", Enable: true}
  55. if err := db.Create(client).Error; err != nil {
  56. t.Fatalf("create client: %v", err)
  57. }
  58. if err := db.Create(&xray.ClientTraffic{Email: client.Email}).Error; err != nil {
  59. t.Fatalf("create traffic: %v", err)
  60. }
  61. controller := &SUBController{subService: &SubService{}}
  62. notFoundRecorder := httptest.NewRecorder()
  63. notFound, _ := gin.CreateTestContext(notFoundRecorder)
  64. notFound.Request = httptest.NewRequest(http.MethodGet, "/sub/sub-alpha", nil)
  65. notFound.Params = gin.Params{{Key: "subid", Value: "sub-alpha"}}
  66. notFound.Status(http.StatusNotFound)
  67. controller.recordSubscriptionFetch(notFound)
  68. var traffic xray.ClientTraffic
  69. if err := db.Where("email = ?", client.Email).First(&traffic).Error; err != nil {
  70. t.Fatalf("load traffic after 404: %v", err)
  71. }
  72. if traffic.LastSubFetch != 0 {
  73. t.Fatalf("404 updated lastSubFetch to %d", traffic.LastSubFetch)
  74. }
  75. okRecorder := httptest.NewRecorder()
  76. ok, _ := gin.CreateTestContext(okRecorder)
  77. ok.Request = httptest.NewRequest(http.MethodGet, "/sub/sub-alpha", nil)
  78. ok.Params = gin.Params{{Key: "subid", Value: "sub-alpha"}}
  79. ok.Status(http.StatusOK)
  80. controller.recordSubscriptionFetch(ok)
  81. if err := db.Where("email = ?", client.Email).First(&traffic).Error; err != nil {
  82. t.Fatalf("load traffic after 200: %v", err)
  83. }
  84. if traffic.LastSubFetch == 0 {
  85. t.Fatal("200 did not update lastSubFetch")
  86. }
  87. }