Skip to content

Commit c47f19d

Browse files
Merge branch 'main' into miklos/eng-7608-upgrade-to-go-125
2 parents eb2474e + 6375c4b commit c47f19d

File tree

2 files changed

+154
-2
lines changed

2 files changed

+154
-2
lines changed

router/internal/expr/expr.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func (copyCtx Context) Clone() *Context {
5353

5454
query := make(map[string]string, len(copyCtx.Request.URL.Query))
5555
for k, v := range copyCtx.Request.URL.Query {
56-
claims[k] = v
56+
query[k] = v
5757
}
5858
copyCtx.Request.URL.Query = query
5959

router/internal/expr/expr_test.go

Lines changed: 153 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package expr
22

33
import (
4-
"github.com/stretchr/testify/require"
54
"reflect"
65
"testing"
6+
7+
"github.com/stretchr/testify/require"
78
)
89

910
func TestExpr(t *testing.T) {
@@ -55,4 +56,155 @@ func TestExpr(t *testing.T) {
5556
require.False(t, reflect.ValueOf(exprContext.Request.Auth.Scopes).Pointer() == reflect.ValueOf(properClone.Request.Auth.Scopes).Pointer())
5657
require.False(t, reflect.ValueOf(exprContext.Request.URL.Query).Pointer() == reflect.ValueOf(properClone.Request.URL.Query).Pointer())
5758
})
59+
60+
t.Run("clone with query", func(t *testing.T) {
61+
t.Parallel()
62+
63+
exprContext := &Context{
64+
Request: Request{
65+
URL: RequestURL{
66+
Query: map[string]string{
67+
"key": "value",
68+
},
69+
},
70+
},
71+
}
72+
73+
clone := exprContext.Clone()
74+
75+
require.Equal(t, exprContext.Request.URL.Query, clone.Request.URL.Query)
76+
77+
// Verify modifying clone doesn't affect original
78+
clone.Request.URL.Query["new"] = "value2"
79+
require.NotEqual(t, exprContext.Request.URL.Query, clone.Request.URL.Query)
80+
})
81+
82+
t.Run("clone with empty maps and slices", func(t *testing.T) {
83+
t.Parallel()
84+
85+
exprContext := &Context{
86+
Request: Request{
87+
Auth: RequestAuth{
88+
Claims: map[string]any{},
89+
Scopes: []string{},
90+
},
91+
URL: RequestURL{
92+
Query: map[string]string{},
93+
},
94+
},
95+
}
96+
97+
clone := exprContext.Clone()
98+
99+
require.NotNil(t, clone.Request.Auth.Claims)
100+
require.NotNil(t, clone.Request.Auth.Scopes)
101+
require.NotNil(t, clone.Request.URL.Query)
102+
require.Len(t, clone.Request.Auth.Claims, 0)
103+
require.Len(t, clone.Request.Auth.Scopes, 0)
104+
require.Len(t, clone.Request.URL.Query, 0)
105+
})
106+
107+
t.Run("clone with nil maps and slices", func(t *testing.T) {
108+
t.Parallel()
109+
110+
exprContext := &Context{
111+
Request: Request{
112+
Auth: RequestAuth{
113+
Claims: nil,
114+
Scopes: nil,
115+
},
116+
URL: RequestURL{
117+
Query: nil,
118+
},
119+
},
120+
}
121+
122+
clone := exprContext.Clone()
123+
124+
require.NotNil(t, clone.Request.Auth.Claims)
125+
require.NotNil(t, clone.Request.Auth.Scopes)
126+
require.NotNil(t, clone.Request.URL.Query)
127+
require.Len(t, clone.Request.Auth.Claims, 0)
128+
require.Len(t, clone.Request.Auth.Scopes, 0)
129+
require.Len(t, clone.Request.URL.Query, 0)
130+
})
131+
132+
t.Run("verify claims and query values are copied correctly", func(t *testing.T) {
133+
t.Parallel()
134+
135+
exprContext := &Context{
136+
Request: Request{
137+
Auth: RequestAuth{
138+
Claims: map[string]any{
139+
"string": "value",
140+
"number": 42,
141+
"bool": true,
142+
"slice": []string{"a", "b"},
143+
"map": map[string]string{"key": "value"},
144+
},
145+
},
146+
URL: RequestURL{
147+
Query: map[string]string{
148+
"page": "1",
149+
"limit": "10",
150+
"filter": "active",
151+
},
152+
},
153+
},
154+
}
155+
156+
clone := exprContext.Clone()
157+
158+
// Verify claims are copied correctly
159+
require.Equal(t, "value", clone.Request.Auth.Claims["string"])
160+
require.Equal(t, 42, clone.Request.Auth.Claims["number"])
161+
require.Equal(t, true, clone.Request.Auth.Claims["bool"])
162+
require.Equal(t, []string{"a", "b"}, clone.Request.Auth.Claims["slice"])
163+
require.Equal(t, map[string]string{"key": "value"}, clone.Request.Auth.Claims["map"])
164+
165+
// Verify query params are copied correctly
166+
require.Equal(t, "1", clone.Request.URL.Query["page"])
167+
require.Equal(t, "10", clone.Request.URL.Query["limit"])
168+
require.Equal(t, "active", clone.Request.URL.Query["filter"])
169+
170+
// Verify nested structures in claims are also copied by reference (as that's the current behavior)
171+
sliceFromOriginal := exprContext.Request.Auth.Claims["slice"].([]string)
172+
sliceFromClone := clone.Request.Auth.Claims["slice"].([]string)
173+
require.Equal(t, reflect.ValueOf(sliceFromOriginal).Pointer(), reflect.ValueOf(sliceFromClone).Pointer())
174+
175+
mapFromOriginal := exprContext.Request.Auth.Claims["map"].(map[string]string)
176+
mapFromClone := clone.Request.Auth.Claims["map"].(map[string]string)
177+
require.Equal(t, reflect.ValueOf(mapFromOriginal).Pointer(), reflect.ValueOf(mapFromClone).Pointer())
178+
})
179+
180+
t.Run("verify modifying clone doesn't affect original", func(t *testing.T) {
181+
t.Parallel()
182+
183+
exprContext := &Context{
184+
Request: Request{
185+
Auth: RequestAuth{
186+
Claims: map[string]any{"key": "value"},
187+
Scopes: []string{"scope1"},
188+
},
189+
URL: RequestURL{
190+
Query: map[string]string{"param": "value"},
191+
},
192+
},
193+
}
194+
195+
clone := exprContext.Clone()
196+
197+
// Modify clone
198+
clone.Request.Auth.Claims["newKey"] = "newValue"
199+
clone.Request.Auth.Scopes = append(clone.Request.Auth.Scopes, "scope2")
200+
clone.Request.URL.Query["newParam"] = "newValue"
201+
202+
// Verify original is unchanged
203+
require.Len(t, exprContext.Request.Auth.Claims, 1)
204+
require.Equal(t, "value", exprContext.Request.Auth.Claims["key"])
205+
require.Len(t, exprContext.Request.Auth.Scopes, 1)
206+
require.Equal(t, "scope1", exprContext.Request.Auth.Scopes[0])
207+
require.Len(t, exprContext.Request.URL.Query, 1)
208+
require.Equal(t, "value", exprContext.Request.URL.Query["param"])
209+
})
58210
}

0 commit comments

Comments
 (0)