github.com/line/line-bot-sdk-go/v7@v7.21.0/linebot/get_quota_test.go (about) 1 // Copyright 2016 LINE Corporation 2 // 3 // LINE Corporation licenses this file to you under the Apache License, 4 // version 2.0 (the "License"); you may not use this file except in compliance 5 // with the License. You may obtain a copy of the License at: 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12 // License for the specific language governing permissions and limitations 13 // under the License. 14 15 package linebot 16 17 import ( 18 "context" 19 "io" 20 "net/http" 21 "net/http/httptest" 22 "reflect" 23 "strconv" 24 "testing" 25 "time" 26 ) 27 28 func TestGetMessageQuota(t *testing.T) { 29 type want struct { 30 URLPath string 31 RequestBody []byte 32 Response *MessageQuotaResponse 33 Error error 34 } 35 testCases := []struct { 36 Label string 37 ResponseCode int 38 Response []byte 39 Want want 40 }{ 41 { 42 Label: "Success", 43 ResponseCode: 200, 44 Response: []byte(`{"type":"limited","value":1000}`), 45 Want: want{ 46 URLPath: APIEndpointGetMessageQuota, 47 RequestBody: []byte(""), 48 Response: &MessageQuotaResponse{ 49 Type: "limited", 50 Value: 1000, 51 }, 52 }, 53 }, 54 { 55 Label: "Internal server error", 56 ResponseCode: 500, 57 Response: []byte("500 Internal server error"), 58 Want: want{ 59 URLPath: APIEndpointGetMessageQuota, 60 RequestBody: []byte(""), 61 Error: &APIError{ 62 Code: 500, 63 }, 64 }, 65 }, 66 } 67 68 var currentTestIdx int 69 server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 70 defer r.Body.Close() 71 tc := testCases[currentTestIdx] 72 if r.Method != http.MethodGet { 73 t.Errorf("Method %s; want %s", r.Method, http.MethodGet) 74 } 75 if r.URL.Path != tc.Want.URLPath { 76 t.Errorf("URLPath %s; want %s", r.URL.Path, tc.Want.URLPath) 77 } 78 body, err := io.ReadAll(r.Body) 79 if err != nil { 80 t.Fatal(err) 81 } 82 if !reflect.DeepEqual(body, tc.Want.RequestBody) { 83 t.Errorf("RequestBody %s; want %s", body, tc.Want.RequestBody) 84 } 85 w.WriteHeader(tc.ResponseCode) 86 w.Write(tc.Response) 87 })) 88 defer server.Close() 89 90 dataServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 91 defer r.Body.Close() 92 t.Error("Unexpected Data API call") 93 w.WriteHeader(404) 94 w.Write([]byte(`{"message":"Not found"}`)) 95 })) 96 defer dataServer.Close() 97 98 client, err := mockClient(server, dataServer) 99 if err != nil { 100 t.Fatal(err) 101 } 102 for i, tc := range testCases { 103 currentTestIdx = i 104 t.Run(strconv.Itoa(i)+"/"+tc.Label, func(t *testing.T) { 105 res, err := client.GetMessageQuota().Do() 106 if tc.Want.Error != nil { 107 if !reflect.DeepEqual(err, tc.Want.Error) { 108 t.Errorf("Error %v; want %v", err, tc.Want.Error) 109 } 110 } else { 111 if err != nil { 112 t.Error(err) 113 } 114 } 115 if !reflect.DeepEqual(res, tc.Want.Response) { 116 t.Errorf("Response %v; want %v", res, tc.Want.Response) 117 } 118 }) 119 } 120 } 121 122 func TestGetMessageQuotaWithContext(t *testing.T) { 123 server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 124 defer r.Body.Close() 125 time.Sleep(10 * time.Millisecond) 126 w.Write([]byte("{}")) 127 })) 128 defer server.Close() 129 130 dataServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 131 defer r.Body.Close() 132 t.Error("Unexpected Data API call") 133 w.WriteHeader(404) 134 w.Write([]byte(`{"message":"Not found"}`)) 135 })) 136 defer dataServer.Close() 137 138 client, err := mockClient(server, dataServer) 139 if err != nil { 140 t.Fatal(err) 141 } 142 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Millisecond) 143 defer cancel() 144 _, err = client.GetMessageQuota().WithContext(ctx).Do() 145 expectCtxDeadlineExceed(ctx, err, t) 146 } 147 148 func TestGetMessageQuotaConsumption(t *testing.T) { 149 type want struct { 150 URLPath string 151 RequestBody []byte 152 Response *MessageQuotaResponse 153 Error error 154 } 155 testCases := []struct { 156 Label string 157 ResponseCode int 158 Response []byte 159 Want want 160 }{ 161 { 162 Label: "Success", 163 ResponseCode: 200, 164 Response: []byte(`{"totalUsage":7}`), 165 Want: want{ 166 URLPath: APIEndpointGetMessageQuotaConsumption, 167 RequestBody: []byte(""), 168 Response: &MessageQuotaResponse{ 169 TotalUsage: 7, 170 }, 171 }, 172 }, 173 { 174 Label: "Internal server error", 175 ResponseCode: 500, 176 Response: []byte("500 Internal server error"), 177 Want: want{ 178 URLPath: APIEndpointGetMessageQuotaConsumption, 179 RequestBody: []byte(""), 180 Error: &APIError{ 181 Code: 500, 182 }, 183 }, 184 }, 185 } 186 187 var currentTestIdx int 188 server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 189 defer r.Body.Close() 190 tc := testCases[currentTestIdx] 191 if r.Method != http.MethodGet { 192 t.Errorf("Method %s; want %s", r.Method, http.MethodGet) 193 } 194 if r.URL.Path != tc.Want.URLPath { 195 t.Errorf("URLPath %s; want %s", r.URL.Path, tc.Want.URLPath) 196 } 197 body, err := io.ReadAll(r.Body) 198 if err != nil { 199 t.Fatal(err) 200 } 201 if !reflect.DeepEqual(body, tc.Want.RequestBody) { 202 t.Errorf("RequestBody %s; want %s", body, tc.Want.RequestBody) 203 } 204 w.WriteHeader(tc.ResponseCode) 205 w.Write(tc.Response) 206 })) 207 defer server.Close() 208 209 dataServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 210 defer r.Body.Close() 211 t.Error("Unexpected Data API call") 212 w.WriteHeader(404) 213 w.Write([]byte(`{"message":"Not found"}`)) 214 })) 215 defer dataServer.Close() 216 217 client, err := mockClient(server, dataServer) 218 if err != nil { 219 t.Fatal(err) 220 } 221 for i, tc := range testCases { 222 currentTestIdx = i 223 t.Run(strconv.Itoa(i)+"/"+tc.Label, func(t *testing.T) { 224 res, err := client.GetMessageQuotaConsumption().Do() 225 if tc.Want.Error != nil { 226 if !reflect.DeepEqual(err, tc.Want.Error) { 227 t.Errorf("Error %v; want %v", err, tc.Want.Error) 228 } 229 } else { 230 if err != nil { 231 t.Error(err) 232 } 233 } 234 if !reflect.DeepEqual(res, tc.Want.Response) { 235 t.Errorf("Response %v; want %v", res, tc.Want.Response) 236 } 237 }) 238 } 239 } 240 241 func BenchmarkGetMessageQuota(b *testing.B) { 242 server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 243 defer r.Body.Close() 244 w.Write([]byte(`{"type":"limited","value":1000}`)) 245 })) 246 defer server.Close() 247 248 dataServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 249 defer r.Body.Close() 250 b.Error("Unexpected Data API call") 251 w.WriteHeader(404) 252 w.Write([]byte(`{"message":"Not found"}`)) 253 })) 254 defer dataServer.Close() 255 256 client, err := mockClient(server, dataServer) 257 if err != nil { 258 b.Fatal(err) 259 } 260 b.ResetTimer() 261 for i := 0; i < b.N; i++ { 262 client.GetMessageQuota().Do() 263 } 264 } 265 266 func TestGetMessageConsumption(t *testing.T) { 267 type want struct { 268 URLPath string 269 RequestBody []byte 270 Response *MessageConsumptionResponse 271 Error error 272 } 273 testCases := []struct { 274 Label string 275 ResponseCode int 276 Response []byte 277 Want want 278 }{ 279 { 280 Label: "Success", 281 ResponseCode: 200, 282 Response: []byte(`{"totalUsage":500}`), 283 Want: want{ 284 URLPath: APIEndpointGetMessageConsumption, 285 RequestBody: []byte(""), 286 Response: &MessageConsumptionResponse{ 287 TotalUsage: 500, 288 }, 289 }, 290 }, 291 { 292 Label: "Internal server error", 293 ResponseCode: 500, 294 Response: []byte("500 Internal server error"), 295 Want: want{ 296 URLPath: APIEndpointGetMessageConsumption, 297 RequestBody: []byte(""), 298 Error: &APIError{ 299 Code: 500, 300 }, 301 }, 302 }, 303 } 304 305 var currentTestIdx int 306 server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 307 defer r.Body.Close() 308 tc := testCases[currentTestIdx] 309 if r.Method != http.MethodGet { 310 t.Errorf("Method %s; want %s", r.Method, http.MethodGet) 311 } 312 if r.URL.Path != tc.Want.URLPath { 313 t.Errorf("URLPath %s; want %s", r.URL.Path, tc.Want.URLPath) 314 } 315 body, err := io.ReadAll(r.Body) 316 if err != nil { 317 t.Fatal(err) 318 } 319 if !reflect.DeepEqual(body, tc.Want.RequestBody) { 320 t.Errorf("RequestBody %s; want %s", body, tc.Want.RequestBody) 321 } 322 w.WriteHeader(tc.ResponseCode) 323 w.Write(tc.Response) 324 })) 325 defer server.Close() 326 327 dataServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 328 defer r.Body.Close() 329 t.Error("Unexpected Data API call") 330 w.WriteHeader(404) 331 w.Write([]byte(`{"message":"Not found"}`)) 332 })) 333 defer dataServer.Close() 334 335 client, err := mockClient(server, dataServer) 336 if err != nil { 337 t.Fatal(err) 338 } 339 for i, tc := range testCases { 340 currentTestIdx = i 341 t.Run(strconv.Itoa(i)+"/"+tc.Label, func(t *testing.T) { 342 res, err := client.GetMessageConsumption().Do() 343 if tc.Want.Error != nil { 344 if !reflect.DeepEqual(err, tc.Want.Error) { 345 t.Errorf("Error %v; want %v", err, tc.Want.Error) 346 } 347 } else { 348 if err != nil { 349 t.Error(err) 350 } 351 } 352 if !reflect.DeepEqual(res, tc.Want.Response) { 353 t.Errorf("Response %v; want %v", res, tc.Want.Response) 354 } 355 }) 356 } 357 } 358 359 func TestGetMessageConsumptionWithContext(t *testing.T) { 360 server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 361 defer r.Body.Close() 362 time.Sleep(10 * time.Millisecond) 363 w.Write([]byte("{}")) 364 })) 365 defer server.Close() 366 367 dataServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 368 defer r.Body.Close() 369 t.Error("Unexpected Data API call") 370 w.WriteHeader(404) 371 w.Write([]byte(`{"message":"Not found"}`)) 372 })) 373 defer dataServer.Close() 374 375 client, err := mockClient(server, dataServer) 376 if err != nil { 377 t.Fatal(err) 378 } 379 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Millisecond) 380 defer cancel() 381 _, err = client.GetMessageConsumption().WithContext(ctx).Do() 382 expectCtxDeadlineExceed(ctx, err, t) 383 } 384 385 func BenchmarkGetMessageConsumption(b *testing.B) { 386 server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 387 defer r.Body.Close() 388 w.Write([]byte(`{"totalUsage":500}`)) 389 })) 390 defer server.Close() 391 392 dataServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 393 defer r.Body.Close() 394 b.Error("Unexpected Data API call") 395 w.WriteHeader(404) 396 w.Write([]byte(`{"message":"Not found"}`)) 397 })) 398 defer dataServer.Close() 399 400 client, err := mockClient(server, dataServer) 401 if err != nil { 402 b.Fatal(err) 403 } 404 b.ResetTimer() 405 for i := 0; i < b.N; i++ { 406 client.GetMessageConsumption().Do() 407 } 408 }