mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-10 03:00:46 +08:00
Network update validation tests
This commit is contained in:
@@ -112,31 +112,30 @@ func getNetworks(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
}
|
||||
|
||||
func ValidateNetworkUpdate(network models.Network) error {
|
||||
|
||||
func ValidateNetworkUpdate(network models.NetworkUpdate) error {
|
||||
v := validator.New()
|
||||
|
||||
_ = v.RegisterValidation("addressrange_valid", func(fl validator.FieldLevel) bool {
|
||||
isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String())
|
||||
return isvalid
|
||||
})
|
||||
_ = v.RegisterValidation("addressrange6_valid", func(fl validator.FieldLevel) bool {
|
||||
isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String())
|
||||
return isvalid
|
||||
})
|
||||
// _ = v.RegisterValidation("addressrange_valid", func(fl validator.FieldLevel) bool {
|
||||
// isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String())
|
||||
// return isvalid
|
||||
// })
|
||||
//_ = v.RegisterValidation("addressrange6_valid", func(fl validator.FieldLevel) bool {
|
||||
// isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String())
|
||||
// return isvalid
|
||||
// })
|
||||
|
||||
_ = v.RegisterValidation("localrange_valid", func(fl validator.FieldLevel) bool {
|
||||
isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String())
|
||||
return isvalid
|
||||
})
|
||||
// _ = v.RegisterValidation("localrange_valid", func(fl validator.FieldLevel) bool {
|
||||
// isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String())
|
||||
// return isvalid
|
||||
// })
|
||||
|
||||
_ = v.RegisterValidation("netid_valid", func(fl validator.FieldLevel) bool {
|
||||
return true
|
||||
})
|
||||
// _ = v.RegisterValidation("netid_valid", func(fl validator.FieldLevel) bool {
|
||||
// return true
|
||||
// })
|
||||
|
||||
_ = v.RegisterValidation("displayname_unique", func(fl validator.FieldLevel) bool {
|
||||
return true
|
||||
})
|
||||
// _ = v.RegisterValidation("displayname_unique", func(fl validator.FieldLevel) bool {
|
||||
// return true
|
||||
// })
|
||||
|
||||
err := v.Struct(network)
|
||||
|
||||
@@ -309,14 +308,13 @@ func updateNetwork(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
var networkChange models.Network
|
||||
var networkChange models.NetworkUpdate
|
||||
|
||||
haschange := false
|
||||
hasrangeupdate := false
|
||||
haslocalrangeupdate := false
|
||||
|
||||
_ = json.NewDecoder(r.Body).Decode(&networkChange)
|
||||
|
||||
if networkChange.AddressRange == "" {
|
||||
networkChange.AddressRange = network.AddressRange
|
||||
}
|
||||
|
@@ -237,6 +237,112 @@ func TestSecurityCheck(t *testing.T) {
|
||||
})
|
||||
}
|
||||
func TestValidateNetworkUpdate(t *testing.T) {
|
||||
//yes := true
|
||||
//no := false
|
||||
deleteNet()
|
||||
//DeleteNetworks
|
||||
cases := []NetworkValidationTestCase{
|
||||
NetworkValidationTestCase{
|
||||
testname: "InvalidAddress",
|
||||
network: models.Network{
|
||||
AddressRange: "10.0.0.256",
|
||||
},
|
||||
errMessage: "Field validation for 'AddressRange' failed on the 'cidr' tag",
|
||||
},
|
||||
NetworkValidationTestCase{
|
||||
testname: "InvalidAddress6",
|
||||
network: models.Network{
|
||||
AddressRange6: "2607::ag",
|
||||
},
|
||||
errMessage: "Field validation for 'AddressRange6' failed on the 'cidr' tag",
|
||||
},
|
||||
|
||||
NetworkValidationTestCase{
|
||||
testname: "BadDisplayName",
|
||||
network: models.Network{
|
||||
DisplayName: "skynet*",
|
||||
},
|
||||
errMessage: "Field validation for 'DisplayName' failed on the 'alphanum' tag",
|
||||
},
|
||||
NetworkValidationTestCase{
|
||||
testname: "DisplayNameTooLong",
|
||||
network: models.Network{
|
||||
DisplayName: "Thisisareallylongdisplaynamethatistoolong",
|
||||
},
|
||||
errMessage: "Field validation for 'DisplayName' failed on the 'max' tag",
|
||||
},
|
||||
NetworkValidationTestCase{
|
||||
testname: "DisplayNameTooShort",
|
||||
network: models.Network{
|
||||
DisplayName: "1",
|
||||
},
|
||||
errMessage: "Field validation for 'DisplayName' failed on the 'min' tag",
|
||||
},
|
||||
NetworkValidationTestCase{
|
||||
testname: "InvalidNetID",
|
||||
network: models.Network{
|
||||
NetID: "contains spaces",
|
||||
},
|
||||
errMessage: "Field validation for 'NetID' failed on the 'alphanum' tag",
|
||||
},
|
||||
NetworkValidationTestCase{
|
||||
testname: "NetIDTooLong",
|
||||
network: models.Network{
|
||||
NetID: "LongNetIDName",
|
||||
},
|
||||
errMessage: "Field validation for 'NetID' failed on the 'max' tag",
|
||||
},
|
||||
NetworkValidationTestCase{
|
||||
testname: "ListenPortTooLow",
|
||||
network: models.Network{
|
||||
DefaultListenPort: 1023,
|
||||
},
|
||||
errMessage: "Field validation for 'DefaultListenPort' failed on the 'min' tag",
|
||||
},
|
||||
NetworkValidationTestCase{
|
||||
testname: "ListenPortTooHigh",
|
||||
network: models.Network{
|
||||
DefaultListenPort: 65536,
|
||||
},
|
||||
errMessage: "Field validation for 'DefaultListenPort' failed on the 'max' tag",
|
||||
},
|
||||
NetworkValidationTestCase{
|
||||
testname: "KeepAliveTooBig",
|
||||
network: models.Network{
|
||||
DefaultKeepalive: 1010,
|
||||
},
|
||||
errMessage: "Field validation for 'DefaultKeepalive' failed on the 'max' tag",
|
||||
},
|
||||
NetworkValidationTestCase{
|
||||
testname: "InvalidLocalRange",
|
||||
network: models.Network{
|
||||
LocalRange: "192.168.0.1",
|
||||
},
|
||||
errMessage: "Field validation for 'LocalRange' failed on the 'cidr' tag",
|
||||
},
|
||||
NetworkValidationTestCase{
|
||||
testname: "CheckInIntervalTooBig",
|
||||
network: models.Network{
|
||||
DefaultCheckInInterval: 100001,
|
||||
},
|
||||
errMessage: "Field validation for 'DefaultCheckInInterval' failed on the 'max' tag",
|
||||
},
|
||||
NetworkValidationTestCase{
|
||||
testname: "CheckInIntervalTooSmall",
|
||||
network: models.Network{
|
||||
DefaultCheckInInterval: 1,
|
||||
},
|
||||
errMessage: "Field validation for 'DefaultCheckInInterval' failed on the 'min' tag",
|
||||
},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.testname, func(t *testing.T) {
|
||||
network := models.NetworkUpdate(tc.network)
|
||||
err := ValidateNetworkUpdate(network)
|
||||
assert.NotNil(t, err)
|
||||
assert.Contains(t, err.Error(), tc.errMessage)
|
||||
})
|
||||
}
|
||||
}
|
||||
func TestValidateNetworkCreate(t *testing.T) {
|
||||
yes := true
|
||||
|
@@ -35,6 +35,33 @@ type Network struct {
|
||||
//can't have min=1 with omitempty
|
||||
DefaultCheckInInterval int32 `json:"checkininterval,omitempty" bson:"checkininterval,omitempty" validate:"omitempty,numeric,min=2,max=100000"`
|
||||
}
|
||||
type NetworkUpdate struct {
|
||||
ID primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"`
|
||||
AddressRange string `json:"addressrange" bson:"addressrange" validate:"omitempty,cidr"`
|
||||
|
||||
// bug in validator --- required_with does not work with bools issue#683
|
||||
// AddressRange6 string `json:"addressrange6" bson:"addressrange6" validate:"required_with=isdualstack true,cidrv6"`
|
||||
AddressRange6 string `json:"addressrange6" bson:"addressrange6" validate:"omitempty,cidr"`
|
||||
//can't have min=1 with omitempty
|
||||
DisplayName string `json:"displayname,omitempty" bson:"displayname,omitempty" validate:"omitempty,alphanum,min=2,max=20"`
|
||||
NetID string `json:"netid" bson:"netid" validate:"alphanum,min=1,max=12"`
|
||||
NodesLastModified int64 `json:"nodeslastmodified" bson:"nodeslastmodified"`
|
||||
NetworkLastModified int64 `json:"networklastmodified" bson:"networklastmodified"`
|
||||
DefaultInterface string `json:"defaultinterface" bson:"defaultinterface"`
|
||||
DefaultListenPort int32 `json:"defaultlistenport,omitempty" bson:"defaultlistenport,omitempty" validate:"omitempty,min=1024,max=65535"`
|
||||
DefaultPostUp string `json:"defaultpostup" bson:"defaultpostup"`
|
||||
DefaultPostDown string `json:"defaultpostdown" bson:"defaultpostdown"`
|
||||
KeyUpdateTimeStamp int64 `json:"keyupdatetimestamp" bson:"keyupdatetimestamp"`
|
||||
DefaultKeepalive int32 `json:"defaultkeepalive" bson:"defaultkeepalive" validate:"omitempty,max=1000"`
|
||||
DefaultSaveConfig *bool `json:"defaultsaveconfig" bson:"defaultsaveconfig"`
|
||||
AccessKeys []AccessKey `json:"accesskeys" bson:"accesskeys"`
|
||||
AllowManualSignUp *bool `json:"allowmanualsignup" bson:"allowmanualsignup"`
|
||||
IsLocal *bool `json:"islocal" bson:"islocal"`
|
||||
IsDualStack *bool `json:"isdualstack" bson:"isdualstack"`
|
||||
LocalRange string `json:"localrange" bson:"localrange" validate:"omitempty,cidr"`
|
||||
//can't have min=1 with omitempty
|
||||
DefaultCheckInInterval int32 `json:"checkininterval,omitempty" bson:"checkininterval,omitempty" validate:"omitempty,numeric,min=2,max=100000"`
|
||||
}
|
||||
|
||||
//TODO:
|
||||
//Not sure if we need the below two functions. Got rid of one of the calls. May want to revisit
|
||||
|
Reference in New Issue
Block a user