github.com/System-Glitch/goyave/v2@v2.10.3-0.20200819142921-51011e75d504/parametrizeable_test.go (about) 1 package goyave 2 3 import ( 4 "regexp" 5 "testing" 6 7 "github.com/stretchr/testify/suite" 8 ) 9 10 type ParametrizeableTestSuite struct { 11 suite.Suite 12 } 13 14 func (suite *ParametrizeableTestSuite) SetupTest() { 15 regexCache = make(map[string]*regexp.Regexp, 5) 16 } 17 18 func (suite *ParametrizeableTestSuite) TearDownTest() { 19 regexCache = nil 20 } 21 22 func (suite *ParametrizeableTestSuite) TestCompileParameters() { 23 24 p := ¶metrizeable{} 25 p.compileParameters("/product/{id:[0-9]+}", true) 26 suite.Equal([]string{"id"}, p.parameters) 27 suite.NotNil(p.regex) 28 suite.True(p.regex.MatchString("/product/666")) 29 suite.False(p.regex.MatchString("/product/")) 30 suite.False(p.regex.MatchString("/product/qwerty")) 31 32 p = ¶metrizeable{} 33 p.compileParameters("/product/{id:[0-9]+}/{name}", true) 34 suite.Equal([]string{"id", "name"}, p.parameters) 35 suite.NotNil(p.regex) 36 suite.False(p.regex.MatchString("/product/666")) 37 suite.False(p.regex.MatchString("/product//")) 38 suite.False(p.regex.MatchString("/product/qwerty")) 39 suite.False(p.regex.MatchString("/product/qwerty/test")) 40 suite.True(p.regex.MatchString("/product/666/test")) 41 42 suite.Panics(func() { // Empty param, expect error 43 p.compileParameters("/product/{}", true) 44 }) 45 suite.Panics(func() { // Empty name, expect error 46 p.compileParameters("/product/{:[0-9]+}", true) 47 }) 48 suite.Panics(func() { // Empty pattern, expect error 49 p.compileParameters("/product/{id:}", true) 50 }) 51 suite.Panics(func() { // Capturing groups 52 p.compileParameters("/product/{name:(.*)}", true) 53 }) 54 suite.NotPanics(func() { // Non-capturing groups 55 p.compileParameters("/product/{name:(?:.*)}", true) 56 }) 57 } 58 59 func (suite *ParametrizeableTestSuite) TestCompileParametersRouter() { 60 p := ¶metrizeable{} 61 p.compileParameters("/product/{id:[0-9]+}", false) 62 suite.Equal([]string{"id"}, p.parameters) 63 suite.NotNil(p.regex) 64 suite.True(p.regex.MatchString("/product/666")) 65 suite.True(p.regex.MatchString("/product/666/extra")) 66 suite.False(p.regex.MatchString("/product/")) 67 suite.False(p.regex.MatchString("/product/qwerty")) 68 suite.False(p.regex.MatchString("/product/qwerty/extra")) 69 } 70 71 func (suite *ParametrizeableTestSuite) TestBraceIndices() { 72 p := ¶metrizeable{} 73 str := "/product/{id:[0-9]+}" 74 idxs, err := p.braceIndices(str) 75 suite.Nil(err) 76 suite.Equal([]int{9, 19}, idxs) 77 78 str = "/product/{id}" 79 idxs, err = p.braceIndices(str) 80 suite.Nil(err) 81 suite.Equal([]int{9, 12}, idxs) 82 83 str = "/product/{id:[0-9]+}/{name}" // Multiple params 84 idxs, err = p.braceIndices(str) 85 suite.Nil(err) 86 suite.Equal([]int{9, 19, 21, 26}, idxs) 87 88 str = "/product/{id}/{name:[\\w]+}" 89 idxs, err = p.braceIndices(str) 90 suite.Nil(err) 91 suite.Equal([]int{9, 12, 14, 25}, idxs) 92 93 str = "/product/{}" // Empty param, expect error 94 idxs, err = p.braceIndices(str) 95 suite.NotNil(err) 96 suite.Equal("empty route parameter in \"/product/{}\"", err.Error()) 97 suite.Nil(idxs) 98 99 str = "/product/{id:{[0-9]+}" // Unbalanced 100 idxs, err = p.braceIndices(str) 101 suite.NotNil(err) 102 suite.Equal("unbalanced braces in \"/product/{id:{[0-9]+}\"", err.Error()) 103 suite.Nil(idxs) 104 105 str = "/product/{id:}[0-9]+}" // Unbalanced 106 idxs, err = p.braceIndices(str) 107 suite.NotNil(err) 108 suite.Equal("unbalanced braces in \"/product/{id:}[0-9]+}\"", err.Error()) 109 suite.Nil(idxs) 110 } 111 112 func (suite *ParametrizeableTestSuite) TestMakeParameters() { 113 matches := []string{"/product/33/param", "33", "param"} 114 names := []string{"id", "name"} 115 116 p := ¶metrizeable{} 117 params := p.makeParameters(matches, names) 118 119 for k := 1; k < len(matches); k++ { 120 suite.Equal(matches[k], params[names[k-1]]) 121 } 122 } 123 124 func (suite *ParametrizeableTestSuite) TestRegexCache() { 125 path := "/product/{id:[0-9]+}" 126 regex := "^/product/([0-9]+)$" 127 p1 := ¶metrizeable{} 128 p1.compileParameters(path, true) 129 suite.NotNil(regexCache[regex]) 130 131 p2 := ¶metrizeable{} 132 p2.compileParameters(path, true) 133 suite.Equal(p1.regex, p2.regex) 134 } 135 136 func TestParametrizeableTestSuite(t *testing.T) { 137 suite.Run(t, new(ParametrizeableTestSuite)) 138 }