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 := &parametrizeable{}
    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 = &parametrizeable{}
    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 := &parametrizeable{}
    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 := &parametrizeable{}
    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 := &parametrizeable{}
   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 := &parametrizeable{}
   128  	p1.compileParameters(path, true)
   129  	suite.NotNil(regexCache[regex])
   130  
   131  	p2 := &parametrizeable{}
   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  }