186 lines
4.0 KiB
Go
186 lines
4.0 KiB
Go
package gateway
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestGateway_pathMatches(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
tests := []struct {
|
|
name string
|
|
requestPath string
|
|
routePath string
|
|
want bool
|
|
}{
|
|
{
|
|
name: "exact match",
|
|
requestPath: "/api/v1/auth",
|
|
routePath: "/api/v1/auth",
|
|
want: true,
|
|
},
|
|
{
|
|
name: "exact match with trailing slash",
|
|
requestPath: "/api/v1/auth/",
|
|
routePath: "/api/v1/auth",
|
|
want: true,
|
|
},
|
|
{
|
|
name: "wildcard match - prefix",
|
|
requestPath: "/api/v1/auth/login",
|
|
routePath: "/api/v1/auth/**",
|
|
want: true,
|
|
},
|
|
{
|
|
name: "wildcard match - exact prefix",
|
|
requestPath: "/api/v1/auth",
|
|
routePath: "/api/v1/auth/**",
|
|
want: true,
|
|
},
|
|
{
|
|
name: "wildcard match - nested path",
|
|
requestPath: "/api/v1/auth/refresh/token",
|
|
routePath: "/api/v1/auth/**",
|
|
want: true,
|
|
},
|
|
{
|
|
name: "no match - different prefix",
|
|
requestPath: "/api/v1/users",
|
|
routePath: "/api/v1/auth/**",
|
|
want: false,
|
|
},
|
|
{
|
|
name: "no match - exact",
|
|
requestPath: "/api/v1/users",
|
|
routePath: "/api/v1/auth",
|
|
want: false,
|
|
},
|
|
{
|
|
name: "wildcard no match - wrong prefix",
|
|
requestPath: "/api/v1/users/login",
|
|
routePath: "/api/v1/auth/**",
|
|
want: false,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
gateway := &Gateway{}
|
|
got := gateway.pathMatches(tt.requestPath, tt.routePath)
|
|
assert.Equal(t, tt.want, got)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestGateway_extractRemainingPath(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
tests := []struct {
|
|
name string
|
|
requestPath string
|
|
routePath string
|
|
want string
|
|
}{
|
|
{
|
|
name: "wildcard - extract path",
|
|
requestPath: "/api/v1/auth/login",
|
|
routePath: "/api/v1/auth/**",
|
|
want: "/login",
|
|
},
|
|
{
|
|
name: "wildcard - extract nested path",
|
|
requestPath: "/api/v1/auth/refresh/token",
|
|
routePath: "/api/v1/auth/**",
|
|
want: "/refresh/token",
|
|
},
|
|
{
|
|
name: "wildcard - exact match",
|
|
requestPath: "/api/v1/auth",
|
|
routePath: "/api/v1/auth/**",
|
|
want: "/",
|
|
},
|
|
{
|
|
name: "exact match - no remaining",
|
|
requestPath: "/api/v1/auth",
|
|
routePath: "/api/v1/auth",
|
|
want: "/",
|
|
},
|
|
{
|
|
name: "no match - empty",
|
|
requestPath: "/api/v1/users",
|
|
routePath: "/api/v1/auth/**",
|
|
want: "",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
gateway := &Gateway{}
|
|
got := gateway.extractRemainingPath(tt.requestPath, tt.routePath)
|
|
assert.Equal(t, tt.want, got)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestGateway_matchRoute(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
tests := []struct {
|
|
name string
|
|
routes []RouteConfig
|
|
requestPath string
|
|
want *RouteConfig
|
|
}{
|
|
{
|
|
name: "exact match",
|
|
routes: []RouteConfig{
|
|
{Path: "/api/v1/auth", Service: "auth-service"},
|
|
{Path: "/api/v1/users", Service: "identity-service"},
|
|
},
|
|
requestPath: "/api/v1/auth",
|
|
want: &RouteConfig{Path: "/api/v1/auth", Service: "auth-service"},
|
|
},
|
|
{
|
|
name: "wildcard match",
|
|
routes: []RouteConfig{
|
|
{Path: "/api/v1/auth/**", Service: "auth-service"},
|
|
},
|
|
requestPath: "/api/v1/auth/login",
|
|
want: &RouteConfig{Path: "/api/v1/auth/**", Service: "auth-service"},
|
|
},
|
|
{
|
|
name: "no match",
|
|
routes: []RouteConfig{
|
|
{Path: "/api/v1/auth/**", Service: "auth-service"},
|
|
},
|
|
requestPath: "/api/v1/other",
|
|
want: nil,
|
|
},
|
|
{
|
|
name: "empty routes",
|
|
routes: []RouteConfig{},
|
|
requestPath: "/api/v1/auth",
|
|
want: nil,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
gateway := &Gateway{
|
|
routes: tt.routes,
|
|
}
|
|
got := gateway.matchRoute(tt.requestPath)
|
|
if tt.want == nil {
|
|
assert.Nil(t, got)
|
|
} else {
|
|
assert.NotNil(t, got)
|
|
assert.Equal(t, tt.want.Path, got.Path)
|
|
assert.Equal(t, tt.want.Service, got.Service)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|