github.com/line/line-bot-sdk-go/v7@v7.21.0/linebot/leave_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 "fmt" 20 "io" 21 "net/http" 22 "net/http/httptest" 23 "reflect" 24 "strconv" 25 "testing" 26 "time" 27 ) 28 29 func TestLeaveGroup(t *testing.T) { 30 type want struct { 31 URLPath string 32 RequestBody []byte 33 Response *BasicResponse 34 Error error 35 } 36 testCases := []struct { 37 Label string 38 GroupID string 39 ResponseCode int 40 Response []byte 41 Want want 42 }{ 43 { 44 Label: "Success", 45 GroupID: "cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 46 ResponseCode: 200, 47 Response: []byte(`{}`), 48 Want: want{ 49 URLPath: fmt.Sprintf(APIEndpointLeaveGroup, "cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"), 50 RequestBody: []byte(""), 51 Response: &BasicResponse{}, 52 }, 53 }, 54 { 55 Label: "Too Many Requests", 56 GroupID: "cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 57 ResponseCode: 429, 58 Response: []byte(`{"message":"Too Many Requests"}`), 59 Want: want{ 60 URLPath: fmt.Sprintf(APIEndpointLeaveGroup, "cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"), 61 RequestBody: []byte(""), 62 Error: &APIError{ 63 Code: 429, 64 Response: &ErrorResponse{ 65 Message: "Too Many Requests", 66 }, 67 }, 68 }, 69 }, 70 } 71 72 var currentTestIdx int 73 server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 74 defer r.Body.Close() 75 tc := testCases[currentTestIdx] 76 if r.Method != http.MethodPost { 77 t.Errorf("Method %s; want %s", r.Method, http.MethodPost) 78 } 79 if r.URL.Path != tc.Want.URLPath { 80 t.Errorf("URLPath %s; want %s", r.URL.Path, tc.Want.URLPath) 81 } 82 body, err := io.ReadAll(r.Body) 83 if err != nil { 84 t.Fatal(err) 85 } 86 if !reflect.DeepEqual(body, tc.Want.RequestBody) { 87 t.Errorf("RequestBody %s; want %s", body, tc.Want.RequestBody) 88 } 89 w.WriteHeader(tc.ResponseCode) 90 w.Write(tc.Response) 91 })) 92 defer server.Close() 93 94 dataServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 95 defer r.Body.Close() 96 t.Error("Unexpected data API call") 97 w.WriteHeader(404) 98 w.Write([]byte(`{"message":"Not found"}`)) 99 })) 100 defer dataServer.Close() 101 102 client, err := mockClient(server, dataServer) 103 if err != nil { 104 t.Fatal(err) 105 } 106 for i, tc := range testCases { 107 currentTestIdx = i 108 t.Run(strconv.Itoa(i)+"/"+tc.Label, func(t *testing.T) { 109 res, err := client.LeaveGroup(tc.GroupID).Do() 110 if tc.Want.Error != nil { 111 if !reflect.DeepEqual(err, tc.Want.Error) { 112 t.Errorf("Error %v; want %v", err, tc.Want.Error) 113 } 114 } else { 115 if err != nil { 116 t.Error(err) 117 } 118 } 119 if tc.Want.Response != nil { 120 if !reflect.DeepEqual(res, tc.Want.Response) { 121 t.Errorf("Response %v; want %v", res, tc.Want.Response) 122 } 123 } 124 }) 125 } 126 } 127 128 func TestLeaveGroupWithContext(t *testing.T) { 129 server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 130 defer r.Body.Close() 131 time.Sleep(10 * time.Millisecond) 132 w.Write([]byte("{}")) 133 })) 134 defer server.Close() 135 136 dataServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 137 defer r.Body.Close() 138 t.Error("Unexpected data API call") 139 w.WriteHeader(404) 140 w.Write([]byte(`{"message":"Not found"}`)) 141 })) 142 defer dataServer.Close() 143 144 client, err := mockClient(server, dataServer) 145 if err != nil { 146 t.Fatal(err) 147 } 148 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Millisecond) 149 defer cancel() 150 _, err = client.LeaveGroup("cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx").WithContext(ctx).Do() 151 expectCtxDeadlineExceed(ctx, err, t) 152 } 153 154 func TestLeaveRoom(t *testing.T) { 155 type want struct { 156 URLPath string 157 RequestBody []byte 158 Response *BasicResponse 159 Error error 160 } 161 testCases := []struct { 162 Label string 163 RoomID string 164 ResponseCode int 165 Response []byte 166 Want want 167 }{ 168 { 169 Label: "Success", 170 RoomID: "cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 171 ResponseCode: 200, 172 Response: []byte(`{}`), 173 Want: want{ 174 URLPath: fmt.Sprintf(APIEndpointLeaveRoom, "cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"), 175 RequestBody: []byte(""), 176 Response: &BasicResponse{}, 177 }, 178 }, 179 { 180 Label: "Too Many Requests", 181 RoomID: "cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 182 ResponseCode: 429, 183 Response: []byte(`{"message":"Too Many Requests"}`), 184 Want: want{ 185 URLPath: fmt.Sprintf(APIEndpointLeaveRoom, "cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"), 186 RequestBody: []byte(""), 187 Error: &APIError{ 188 Code: 429, 189 Response: &ErrorResponse{ 190 Message: "Too Many Requests", 191 }, 192 }, 193 }, 194 }, 195 } 196 197 var currentTestIdx int 198 server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 199 defer r.Body.Close() 200 tc := testCases[currentTestIdx] 201 if r.Method != http.MethodPost { 202 t.Errorf("Method %s; want %s", r.Method, http.MethodPost) 203 } 204 if r.URL.Path != tc.Want.URLPath { 205 t.Errorf("URLPath %s; want %s", r.URL.Path, tc.Want.URLPath) 206 } 207 body, err := io.ReadAll(r.Body) 208 if err != nil { 209 t.Fatal(err) 210 } 211 if !reflect.DeepEqual(body, tc.Want.RequestBody) { 212 t.Errorf("RequestBody %s; want %s", body, tc.Want.RequestBody) 213 } 214 w.WriteHeader(tc.ResponseCode) 215 w.Write(tc.Response) 216 })) 217 defer server.Close() 218 219 dataServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 220 defer r.Body.Close() 221 t.Error("Unexpected data API call") 222 w.WriteHeader(404) 223 w.Write([]byte(`{"message":"Not found"}`)) 224 })) 225 defer dataServer.Close() 226 227 client, err := mockClient(server, dataServer) 228 if err != nil { 229 t.Fatal(err) 230 } 231 for i, tc := range testCases { 232 currentTestIdx = i 233 t.Run(strconv.Itoa(i)+"/"+tc.Label, func(t *testing.T) { 234 res, err := client.LeaveRoom(tc.RoomID).Do() 235 if tc.Want.Error != nil { 236 if !reflect.DeepEqual(err, tc.Want.Error) { 237 t.Errorf("Error %v; want %v", err, tc.Want.Error) 238 } 239 } else { 240 if err != nil { 241 t.Error(err) 242 } 243 } 244 if tc.Want.Response != nil { 245 if !reflect.DeepEqual(res, tc.Want.Response) { 246 t.Errorf("Response %v; want %v", res, tc.Want.Response) 247 } 248 } 249 }) 250 } 251 } 252 253 func TestTestLeaveRoomWithContext(t *testing.T) { 254 server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 255 defer r.Body.Close() 256 time.Sleep(10 * time.Millisecond) 257 w.Write([]byte("{}")) 258 })) 259 defer server.Close() 260 261 dataServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 262 defer r.Body.Close() 263 t.Error("Unexpected data API call") 264 w.WriteHeader(404) 265 w.Write([]byte(`{"message":"Not found"}`)) 266 })) 267 defer dataServer.Close() 268 269 client, err := mockClient(server, dataServer) 270 if err != nil { 271 t.Fatal(err) 272 } 273 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Millisecond) 274 defer cancel() 275 _, err = client.LeaveRoom("cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx").WithContext(ctx).Do() 276 expectCtxDeadlineExceed(ctx, err, t) 277 } 278 279 func BenchmarkLeaveGroup(b *testing.B) { 280 server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 281 defer r.Body.Close() 282 w.Write([]byte("{}")) 283 })) 284 defer server.Close() 285 286 dataServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 287 defer r.Body.Close() 288 b.Error("Unexpected data API call") 289 w.WriteHeader(404) 290 w.Write([]byte(`{"message":"Not found"}`)) 291 })) 292 defer dataServer.Close() 293 294 client, err := mockClient(server, dataServer) 295 if err != nil { 296 b.Fatal(err) 297 } 298 b.ResetTimer() 299 for i := 0; i < b.N; i++ { 300 client.LeaveGroup("cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx").Do() 301 } 302 } 303 304 func BenchmarkLeaveRoom(b *testing.B) { 305 server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 306 defer r.Body.Close() 307 w.Write([]byte("{}")) 308 })) 309 defer server.Close() 310 311 dataServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 312 defer r.Body.Close() 313 b.Error("Unexpected data API call") 314 w.WriteHeader(404) 315 w.Write([]byte(`{"message":"Not found"}`)) 316 })) 317 defer dataServer.Close() 318 319 client, err := mockClient(server, dataServer) 320 if err != nil { 321 b.Fatal(err) 322 } 323 b.ResetTimer() 324 for i := 0; i < b.N; i++ { 325 client.LeaveRoom("cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx").Do() 326 } 327 }