client_delete_node_baseline_test.go 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package service
  2. import (
  3. "testing"
  4. "github.com/mhsanaei/3x-ui/v3/internal/database/model"
  5. )
  6. func TestClientDelete_CleansNodeBaselines(t *testing.T) {
  7. db := initTrafficTestDB(t)
  8. const email = "[email protected]"
  9. rec := &model.ClientRecord{Email: email, SubID: "sub-orphan", Enable: true}
  10. if err := db.Create(rec).Error; err != nil {
  11. t.Fatalf("seed client record: %v", err)
  12. }
  13. if err := db.Create(&model.NodeClientTraffic{NodeId: 1, Email: email, Up: 10, Down: 20}).Error; err != nil {
  14. t.Fatalf("seed node baseline 1: %v", err)
  15. }
  16. if err := db.Create(&model.NodeClientTraffic{NodeId: 2, Email: email, Up: 30, Down: 40}).Error; err != nil {
  17. t.Fatalf("seed node baseline 2: %v", err)
  18. }
  19. svc := &ClientService{}
  20. if _, err := svc.Delete(&InboundService{}, rec.Id, false); err != nil {
  21. t.Fatalf("Delete: %v", err)
  22. }
  23. var cnt int64
  24. if err := db.Model(&model.NodeClientTraffic{}).Where("email = ?", email).Count(&cnt).Error; err != nil {
  25. t.Fatalf("count baselines: %v", err)
  26. }
  27. if cnt != 0 {
  28. t.Errorf("expected node baselines cleaned on client delete, found %d", cnt)
  29. }
  30. }
  31. func TestClientDelete_KeepTrafficPreservesNodeBaselines(t *testing.T) {
  32. db := initTrafficTestDB(t)
  33. const email = "[email protected]"
  34. rec := &model.ClientRecord{Email: email, SubID: "sub-kept", Enable: true}
  35. if err := db.Create(rec).Error; err != nil {
  36. t.Fatalf("seed client record: %v", err)
  37. }
  38. if err := db.Create(&model.NodeClientTraffic{NodeId: 1, Email: email, Up: 10, Down: 20}).Error; err != nil {
  39. t.Fatalf("seed node baseline: %v", err)
  40. }
  41. svc := &ClientService{}
  42. if _, err := svc.Delete(&InboundService{}, rec.Id, true); err != nil {
  43. t.Fatalf("Delete(keepTraffic): %v", err)
  44. }
  45. var cnt int64
  46. if err := db.Model(&model.NodeClientTraffic{}).Where("email = ?", email).Count(&cnt).Error; err != nil {
  47. t.Fatalf("count baselines: %v", err)
  48. }
  49. if cnt != 1 {
  50. t.Errorf("keepTraffic delete must preserve node baselines, found %d", cnt)
  51. }
  52. }
  53. func TestDeleteByEmail_FallbackCleansNodeBaselines(t *testing.T) {
  54. db := initTrafficTestDB(t)
  55. const email = "[email protected]"
  56. ib := &model.Inbound{
  57. UserId: 1,
  58. Tag: "local-fallback",
  59. Enable: true,
  60. Port: 41001,
  61. Protocol: model.VLESS,
  62. Settings: `{"clients": [{"id": "5f2eb9d6-3a2f-4a55-9812-6ea1e2f7a001", "email": "[email protected]", "enable": true}]}`,
  63. }
  64. if err := db.Create(ib).Error; err != nil {
  65. t.Fatalf("seed inbound: %v", err)
  66. }
  67. if err := db.Create(&model.NodeClientTraffic{NodeId: 3, Email: email, Up: 5, Down: 6}).Error; err != nil {
  68. t.Fatalf("seed node baseline: %v", err)
  69. }
  70. svc := &ClientService{}
  71. if _, err := svc.DeleteByEmail(&InboundService{}, email, false); err != nil {
  72. t.Fatalf("DeleteByEmail: %v", err)
  73. }
  74. var cnt int64
  75. if err := db.Model(&model.NodeClientTraffic{}).Where("email = ?", email).Count(&cnt).Error; err != nil {
  76. t.Fatalf("count baselines: %v", err)
  77. }
  78. if cnt != 0 {
  79. t.Errorf("expected node baselines cleaned on record-less delete, found %d", cnt)
  80. }
  81. }