2017-03-24 14:07:59 +03:00
package middlewares
import (
"net/http"
"net/http/httptest"
"testing"
2017-05-28 06:50:03 +03:00
2017-06-03 15:58:35 +03:00
"github.com/containous/traefik/testhelpers"
2017-05-28 06:50:03 +03:00
"github.com/stretchr/testify/assert"
2017-03-24 14:07:59 +03:00
)
func TestStripPrefixRegex ( t * testing . T ) {
2017-05-28 06:50:03 +03:00
testPrefixRegex := [ ] string { "/a/api/" , "/b/{regex}/" , "/c/{category}/{id:[0-9]+}/" }
2017-03-24 14:07:59 +03:00
tests := [ ] struct {
2017-05-28 06:50:03 +03:00
path string
expectedStatusCode int
expectedPath string
2017-11-21 16:28:03 +03:00
expectedRawPath string
2017-05-28 06:50:03 +03:00
expectedHeader string
2017-03-24 14:07:59 +03:00
} {
2017-05-28 06:50:03 +03:00
{
path : "/a/test" ,
2017-06-01 23:09:36 +03:00
expectedStatusCode : http . StatusNotFound ,
2017-05-28 06:50:03 +03:00
} ,
{
path : "/a/api/test" ,
2017-06-01 23:09:36 +03:00
expectedStatusCode : http . StatusOK ,
2017-05-28 06:50:03 +03:00
expectedPath : "test" ,
expectedHeader : "/a/api/" ,
} ,
{
path : "/b/api/" ,
2017-06-01 23:09:36 +03:00
expectedStatusCode : http . StatusOK ,
2017-05-28 06:50:03 +03:00
expectedHeader : "/b/api/" ,
} ,
{
path : "/b/api/test1" ,
2017-06-01 23:09:36 +03:00
expectedStatusCode : http . StatusOK ,
2017-05-28 06:50:03 +03:00
expectedPath : "test1" ,
expectedHeader : "/b/api/" ,
} ,
{
path : "/b/api2/test2" ,
2017-06-01 23:09:36 +03:00
expectedStatusCode : http . StatusOK ,
2017-05-28 06:50:03 +03:00
expectedPath : "test2" ,
expectedHeader : "/b/api2/" ,
} ,
{
path : "/c/api/123/" ,
2017-06-01 23:09:36 +03:00
expectedStatusCode : http . StatusOK ,
2017-05-28 06:50:03 +03:00
expectedHeader : "/c/api/123/" ,
} ,
{
path : "/c/api/123/test3" ,
2017-06-01 23:09:36 +03:00
expectedStatusCode : http . StatusOK ,
2017-05-28 06:50:03 +03:00
expectedPath : "test3" ,
expectedHeader : "/c/api/123/" ,
} ,
{
path : "/c/api/abc/test4" ,
2017-06-01 23:09:36 +03:00
expectedStatusCode : http . StatusNotFound ,
2017-05-28 06:50:03 +03:00
} ,
2017-11-21 16:28:03 +03:00
{
path : "/a/api/a%2Fb" ,
expectedStatusCode : http . StatusOK ,
expectedPath : "a/b" ,
expectedRawPath : "a%2Fb" ,
expectedHeader : "/a/api/" ,
} ,
2017-03-24 14:07:59 +03:00
}
for _ , test := range tests {
2017-05-28 06:50:03 +03:00
test := test
t . Run ( test . path , func ( t * testing . T ) {
t . Parallel ( )
2017-11-21 16:28:03 +03:00
var actualPath , actualRawPath , actualHeader string
2017-05-28 06:50:03 +03:00
handlerPath := http . HandlerFunc ( func ( w http . ResponseWriter , r * http . Request ) {
actualPath = r . URL . Path
2017-11-21 16:28:03 +03:00
actualRawPath = r . URL . RawPath
2017-05-28 06:50:03 +03:00
actualHeader = r . Header . Get ( ForwardedPrefixHeader )
} )
handler := NewStripPrefixRegex ( handlerPath , testPrefixRegex )
2017-06-03 15:58:35 +03:00
req := testhelpers . MustNewRequest ( http . MethodGet , "http://localhost" + test . path , nil )
2017-06-01 23:09:36 +03:00
resp := & httptest . ResponseRecorder { Code : http . StatusOK }
2017-06-03 15:58:35 +03:00
2017-06-01 23:09:36 +03:00
handler . ServeHTTP ( resp , req )
assert . Equal ( t , test . expectedStatusCode , resp . Code , "Unexpected status code." )
assert . Equal ( t , test . expectedPath , actualPath , "Unexpected path." )
2017-11-21 16:28:03 +03:00
assert . Equal ( t , test . expectedRawPath , actualRawPath , "Unexpected raw path." )
2017-06-01 23:09:36 +03:00
assert . Equal ( t , test . expectedHeader , actualHeader , "Unexpected '%s' header." , ForwardedPrefixHeader )
2017-05-28 06:50:03 +03:00
} )
2017-03-24 14:07:59 +03:00
}
}