-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy patherrors_test.go
More file actions
123 lines (106 loc) · 3.74 KB
/
errors_test.go
File metadata and controls
123 lines (106 loc) · 3.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package sqlmer
import (
"database/sql"
"errors"
"strings"
"testing"
)
func TestGetExecutingSqlError(t *testing.T) {
t.Run("Basic Error Test", func(t *testing.T) {
err := errors.New("test error")
rawSql := "SELECT * FROM users WHERE id = @p1"
fixedSql := "SELECT * FROM users WHERE id = ?"
params := []any{1}
wantErr := "dbClient: failed to execute sql\nraw error: test error\nsql:\ninput sql=SELECT * FROM users WHERE id = @p1\nexecuting sql=SELECT * FROM users WHERE id = ?\nparams:\n@p1=1"
gotErr := getExecutingSqlError(err, rawSql, fixedSql, params)
if gotErr.Error() != wantErr {
t.Errorf("getExecutingSqlError() error = %v, want %v", gotErr, wantErr)
}
})
t.Run("Named Parameter Test", func(t *testing.T) {
err := errors.New("test error")
rawSql := "SELECT * FROM users WHERE name = @name"
fixedSql := "SELECT * FROM users WHERE name = ?"
params := []any{sql.Named("name", "test")}
wantErr := "dbClient: failed to execute sql\nraw error: test error\nsql:\ninput sql=SELECT * FROM users WHERE name = @name\nexecuting sql=SELECT * FROM users WHERE name = ?\nparams:\n@name=test"
gotErr := getExecutingSqlError(err, rawSql, fixedSql, params)
if gotErr.Error() != wantErr {
t.Errorf("getExecutingSqlError() error = %v, want %v", gotErr, wantErr)
}
})
}
func TestGetSqlError(t *testing.T) {
t.Run("Basic Error Test", func(t *testing.T) {
err := ErrExpectedSizeWrong
rawSql := "UPDATE users SET name = @p1"
params := []any{"test"}
wantErr := "dbClient: effected rows was wrong\nsql:\ninput sql=UPDATE users SET name = @p1\nparams:\n@p1=test"
gotErr := getSqlError(err, rawSql, params)
if gotErr.Error() != wantErr {
t.Errorf("getSqlError() error = %v, want %v", gotErr, wantErr)
}
})
t.Run("Named Parameter Test", func(t *testing.T) {
err := ErrParseParamFailed
rawSql := "INSERT INTO users (name) VALUES (@name)"
params := []any{sql.Named("name", "test")}
wantErr := "dbClient: failed to parse named params\nsql:\ninput sql=INSERT INTO users (name) VALUES (@name)\nparams:\n@name=test"
gotErr := getSqlError(err, rawSql, params)
if gotErr.Error() != wantErr {
t.Errorf("getSqlError() error = %v, want %v", gotErr, wantErr)
}
})
}
func TestCutLongStringParams(t *testing.T) {
originalMaxLength := MaxLengthErrorValue
defer func() { MaxLengthErrorValue = originalMaxLength }()
// 为了便于测试,将最大长度设置为较小的值
MaxLengthErrorValue = 10
t.Run("Short String", func(t *testing.T) {
paramVal := "test"
want := "test"
got := cutLongStringParams(paramVal)
if got != want {
t.Errorf("cutLongStringParams() = %v, want %v", got, want)
}
})
t.Run("Long String", func(t *testing.T) {
paramVal := "this is a very long string"
want := "this is a ...(length=24)"
got := cutLongStringParams(paramVal)
if s, ok := got.(string); ok {
if !strings.Contains(s, "...(length=") {
t.Errorf("cutLongStringParams() = %v, want %v", got, want)
}
} else {
t.Errorf("cutLongStringParams() = %v, want %v", got, want)
}
})
t.Run("Non-String Type", func(t *testing.T) {
paramVal := 123
want := 123
got := cutLongStringParams(paramVal)
if got != want {
t.Errorf("cutLongStringParams() = %v, want %v", got, want)
}
})
t.Run("Stringer Interface", func(t *testing.T) {
paramVal := testStringer{"this is a very long string"}
want := "this is a ...(length=24)"
got := cutLongStringParams(paramVal)
if s, ok := got.(string); ok {
if !strings.Contains(s, "...(length=") {
t.Errorf("cutLongStringParams() = %v, want %v", got, want)
}
} else {
t.Errorf("cutLongStringParams() = %v, want %v", got, want)
}
})
}
// 用于测试 Stringer 接口的辅助类型
type testStringer struct {
value string
}
func (ts testStringer) String() string {
return ts.value
}