github.com/line/line-bot-sdk-go/v7@v7.21.0/linebot/get_count_test.go (about) 1 // Copyright 2020 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 TestGetGroupMemberCount(t *testing.T) { 30 type want struct { 31 URLPath string 32 RequestBody []byte 33 Response *MemberCountResponse 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: "Group Member Count is 3", 45 GroupID: "cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 46 ResponseCode: 200, 47 Response: []byte(`{"count": 3}`), 48 Want: want{ 49 URLPath: fmt.Sprintf(APIEndpointGetGroupMemberCount, "cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"), 50 RequestBody: []byte(""), 51 Response: &MemberCountResponse{ 52 Count: 3, 53 }, 54 }, 55 }, 56 { 57 Label: "Internal server error", 58 GroupID: "cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 59 ResponseCode: 500, 60 Response: []byte("500 Internal server error"), 61 Want: want{ 62 URLPath: fmt.Sprintf(APIEndpointGetGroupMemberCount, "cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"), 63 RequestBody: []byte(""), 64 Error: &APIError{ 65 Code: 500, 66 }, 67 }, 68 }, 69 } 70 71 var currentTestIdx int 72 server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 73 defer r.Body.Close() 74 tc := testCases[currentTestIdx] 75 if r.Method != http.MethodGet { 76 t.Errorf("Method %s; want %s", r.Method, http.MethodGet) 77 } 78 if r.URL.Path != tc.Want.URLPath { 79 t.Errorf("URLPath %s; want %s", r.URL.Path, tc.Want.URLPath) 80 } 81 body, err := io.ReadAll(r.Body) 82 if err != nil { 83 t.Fatal(err) 84 } 85 if !reflect.DeepEqual(body, tc.Want.RequestBody) { 86 t.Errorf("RequestBody %s; want %s", body, tc.Want.RequestBody) 87 } 88 w.WriteHeader(tc.ResponseCode) 89 w.Write(tc.Response) 90 })) 91 defer server.Close() 92 93 dataServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 94 defer r.Body.Close() 95 t.Error("Unexpected Data API call") 96 w.WriteHeader(404) 97 w.Write([]byte(`{"message":"Not found"}`)) 98 })) 99 defer dataServer.Close() 100 101 client, err := mockClient(server, dataServer) 102 if err != nil { 103 t.Fatal(err) 104 } 105 for i, tc := range testCases { 106 currentTestIdx = i 107 t.Run(strconv.Itoa(i)+"/"+tc.Label, func(t *testing.T) { 108 res, err := client.GetGroupMemberCount(tc.GroupID).Do() 109 if tc.Want.Error != nil { 110 if !reflect.DeepEqual(err, tc.Want.Error) { 111 t.Errorf("Error %v; want %v", err, tc.Want.Error) 112 } 113 } else { 114 if err != nil { 115 t.Error(err) 116 } 117 } 118 if !reflect.DeepEqual(res, tc.Want.Response) { 119 t.Errorf("Response %v; want %v", res, tc.Want.Response) 120 } 121 }) 122 } 123 } 124 125 func TestGetGroupMemberCountWithContext(t *testing.T) { 126 server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 127 defer r.Body.Close() 128 time.Sleep(10 * time.Millisecond) 129 w.Write([]byte("{}")) 130 })) 131 defer server.Close() 132 133 dataServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 134 defer r.Body.Close() 135 t.Error("Unexpected Data API call") 136 w.WriteHeader(404) 137 w.Write([]byte(`{"message":"Not found"}`)) 138 })) 139 defer dataServer.Close() 140 141 client, err := mockClient(server, dataServer) 142 if err != nil { 143 t.Fatal(err) 144 } 145 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Millisecond) 146 defer cancel() 147 _, err = client.GetGroupMemberCount("cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx").WithContext(ctx).Do() 148 expectCtxDeadlineExceed(ctx, err, t) 149 } 150 151 func TestGetRoomMemberCount(t *testing.T) { 152 type want struct { 153 URLPath string 154 RequestBody []byte 155 Response *MemberCountResponse 156 Error error 157 } 158 testCases := []struct { 159 Label string 160 RoomID string 161 ResponseCode int 162 Response []byte 163 Want want 164 }{ 165 { 166 Label: "Room Member Count is 3", 167 RoomID: "cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 168 ResponseCode: 200, 169 Response: []byte(`{"count": 3}`), 170 Want: want{ 171 URLPath: fmt.Sprintf(APIEndpointGetRoomMemberCount, "cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"), 172 RequestBody: []byte(""), 173 Response: &MemberCountResponse{ 174 Count: 3, 175 }, 176 }, 177 }, 178 { 179 Label: "Internal server error", 180 RoomID: "cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 181 ResponseCode: 500, 182 Response: []byte("500 Internal server error"), 183 Want: want{ 184 URLPath: fmt.Sprintf(APIEndpointGetRoomMemberCount, "cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"), 185 RequestBody: []byte(""), 186 Error: &APIError{ 187 Code: 500, 188 }, 189 }, 190 }, 191 } 192 193 var currentTestIdx int 194 server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 195 defer r.Body.Close() 196 tc := testCases[currentTestIdx] 197 if r.Method != http.MethodGet { 198 t.Errorf("Method %s; want %s", r.Method, http.MethodGet) 199 } 200 if r.URL.Path != tc.Want.URLPath { 201 t.Errorf("URLPath %s; want %s", r.URL.Path, tc.Want.URLPath) 202 } 203 body, err := io.ReadAll(r.Body) 204 if err != nil { 205 t.Fatal(err) 206 } 207 if !reflect.DeepEqual(body, tc.Want.RequestBody) { 208 t.Errorf("RequestBody %s; want %s", body, tc.Want.RequestBody) 209 } 210 w.WriteHeader(tc.ResponseCode) 211 w.Write(tc.Response) 212 })) 213 defer server.Close() 214 215 dataServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 216 defer r.Body.Close() 217 t.Error("Unexpected Data API call") 218 w.WriteHeader(404) 219 w.Write([]byte(`{"message":"Not found"}`)) 220 })) 221 defer dataServer.Close() 222 223 client, err := mockClient(server, dataServer) 224 if err != nil { 225 t.Fatal(err) 226 } 227 for i, tc := range testCases { 228 currentTestIdx = i 229 t.Run(strconv.Itoa(i)+"/"+tc.Label, func(t *testing.T) { 230 res, err := client.GetRoomMemberCount(tc.RoomID).Do() 231 if tc.Want.Error != nil { 232 if !reflect.DeepEqual(err, tc.Want.Error) { 233 t.Errorf("Error %v; want %v", err, tc.Want.Error) 234 } 235 } else { 236 if err != nil { 237 t.Error(err) 238 } 239 } 240 if !reflect.DeepEqual(res, tc.Want.Response) { 241 t.Errorf("Response %v; want %v", res, tc.Want.Response) 242 } 243 }) 244 } 245 } 246 247 func TestGetRoomMemberCountWithContext(t *testing.T) { 248 server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 249 defer r.Body.Close() 250 time.Sleep(10 * time.Millisecond) 251 w.Write([]byte("{}")) 252 })) 253 defer server.Close() 254 255 dataServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 256 defer r.Body.Close() 257 t.Error("Unexpected Data API call") 258 w.WriteHeader(404) 259 w.Write([]byte(`{"message":"Not found"}`)) 260 })) 261 defer dataServer.Close() 262 263 client, err := mockClient(server, dataServer) 264 if err != nil { 265 t.Fatal(err) 266 } 267 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Millisecond) 268 defer cancel() 269 _, err = client.GetRoomMemberCount("cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx").WithContext(ctx).Do() 270 expectCtxDeadlineExceed(ctx, err, t) 271 }