client_weekly_renew_crud_test.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package service
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/mhsanaei/3x-ui/v3/internal/database"
  6. "github.com/mhsanaei/3x-ui/v3/internal/database/model"
  7. )
  8. func TestClientWeeklyRenewCRUD(t *testing.T) {
  9. setupBulkDB(t)
  10. svc, inboundSvc := &ClientService{}, &InboundService{}
  11. first := mkInbound(t, 41701, model.VLESS, `{"clients":[]}`)
  12. second := mkInbound(t, 41702, model.VLESS, `{"clients":[]}`)
  13. client := model.Client{
  14. Email: "weekly-crud", ID: "11111111-1111-1111-1111-111111111111", Enable: true,
  15. ResetWeekday: 7, ResetMax: 3, ExpiryTime: time.Now().Add(-time.Hour).UnixMilli(),
  16. }
  17. if _, err := svc.Create(inboundSvc, &ClientCreatePayload{Client: client, InboundIds: []int{first.Id, second.Id}}); err != nil {
  18. t.Fatal(err)
  19. }
  20. record, err := svc.GetRecordByEmail(nil, client.Email)
  21. if err != nil {
  22. t.Fatal(err)
  23. }
  24. assertSchedule := func(want int) {
  25. t.Helper()
  26. got, err := svc.GetRecordByEmail(nil, client.Email)
  27. if err != nil || got.ResetWeekday != want || got.ToClient().ResetWeekday != want {
  28. t.Fatalf("record schedule/error = %+v/%v, want %d", got, err, want)
  29. }
  30. traffic := readTraffic(t, database.GetDB(), client.Email)
  31. if traffic.ResetWeekday != want || traffic.ResetMax != 3 {
  32. t.Fatalf("traffic policy = %+v, want weekday %d and cap 3", traffic, want)
  33. }
  34. for _, id := range []int{first.Id, second.Id} {
  35. var inbound model.Inbound
  36. if err := database.GetDB().First(&inbound, id).Error; err != nil {
  37. t.Fatal(err)
  38. }
  39. clients, err := inboundSvc.GetClients(&inbound)
  40. if err != nil || len(clients) != 1 || clients[0].ResetWeekday != want {
  41. t.Fatalf("inbound %d schedule/error = %+v/%v, want %d", id, clients, err, want)
  42. }
  43. }
  44. filter := "on"
  45. if want == 0 {
  46. filter = "off"
  47. }
  48. page, err := svc.ListPaged(inboundSvc, nil, ClientPageParams{AutoRenew: filter})
  49. if err != nil || len(page.Items) != 1 || page.Items[0].ResetWeekday != want {
  50. t.Fatalf("renewal filter/projection = %+v/%v, want weekday %d", page, err, want)
  51. }
  52. }
  53. assertSchedule(7)
  54. if deleted, _, err := svc.DelDepleted(inboundSvc); err != nil || deleted != 0 {
  55. t.Fatalf("expired weekly client was purged: deleted/error = %d/%v", deleted, err)
  56. }
  57. for _, weekday := range []int{2, 0} {
  58. updated := *record.ToClient()
  59. updated.ResetWeekday = weekday
  60. if _, err := svc.Update(inboundSvc, record.Id, updated, 0); err != nil {
  61. t.Fatal(err)
  62. }
  63. assertSchedule(weekday)
  64. }
  65. if deleted, _, err := svc.DelDepleted(inboundSvc); err != nil || deleted != 1 {
  66. t.Fatalf("non-renewing expired client was not purged: deleted/error = %d/%v", deleted, err)
  67. }
  68. }