client_delete_continue_test.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package service
  2. import (
  3. "strconv"
  4. "strings"
  5. "testing"
  6. "github.com/mhsanaei/3x-ui/v3/internal/database"
  7. "github.com/mhsanaei/3x-ui/v3/internal/database/model"
  8. )
  9. func TestDeleteContinuesPastFailedInbound(t *testing.T) {
  10. setupBulkDB(t)
  11. svc := &ClientService{}
  12. inboundSvc := &InboundService{}
  13. source := []model.Client{{Email: "spread@x", ID: "cccccccc-0000-0000-0000-000000000001", SubID: "sub-spread", Enable: true}}
  14. ib1 := mkInbound(t, 23001, model.VLESS, clientsSettings(t, source))
  15. ib2 := mkInbound(t, 23002, model.VLESS, clientsSettings(t, source))
  16. ib3 := mkInbound(t, 23003, model.VLESS, clientsSettings(t, source))
  17. for _, ib := range []*model.Inbound{ib1, ib2, ib3} {
  18. if err := svc.SyncInbound(nil, ib.Id, source); err != nil {
  19. t.Fatalf("seed linkage for %d: %v", ib.Id, err)
  20. }
  21. }
  22. rec := lookupClientRecord(t, "spread@x")
  23. missingNode := 9999
  24. if err := database.GetDB().Model(&model.Inbound{}).Where("id = ?", ib2.Id).
  25. Update("node_id", missingNode).Error; err != nil {
  26. t.Fatalf("point inbound 2 at a missing node: %v", err)
  27. }
  28. _, err := svc.Delete(inboundSvc, rec.Id, false)
  29. if err == nil {
  30. t.Fatalf("Delete with a failing inbound succeeded, want error")
  31. }
  32. if !strings.Contains(err.Error(), "inbound "+strconv.Itoa(ib2.Id)) {
  33. t.Fatalf("Delete error = %q, want it to name inbound %d", err, ib2.Id)
  34. }
  35. for _, ib := range []*model.Inbound{ib1, ib3} {
  36. if settingsHoldUUID(t, inboundSvc, ib.Id, "spread@x") {
  37. t.Fatalf("inbound %d still holds the client after Delete", ib.Id)
  38. }
  39. }
  40. if _, err := svc.GetByID(rec.Id); err != nil {
  41. t.Fatalf("record removed despite a failed inbound: %v", err)
  42. }
  43. if err := database.GetDB().Model(&model.Inbound{}).Where("id = ?", ib2.Id).
  44. Update("node_id", nil).Error; err != nil {
  45. t.Fatalf("repair inbound 2: %v", err)
  46. }
  47. if _, err := svc.Delete(inboundSvc, rec.Id, false); err != nil {
  48. t.Fatalf("retry Delete: %v", err)
  49. }
  50. if _, err := svc.GetByID(rec.Id); err == nil {
  51. t.Fatalf("record still present after successful retry")
  52. }
  53. if settingsHoldUUID(t, inboundSvc, ib2.Id, "spread@x") {
  54. t.Fatalf("inbound 2 still holds the client after retry")
  55. }
  56. }