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  }