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  }