Files
3x-ui-web-src/internal/web/service/inbound_mtproto_desired_test.go
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

71 lines
2.4 KiB
Go

package service
import (
"reflect"
"testing"
"github.com/mhsanaei/3x-ui/v3/internal/database"
"github.com/mhsanaei/3x-ui/v3/internal/database/model"
"github.com/mhsanaei/3x-ui/v3/internal/mtproto"
)
func TestDesiredMtprotoInstancesFiltersDepleted(t *testing.T) {
setupConflictDB(t)
svc := &InboundService{}
seedInboundConflict(t, "mt-desired", "", 46001, model.MTProto,
"",
`{"clients":[`+
`{"email":"alice","secret":"`+mtprotoTestSecretA+`","enable":true},`+
`{"email":"bob","secret":"`+mtprotoTestSecretB+`","enable":true},`+
`{"email":"carol","secret":"`+mtprotoTestSecretC+`","enable":false}]}`)
served := loadInboundByTag(t, "mt-desired")
seedClientTraffic(t, served.Id, "alice", true)
seedClientTraffic(t, served.Id, "bob", false)
seedClientTraffic(t, served.Id, "carol", true)
seedInboundConflict(t, "mt-all-depleted", "", 46002, model.MTProto,
"",
`{"clients":[{"email":"dave","secret":"`+mtprotoTestSecretA+`","enable":true}]}`)
depleted := loadInboundByTag(t, "mt-all-depleted")
seedClientTraffic(t, depleted.Id, "dave", false)
nodeID := 5
seedInboundConflictNode(t, "mt-node-owned", "", 46003, model.MTProto,
"",
`{"clients":[{"email":"erin","secret":"`+mtprotoTestSecretB+`","enable":true}]}`,
&nodeID)
instances, err := svc.DesiredMtprotoInstances()
if err != nil {
t.Fatalf("DesiredMtprotoInstances: %v", err)
}
t.Run("depletedAndDisabledClientsExcluded", func(t *testing.T) {
if len(instances) != 1 {
t.Fatalf("expected exactly the served inbound, got %d instances: %+v", len(instances), instances)
}
if instances[0].Id != served.Id {
t.Fatalf("expected inbound %d, got %d", served.Id, instances[0].Id)
}
want := []mtproto.SecretEntry{{Name: "alice", Secret: mtprotoTestSecretA}}
if !reflect.DeepEqual(instances[0].Secrets, want) {
t.Fatalf("served secrets: got %+v, want %+v", instances[0].Secrets, want)
}
})
t.Run("matchesInteractivePushFiltering", func(t *testing.T) {
built, err := svc.buildInboundForLocalRuntime(database.GetDB(), served)
if err != nil {
t.Fatalf("buildInboundForLocalRuntime: %v", err)
}
pushInst, ok := mtproto.InstanceFromInbound(built)
if !ok {
t.Fatal("push path must produce an instance")
}
if !reflect.DeepEqual(pushInst.Secrets, instances[0].Secrets) {
t.Fatalf("push and job secret sets diverge: push %+v, job %+v", pushInst.Secrets, instances[0].Secrets)
}
})
}