Files
3x-ui-web-src/internal/web/service/client_delete_continue_test.go
T
Sanaei f727d04f65
CI / go-test (push) Canceled after 0s
CI / postgres-durable-first (push) Canceled after 0s
CI / codegen (push) Canceled after 0s
CI / govulncheck (push) Canceled after 0s
CI / race (push) Canceled after 0s
CI / fuzz-smoke (push) Canceled after 0s
CI / golangci (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
CodeQL Advanced / Analyze (go) (push) Canceled after 0s
CodeQL Advanced / Analyze (actions) (push) Canceled after 0s
CodeQL Advanced / Analyze (javascript-typescript) (push) Canceled after 0s
Docs CI / build (push) Canceled after 0s
Docs Deploy (GitHub Pages) / build (push) Canceled after 0s
Release 3X-UI / build (386) (push) Canceled after 0s
Release 3X-UI / build (amd64) (push) Canceled after 0s
Release 3X-UI / build (arm64) (push) Canceled after 0s
Release 3X-UI / build (armv5) (push) Canceled after 0s
Release 3X-UI / build (armv6) (push) Canceled after 0s
Release 3X-UI / build (armv7) (push) Canceled after 0s
Release 3X-UI / build (s390x) (push) Canceled after 0s
Release 3X-UI / Build for Windows (amd64) (push) Canceled after 0s
Deploy Smoke Tests / noninteractive-install (ubuntu-24.04-arm) (push) Canceled after 0s
Deploy Smoke Tests / noninteractive-install (ubuntu-latest) (push) Canceled after 0s
Deploy Smoke Tests / release-tag-install (ubuntu-24.04-arm) (push) Canceled after 0s
Deploy Smoke Tests / release-tag-install (ubuntu-latest) (push) Canceled after 0s
Docs Deploy (GitHub Pages) / deploy (push) Canceled after 0s
Release 3X-UI / Publish rolling dev release (push) Canceled after 0s
v3.7.0
2026-08-24 15:07:15 +02:00

65 lines
2.1 KiB
Go

package service
import (
"strconv"
"strings"
"testing"
"github.com/mhsanaei/3x-ui/v3/internal/database"
"github.com/mhsanaei/3x-ui/v3/internal/database/model"
)
func TestDeleteContinuesPastFailedInbound(t *testing.T) {
setupBulkDB(t)
svc := &ClientService{}
inboundSvc := &InboundService{}
source := []model.Client{{Email: "spread@x", ID: "cccccccc-0000-0000-0000-000000000001", SubID: "sub-spread", Enable: true}}
ib1 := mkInbound(t, 23001, model.VLESS, clientsSettings(t, source))
ib2 := mkInbound(t, 23002, model.VLESS, clientsSettings(t, source))
ib3 := mkInbound(t, 23003, model.VLESS, clientsSettings(t, source))
for _, ib := range []*model.Inbound{ib1, ib2, ib3} {
if err := svc.SyncInbound(nil, ib.Id, source); err != nil {
t.Fatalf("seed linkage for %d: %v", ib.Id, err)
}
}
rec := lookupClientRecord(t, "spread@x")
missingNode := 9999
if err := database.GetDB().Model(&model.Inbound{}).Where("id = ?", ib2.Id).
Update("node_id", missingNode).Error; err != nil {
t.Fatalf("point inbound 2 at a missing node: %v", err)
}
_, err := svc.Delete(inboundSvc, rec.Id, false)
if err == nil {
t.Fatalf("Delete with a failing inbound succeeded, want error")
}
if !strings.Contains(err.Error(), "inbound "+strconv.Itoa(ib2.Id)) {
t.Fatalf("Delete error = %q, want it to name inbound %d", err, ib2.Id)
}
for _, ib := range []*model.Inbound{ib1, ib3} {
if settingsHoldUUID(t, inboundSvc, ib.Id, "spread@x") {
t.Fatalf("inbound %d still holds the client after Delete", ib.Id)
}
}
if _, err := svc.GetByID(rec.Id); err != nil {
t.Fatalf("record removed despite a failed inbound: %v", err)
}
if err := database.GetDB().Model(&model.Inbound{}).Where("id = ?", ib2.Id).
Update("node_id", nil).Error; err != nil {
t.Fatalf("repair inbound 2: %v", err)
}
if _, err := svc.Delete(inboundSvc, rec.Id, false); err != nil {
t.Fatalf("retry Delete: %v", err)
}
if _, err := svc.GetByID(rec.Id); err == nil {
t.Fatalf("record still present after successful retry")
}
if settingsHoldUUID(t, inboundSvc, ib2.Id, "spread@x") {
t.Fatalf("inbound 2 still holds the client after retry")
}
}