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 }