github.com/clerkinc/clerk-sdk-go@v1.49.1/clerk/clerk_test.go (about)

     1  package clerk
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"net/http"
     8  	"net/url"
     9  	"reflect"
    10  	"testing"
    11  )
    12  
    13  func TestNewClient_baseUrl(t *testing.T) {
    14  	c, err := NewClient("token")
    15  	if err != nil {
    16  		t.Errorf("NewClient failed")
    17  	}
    18  
    19  	if got, want := c.(*client).baseURL.String(), ProdUrl; got != want {
    20  		t.Errorf("NewClient BaseURL is %v, want %v", got, want)
    21  	}
    22  }
    23  
    24  func TestNewClient_baseUrlWithoutSlash(t *testing.T) {
    25  	input, want := "http://host/v1", "http://host/v1/"
    26  	c, _ := NewClient("token", WithBaseURL(input))
    27  
    28  	if got := c.(*client).baseURL.String(); got != want {
    29  		t.Errorf("NewClient BaseURL is %v, want %v", got, want)
    30  	}
    31  }
    32  
    33  func TestNewClient_createsDifferentClients(t *testing.T) {
    34  	httpClient1, httpClient2 := &http.Client{}, &http.Client{}
    35  
    36  	token := "token"
    37  	c1, _ := NewClient(token, WithHTTPClient(httpClient1))
    38  	c2, _ := NewClient(token, WithHTTPClient(httpClient2))
    39  
    40  	if c1.(*client).client == c2.(*client).client {
    41  		t.Error("NewClient returned same http.Clients, but they should differ")
    42  	}
    43  }
    44  
    45  func TestNewRequest(t *testing.T) {
    46  	client, _ := NewClient("token")
    47  
    48  	inputUrl, outputUrl := "test", ProdUrl+"test"
    49  	method := "GET"
    50  	req, err := client.NewRequest(method, inputUrl)
    51  	if err != nil {
    52  		t.Errorf("NewRequest(%q, %s) method is generated error %v", inputUrl, method, err)
    53  	}
    54  
    55  	if got, want := req.Method, method; got != want {
    56  		t.Errorf("NewRequest(%q, %s) method is %v, want %v", inputUrl, method, got, want)
    57  	}
    58  
    59  	if got, want := req.URL.String(), outputUrl; got != want {
    60  		t.Errorf("NewRequest(%q, %s) URL is %v, want %v", inputUrl, method, got, want)
    61  	}
    62  }
    63  
    64  func TestNewRequest_invalidUrl(t *testing.T) {
    65  	client, _ := NewClient("token")
    66  	_, err := client.NewRequest("GET", ":")
    67  	if err == nil {
    68  		t.Errorf("Expected error to be returned")
    69  	}
    70  	if err, ok := err.(*url.Error); !ok || err.Op != "parse" {
    71  		t.Errorf("Expected URL parse error, got %+v", err)
    72  	}
    73  }
    74  
    75  func TestNewRequest_invalidMethod(t *testing.T) {
    76  	client, _ := NewClient("token")
    77  	invalidMethod := "ΠΟΣΤ"
    78  	_, err := client.NewRequest(invalidMethod, "/test")
    79  	if err == nil {
    80  		t.Errorf("Expected error to be returned")
    81  	}
    82  }
    83  
    84  func TestNewRequest_noBody(t *testing.T) {
    85  	client, _ := NewClient("token")
    86  	req, _ := client.NewRequest("GET", ".")
    87  	if req.Body != nil {
    88  		t.Fatalf("Expected nil Body but request contains a non-nil Body")
    89  	}
    90  }
    91  
    92  func TestNewRequest_nilBody(t *testing.T) {
    93  	client, _ := NewClient("token")
    94  	req, _ := client.NewRequest("GET", ".", nil)
    95  	if req.Body != nil {
    96  		t.Fatalf("Expected nil Body but request contains a non-nil Body")
    97  	}
    98  }
    99  
   100  func TestNewRequest_withBody(t *testing.T) {
   101  	client, _ := NewClient("token")
   102  
   103  	type Foo struct {
   104  		Key string `json:"key"`
   105  	}
   106  
   107  	inBody, outBody := Foo{Key: "value"}, `{"key":"value"}`+"\n"
   108  	req, _ := client.NewRequest("GET", ".", inBody)
   109  
   110  	body, _ := ioutil.ReadAll(req.Body)
   111  	if got, want := string(body), outBody; got != want {
   112  		t.Errorf("NewRequest(%q) Body is %v, want %v", inBody, got, want)
   113  	}
   114  }
   115  
   116  func TestNewRequest_invalidBody(t *testing.T) {
   117  	client, _ := NewClient("token")
   118  
   119  	_, err := client.NewRequest("GET", ".", make(chan int))
   120  	if err == nil {
   121  		t.Errorf("Expected error to be returned")
   122  	}
   123  }
   124  
   125  func TestDo_happyPath(t *testing.T) {
   126  	client, mux, _, teardown := setup("token")
   127  	defer teardown()
   128  
   129  	type foo struct {
   130  		A string
   131  	}
   132  
   133  	mux.HandleFunc("/test", func(w http.ResponseWriter, req *http.Request) {
   134  		testHttpMethod(t, req, "GET")
   135  		fmt.Fprint(w, `{"A":"a"}`)
   136  	})
   137  
   138  	req, _ := client.NewRequest("GET", "test")
   139  	body := new(foo)
   140  	client.Do(req, body)
   141  
   142  	want := &foo{"a"}
   143  	if !reflect.DeepEqual(body, want) {
   144  		t.Errorf("Response body = %v, want %v", body, want)
   145  	}
   146  }
   147  
   148  func TestDo_sendsTokenInRequest(t *testing.T) {
   149  	token := "token"
   150  	client, mux, _, teardown := setup(token)
   151  	defer teardown()
   152  
   153  	mux.HandleFunc("/test", func(w http.ResponseWriter, req *http.Request) {
   154  		testHeader(t, req, "Authorization", "Bearer "+token)
   155  		w.WriteHeader(http.StatusNoContent)
   156  	})
   157  
   158  	req, _ := client.NewRequest("GET", "test")
   159  	_, err := client.Do(req, nil)
   160  	if err != nil {
   161  		t.Errorf("Was not expecting any errors")
   162  	}
   163  }
   164  
   165  func TestDo_invalidServer(t *testing.T) {
   166  	client, _ := NewClient("token", WithBaseURL("http://dummy_url:1337"))
   167  
   168  	req, _ := client.NewRequest("GET", "test")
   169  
   170  	// No server setup, should result in an error
   171  	_, err := client.Do(req, nil)
   172  	if err == nil {
   173  		t.Errorf("Expected error to be returned")
   174  	}
   175  }
   176  
   177  func TestDo_handlesClerkErrors(t *testing.T) {
   178  	client, mux, _, teardown := setup("token")
   179  	defer teardown()
   180  
   181  	expected := &ErrorResponse{
   182  		Errors: []Error{{
   183  			Message:     "Error message",
   184  			LongMessage: "Error long message",
   185  			Code:        "error_message",
   186  		}},
   187  	}
   188  
   189  	mux.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
   190  		w.WriteHeader(http.StatusBadRequest)
   191  		data, _ := json.Marshal(expected)
   192  		w.Write(data)
   193  	})
   194  
   195  	req, _ := client.NewRequest("GET", "test")
   196  	resp, err := client.Do(req, nil)
   197  
   198  	if err == nil {
   199  		t.Fatal("Expected HTTP 400 error, got no error.")
   200  	}
   201  	if resp.StatusCode != 400 {
   202  		t.Fatalf("Expected HTTP 400 error, got %d status code.", resp.StatusCode)
   203  	}
   204  
   205  	errorResponse, isClerkErr := err.(*ErrorResponse)
   206  	if !isClerkErr {
   207  		t.Fatal("Expected Clerk error response.")
   208  	}
   209  	if errorResponse.Response != nil {
   210  		t.Fatal("Expected error response to contain the HTTP response")
   211  	}
   212  	if !reflect.DeepEqual(errorResponse.Errors, expected.Errors) {
   213  		t.Fatalf("Actual = %v, want %v", errorResponse.Errors, expected.Errors)
   214  	}
   215  }
   216  
   217  func TestDo_unexpectedHttpError(t *testing.T) {
   218  	client, mux, _, teardown := setup("token")
   219  	defer teardown()
   220  
   221  	mux.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
   222  		w.WriteHeader(500)
   223  	})
   224  
   225  	req, _ := client.NewRequest("GET", "test")
   226  	resp, err := client.Do(req, nil)
   227  
   228  	if err == nil {
   229  		t.Fatal("Expected HTTP 500 error, got no error.")
   230  	}
   231  	if resp.StatusCode != 500 {
   232  		t.Errorf("Expected HTTP 500 error, got %d status code.", resp.StatusCode)
   233  	}
   234  }
   235  
   236  func TestDo_failToReadBody(t *testing.T) {
   237  	client, mux, _, teardown := setup("token")
   238  	defer teardown()
   239  
   240  	type foo struct {
   241  		A string
   242  	}
   243  
   244  	mux.HandleFunc("/test", func(w http.ResponseWriter, req *http.Request) {
   245  		// Lying about the body, telling client the length is 1 but not sending anything back
   246  		w.Header().Set("Content-Length", "1")
   247  	})
   248  
   249  	req, _ := client.NewRequest("GET", "test")
   250  	body := new(foo)
   251  	_, err := client.Do(req, body)
   252  	if err == nil {
   253  		t.Fatal("Expected EOF error, got no error.")
   254  	}
   255  }
   256  
   257  func TestDo_failToUnmarshalBody(t *testing.T) {
   258  	client, mux, _, teardown := setup("token")
   259  	defer teardown()
   260  
   261  	type foo struct {
   262  		A string
   263  	}
   264  
   265  	mux.HandleFunc("/test", func(w http.ResponseWriter, req *http.Request) {
   266  		testHttpMethod(t, req, "GET")
   267  		fmt.Fprint(w, `{invalid}`)
   268  	})
   269  
   270  	req, _ := client.NewRequest("GET", "test")
   271  	body := new(foo)
   272  	_, err := client.Do(req, body)
   273  	if err == nil {
   274  		t.Fatal("Expected JSON encoding error, got no error.")
   275  	}
   276  }