Files
goplt/services/gateway/gateway_helpers_test.go
2025-11-07 09:10:22 +01:00

185 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)
}
})
}
}