Compare commits

...

4 Commits

Author SHA1 Message Date
ljluestc
80774df320
Merge 0cebb2da0a9921d5080255df5c18c2699eb58590 into d3ffc9985281dcf4d3bef604cce4e662b1a327a6 2026-03-18 15:48:43 +08:00
ljluestc
0cebb2da0a fix context copy 2025-03-23 22:40:36 -07:00
ljluestc
e5d837948a fix context error 2025-03-23 22:10:34 -07:00
ljluestc
043b245931 fix context error 2025-03-23 20:49:53 -07:00
2 changed files with 44 additions and 0 deletions

View File

@ -141,6 +141,15 @@ func (c *Context) Copy() *Context {
cp.Params = make([]Param, len(cParams)) cp.Params = make([]Param, len(cParams))
copy(cp.Params, cParams) copy(cp.Params, cParams)
cErrors := c.Errors
cp.Errors = make(errorMsgs, len(cErrors))
for i, e := range cErrors {
cp.Errors[i] = &Error{
Err: e.Err,
Type: e.Type,
Meta: e.Meta,
}
}
return &cp return &cp
} }

View File

@ -688,6 +688,41 @@ func TestContextCopy(t *testing.T) {
assert.Equal(t, cp.fullPath, c.fullPath) assert.Equal(t, cp.fullPath, c.fullPath)
} }
func TestContextCopyErrors(t *testing.T) {
c, _ := CreateTestContext(httptest.NewRecorder())
// Add errors to the original context
c.Error(fmt.Errorf("first error")).SetType(ErrorTypePublic).SetMeta("meta1") // nolint: errcheck
c.Error(fmt.Errorf("second error")).SetType(ErrorTypePrivate).SetMeta(42) // nolint: errcheck
// Copy the context
cp := c.Copy()
// Verify the copied context has the same number of errors
assert.Equal(t, len(c.Errors), len(cp.Errors), "Copied context should have the same number of errors")
// Verify that the slices are distinct (deep copy) by checking contents and ensuring independence
assert.True(t, reflect.DeepEqual(c.Errors, cp.Errors), "Copied errors should have the same content initially")
// Since we cant compare slices with ==, we rely on content equality and test isolation below
// Check each error in the copied context matches the original
for i, origErr := range c.Errors {
copiedErr := cp.Errors[i]
assert.Equal(t, origErr.Err, copiedErr.Err, "Error message should match")
assert.Equal(t, origErr.Type, copiedErr.Type, "Error type should match")
assert.Equal(t, origErr.Meta, copiedErr.Meta, "Error metadata should match")
// Ensure pointers are different (deep copy)
assert.NotSame(t, origErr, copiedErr, "Each error should be a distinct instance")
}
// Modify original context errors and ensure copy remains unchanged
c.Error(fmt.Errorf("third error")) // nolint: errcheck
assert.Equal(t, 2, len(cp.Errors), "Copied context errors should not reflect changes to original")
assert.Equal(t, 3, len(c.Errors), "Original context should have new error")
assert.False(t, reflect.DeepEqual(c.Errors, cp.Errors), "Copied errors should differ after modification")
}
func TestContextHandlerName(t *testing.T) { func TestContextHandlerName(t *testing.T) {
c, _ := CreateTestContext(httptest.NewRecorder()) c, _ := CreateTestContext(httptest.NewRecorder())
c.handlers = HandlersChain{func(c *Context) {}, handlerNameTest} c.handlers = HandlersChain{func(c *Context) {}, handlerNameTest}