inbound_mtproto_desired_test.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package service
  2. import (
  3. "reflect"
  4. "testing"
  5. "github.com/mhsanaei/3x-ui/v3/internal/database"
  6. "github.com/mhsanaei/3x-ui/v3/internal/database/model"
  7. "github.com/mhsanaei/3x-ui/v3/internal/mtproto"
  8. )
  9. func TestDesiredMtprotoInstancesFiltersDepleted(t *testing.T) {
  10. setupConflictDB(t)
  11. svc := &InboundService{}
  12. seedInboundConflict(t, "mt-desired", "", 46001, model.MTProto,
  13. "",
  14. `{"clients":[`+
  15. `{"email":"alice","secret":"`+mtprotoTestSecretA+`","enable":true},`+
  16. `{"email":"bob","secret":"`+mtprotoTestSecretB+`","enable":true},`+
  17. `{"email":"carol","secret":"`+mtprotoTestSecretC+`","enable":false}]}`)
  18. served := loadInboundByTag(t, "mt-desired")
  19. seedClientTraffic(t, served.Id, "alice", true)
  20. seedClientTraffic(t, served.Id, "bob", false)
  21. seedClientTraffic(t, served.Id, "carol", true)
  22. seedInboundConflict(t, "mt-all-depleted", "", 46002, model.MTProto,
  23. "",
  24. `{"clients":[{"email":"dave","secret":"`+mtprotoTestSecretA+`","enable":true}]}`)
  25. depleted := loadInboundByTag(t, "mt-all-depleted")
  26. seedClientTraffic(t, depleted.Id, "dave", false)
  27. nodeID := 5
  28. seedInboundConflictNode(t, "mt-node-owned", "", 46003, model.MTProto,
  29. "",
  30. `{"clients":[{"email":"erin","secret":"`+mtprotoTestSecretB+`","enable":true}]}`,
  31. &nodeID)
  32. instances, err := svc.DesiredMtprotoInstances()
  33. if err != nil {
  34. t.Fatalf("DesiredMtprotoInstances: %v", err)
  35. }
  36. t.Run("depletedAndDisabledClientsExcluded", func(t *testing.T) {
  37. if len(instances) != 1 {
  38. t.Fatalf("expected exactly the served inbound, got %d instances: %+v", len(instances), instances)
  39. }
  40. if instances[0].Id != served.Id {
  41. t.Fatalf("expected inbound %d, got %d", served.Id, instances[0].Id)
  42. }
  43. want := []mtproto.SecretEntry{{Name: "alice", Secret: mtprotoTestSecretA}}
  44. if !reflect.DeepEqual(instances[0].Secrets, want) {
  45. t.Fatalf("served secrets: got %+v, want %+v", instances[0].Secrets, want)
  46. }
  47. })
  48. t.Run("matchesInteractivePushFiltering", func(t *testing.T) {
  49. built, err := svc.buildRuntimeInboundForAPI(database.GetDB(), served)
  50. if err != nil {
  51. t.Fatalf("buildRuntimeInboundForAPI: %v", err)
  52. }
  53. pushInst, ok := mtproto.InstanceFromInbound(built)
  54. if !ok {
  55. t.Fatal("push path must produce an instance")
  56. }
  57. if !reflect.DeepEqual(pushInst.Secrets, instances[0].Secrets) {
  58. t.Fatalf("push and job secret sets diverge: push %+v, job %+v", pushInst.Secrets, instances[0].Secrets)
  59. }
  60. })
  61. }