@@ -111,3 +111,99 @@ func TestDoRequest(t *testing.T) {
111111 })
112112 }
113113}
114+
115+ // TestBuildURL tests the buildURL function that constructs URLs with escaped path segments.
116+ func TestBuildURL (t * testing.T ) {
117+ tests := []struct {
118+ name string
119+ base string
120+ segments []string
121+ expected string
122+ }{
123+ {
124+ name : "no segments" ,
125+ base : "https://api.example.com/v1" ,
126+ segments : []string {},
127+ expected : "https://api.example.com/v1" ,
128+ },
129+ {
130+ name : "single segment" ,
131+ base : "https://api.example.com/v1" ,
132+ segments : []string {"users" },
133+ expected : "https://api.example.com/v1/users" ,
134+ },
135+ {
136+ name : "multiple segments" ,
137+ base : "https://api.example.com/v1" ,
138+ segments : []string {"users" , "abc-123" , "activate" },
139+ expected : "https://api.example.com/v1/users/abc-123/activate" ,
140+ },
141+ {
142+ name : "path traversal escaped" ,
143+ base : "https://api.example.com/v1" ,
144+ segments : []string {"users" , "../admin" },
145+ expected : "https://api.example.com/v1/users/..%2Fadmin" ,
146+ },
147+ {
148+ name : "forward slash escaped" ,
149+ base : "https://api.example.com/v1" ,
150+ segments : []string {"users" , "user/admin" },
151+ expected : "https://api.example.com/v1/users/user%2Fadmin" ,
152+ },
153+ {
154+ name : "space escaped" ,
155+ base : "https://api.example.com/v1" ,
156+ segments : []string {"users" , "user 123" },
157+ expected : "https://api.example.com/v1/users/user%20123" ,
158+ },
159+ {
160+ name : "question mark escaped" ,
161+ base : "https://api.example.com/v1" ,
162+ segments : []string {"users" , "user?role=admin" },
163+ expected : "https://api.example.com/v1/users/user%3Frole=admin" ,
164+ },
165+ }
166+
167+ for _ , tt := range tests {
168+ t .Run (tt .name , func (t * testing.T ) {
169+ result := buildURL (tt .base , tt .segments ... )
170+ assert .Equal (t , tt .expected , result )
171+ })
172+ }
173+ }
174+
175+ // TestValidateID tests the validateID function that validates ID parameters.
176+ func TestValidateID (t * testing.T ) {
177+ tests := []struct {
178+ name string
179+ id string
180+ wantErr error
181+ }{
182+ {
183+ name : "valid ID" ,
184+ id : "abc-123" ,
185+ wantErr : nil ,
186+ },
187+ {
188+ name : "valid UUID" ,
189+ id : "550e8400-e29b-41d4-a716-446655440000" ,
190+ wantErr : nil ,
191+ },
192+ {
193+ name : "empty ID" ,
194+ id : "" ,
195+ wantErr : ErrEmptyID ,
196+ },
197+ }
198+
199+ for _ , tt := range tests {
200+ t .Run (tt .name , func (t * testing.T ) {
201+ err := validateID (tt .id )
202+ if tt .wantErr != nil {
203+ assert .Equal (t , tt .wantErr , err )
204+ } else {
205+ assert .NoError (t , err )
206+ }
207+ })
208+ }
209+ }
0 commit comments