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