1
0

node_client_weekly_renew_test.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package service
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/mhsanaei/3x-ui/v3/internal/database/model"
  6. "github.com/mhsanaei/3x-ui/v3/internal/xray"
  7. )
  8. func TestNodeWeeklyRenew_AdoptsNewPeriod(t *testing.T) {
  9. db := initTrafficTestDB(t)
  10. createNodeInbound(t, db, 1, "n1-weekly", 41011)
  11. svc := &InboundService{}
  12. first := time.Date(2030, time.January, 7, 0, 0, 0, 0, time.UTC).UnixMilli()
  13. second := first + 7*86400000
  14. client := model.Client{Email: "node-weekly", ID: "11111111-1111-1111-1111-111111111111", Enable: true, ResetWeekday: 1, ResetMax: 4, ExpiryTime: first}
  15. stats := xray.ClientTraffic{Email: client.Email, Enable: true, ResetWeekday: 1, ResetMax: 4, ResetCount: 2, ExpiryTime: first}
  16. syncNodeWithSettings(t, svc, 1, "n1-weekly", clientsSettings(t, []model.Client{client}), stats)
  17. seeded := readTraffic(t, db, client.Email)
  18. if seeded.ResetMax != 4 || seeded.ResetCount != 2 || seeded.ResetWeekday != 1 {
  19. t.Fatalf("node adoption lost renewal policy: %+v", seeded)
  20. }
  21. stats.Up, stats.Down = 500, 100
  22. syncNodeWithSettings(t, svc, 1, "n1-weekly", clientsSettings(t, []model.Client{client}), stats)
  23. if err := db.Model(&xray.ClientTraffic{}).Where("email = ?", client.Email).Update("enable", false).Error; err != nil {
  24. t.Fatal(err)
  25. }
  26. if err := db.Create(&model.ClientGlobalTraffic{MasterGuid: "other", Email: client.Email, Up: 90}).Error; err != nil {
  27. t.Fatal(err)
  28. }
  29. client.ExpiryTime, stats.ExpiryTime = second, second
  30. stats.Up, stats.Down, stats.ResetCount = 0, 0, 3
  31. syncNodeWithSettings(t, svc, 1, "n1-weekly", clientsSettings(t, []model.Client{client}), stats)
  32. got := readTraffic(t, db, client.Email)
  33. if got.ExpiryTime != second || got.ResetCount != 3 || got.ResetMax != 4 || got.ResetWeekday != 1 || !got.Enable || got.Up != 0 || got.Down != 0 {
  34. t.Fatalf("node weekly renewal was not adopted: %+v", got)
  35. }
  36. var count int64
  37. if err := db.Model(&model.ClientGlobalTraffic{}).Where("email = ?", client.Email).Count(&count).Error; err != nil || count != 0 {
  38. t.Fatalf("stale global traffic count/error = %d/%v, want 0/nil", count, err)
  39. }
  40. var record model.ClientRecord
  41. if err := db.Where("email = ?", client.Email).First(&record).Error; err != nil {
  42. t.Fatal(err)
  43. }
  44. if record.ResetWeekday != 1 || record.ExpiryTime != second {
  45. t.Fatalf("node weekly client record lost schedule: %+v", record)
  46. }
  47. stats.Up, stats.Down = 20, 8
  48. syncNodeWithSettings(t, svc, 1, "n1-weekly", clientsSettings(t, []model.Client{client}), stats)
  49. assertUpDown(t, readTraffic(t, db, client.Email), 20, 8, "new weekly period")
  50. }