diff --git a/path_test.go b/path_test.go index 076066a4..48dec823 100644 --- a/path_test.go +++ b/path_test.go @@ -5,6 +5,7 @@ package fiber import ( + "regexp" "testing" "github.com/stretchr/testify/require" @@ -265,3 +266,212 @@ func Benchmark_RoutePatternMatch(t *testing.B) { benchCaseFn(testCollection) } } + +func TestConstraint_CheckConstraint(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + constraint *Constraint + param string + expectedResult bool + }{ + { + name: "no constraint", + constraint: &Constraint{ID: noConstraint}, + param: "abc", + expectedResult: false, + }, + { + name: "int constraint valid", + constraint: &Constraint{ID: intConstraint}, + param: "123", + expectedResult: true, + }, + { + name: "int constraint invalid", + constraint: &Constraint{ID: intConstraint}, + param: "abc", + expectedResult: false, + }, + { + name: "bool constraint valid", + constraint: &Constraint{ID: boolConstraint}, + param: "true", + expectedResult: true, + }, + { + name: "bool constraint invalid", + constraint: &Constraint{ID: boolConstraint}, + param: "abc", + expectedResult: false, + }, + { + name: "float constraint valid", + constraint: &Constraint{ID: floatConstraint}, + param: "1.23", + expectedResult: true, + }, + { + name: "float constraint invalid", + constraint: &Constraint{ID: floatConstraint}, + param: "abc", + expectedResult: false, + }, + { + name: "alpha constraint valid", + constraint: &Constraint{ID: alphaConstraint}, + param: "abc", + expectedResult: true, + }, + { + name: "alpha constraint invalid", + constraint: &Constraint{ID: alphaConstraint}, + param: "123", + expectedResult: false, + }, + { + name: "guid constraint valid", + constraint: &Constraint{ID: guidConstraint}, + param: "123e4567-e89b-12d3-a456-426614174000", + expectedResult: true, + }, + { + name: "guid constraint invalid", + constraint: &Constraint{ID: guidConstraint}, + param: "abc", + expectedResult: false, + }, + { + name: "min length constraint valid", + constraint: &Constraint{ID: minLenConstraint, Data: []string{"3"}}, + param: "abc", + expectedResult: true, + }, + { + name: "min length constraint invalid", + constraint: &Constraint{ID: minLenConstraint, Data: []string{"5"}}, + param: "abc", + expectedResult: false, + }, + { + name: "max length constraint valid", + constraint: &Constraint{ID: maxLenConstraint, Data: []string{"5"}}, + param: "abc", + expectedResult: true, + }, + { + name: "max length constraint invalid", + constraint: &Constraint{ID: maxLenConstraint, Data: []string{"2"}}, + param: "abc", + expectedResult: false, + }, + { + name: "length constraint valid", + constraint: &Constraint{ID: lenConstraint, Data: []string{"3"}}, + param: "abc", + expectedResult: true, + }, + { + name: "length constraint invalid", + constraint: &Constraint{ID: lenConstraint, Data: []string{"5"}}, + param: "abc", + expectedResult: false, + }, + { + name: "between length constraint valid", + constraint: &Constraint{ID: betweenLenConstraint, Data: []string{"2", "4"}}, + param: "abc", + expectedResult: true, + }, + { + name: "between length constraint invalid", + constraint: &Constraint{ID: betweenLenConstraint, Data: []string{"4", "6"}}, + param: "abc", + expectedResult: false, + }, + { + name: "min constraint valid", + constraint: &Constraint{ID: minConstraint, Data: []string{"2"}}, + param: "3", + expectedResult: true, + }, + { + name: "min constraint invalid", + constraint: &Constraint{ID: minConstraint, Data: []string{"4"}}, + param: "3", + expectedResult: false, + }, + { + name: "max constraint valid", + constraint: &Constraint{ID: maxConstraint, Data: []string{"4"}}, + param: "3", + expectedResult: true, + }, + { + name: "max constraint invalid", + constraint: &Constraint{ID: maxConstraint, Data: []string{"2"}}, + param: "3", + expectedResult: false, + }, + { + name: "range constraint valid", + constraint: &Constraint{ID: rangeConstraint, Data: []string{"2", "4"}}, + param: "3", + expectedResult: true, + }, + { + name: "range constraint invalid", + constraint: &Constraint{ID: rangeConstraint, Data: []string{"4", "6"}}, + param: "3", + expectedResult: false, + }, + { + name: "datetime constraint valid", + constraint: &Constraint{ID: datetimeConstraint, Data: []string{"2006-01-02"}}, + param: "2023-05-20", + expectedResult: true, + }, + { + name: "datetime constraint invalid", + constraint: &Constraint{ID: datetimeConstraint, Data: []string{"2006-01-02"}}, + param: "2023/05/20", + expectedResult: false, + }, + { + name: "regex constraint valid", + constraint: &Constraint{ID: regexConstraint, Data: []string{`^\d+$`}, RegexCompiler: regexp.MustCompile(`^\d+$`)}, + param: "123", + expectedResult: true, + }, + { + name: "regex constraint invalid", + constraint: &Constraint{ID: regexConstraint, RegexCompiler: regexp.MustCompile(`^\d+$`)}, + param: "abc", + expectedResult: false, + }, + { + name: "custom constraint valid", + constraint: &Constraint{Name: "custom", customConstraints: []CustomConstraint{&mockCustomConstraint{}}}, + param: "abc", + expectedResult: true, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + result := tc.constraint.CheckConstraint(tc.param) + require.Equal(t, tc.expectedResult, result) + }) + } +} + +type mockCustomConstraint struct{} + +func (m *mockCustomConstraint) Name() string { + return "custom" +} + +func (m *mockCustomConstraint) Execute(_ string, _ ...string) bool { + return true +}