github.com/deis/deis@v1.13.5-0.20170519182049-1d9e59fbdbfc/client/controller/models/auth/auth_test.go (about) 1 package auth 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "net/http" 7 "net/http/httptest" 8 "net/url" 9 "reflect" 10 "testing" 11 12 "github.com/deis/deis/client/controller/client" 13 "github.com/deis/deis/version" 14 ) 15 16 const registerExpected string = `{"username":"test","password":"opensesame","email":"test@example.com"}` 17 const loginExpected string = `{"username":"test","password":"opensesame"}` 18 const passwdExpected string = `{"username":"test","password":"old","new_password":"new"}` 19 const regenAllExpected string = `{"all":true}` 20 const regenUserExpected string = `{"username":"test"}` 21 const cancelUserExpected string = `{"username":"foo"}` 22 const cancelAdminExpected string = `{"username":"admin"}` 23 24 type fakeHTTPServer struct { 25 regenBodyEmpty bool 26 regenBodyAll bool 27 regenBodyUsername bool 28 cancelEmpty bool 29 cancelUsername bool 30 } 31 32 func (f *fakeHTTPServer) ServeHTTP(res http.ResponseWriter, req *http.Request) { 33 res.Header().Add("DEIS_API_VERSION", version.APIVersion) 34 35 if req.URL.Path == "/v1/auth/register/" && req.Method == "POST" { 36 body, err := ioutil.ReadAll(req.Body) 37 38 if err != nil { 39 fmt.Println(err) 40 res.WriteHeader(http.StatusInternalServerError) 41 res.Write(nil) 42 } 43 44 if string(body) != registerExpected { 45 fmt.Printf("Expected '%s', Got '%s'\n", registerExpected, body) 46 res.WriteHeader(http.StatusInternalServerError) 47 res.Write(nil) 48 return 49 } 50 51 res.WriteHeader(http.StatusCreated) 52 res.Write(nil) 53 return 54 } 55 56 if req.URL.Path == "/v1/auth/login/" && req.Method == "POST" { 57 body, err := ioutil.ReadAll(req.Body) 58 59 if err != nil { 60 fmt.Println(err) 61 res.WriteHeader(http.StatusInternalServerError) 62 res.Write(nil) 63 return 64 } 65 66 if string(body) != loginExpected { 67 fmt.Printf("Expected '%s', Got '%s'\n", loginExpected, body) 68 res.WriteHeader(http.StatusInternalServerError) 69 res.Write(nil) 70 return 71 } 72 73 res.Write([]byte(`{"token":"abc"}`)) 74 return 75 } 76 77 if req.URL.Path == "/v1/auth/passwd/" && req.Method == "POST" { 78 body, err := ioutil.ReadAll(req.Body) 79 80 if err != nil { 81 fmt.Println(err) 82 res.WriteHeader(http.StatusInternalServerError) 83 res.Write(nil) 84 } 85 86 if string(body) != passwdExpected { 87 fmt.Printf("Expected '%s', Got '%s'\n", passwdExpected, body) 88 res.WriteHeader(http.StatusInternalServerError) 89 res.Write(nil) 90 return 91 } 92 93 res.Write(nil) 94 res.WriteHeader(http.StatusInternalServerError) 95 return 96 } 97 98 if req.URL.Path == "/v1/auth/tokens/" && req.Method == "POST" { 99 body, err := ioutil.ReadAll(req.Body) 100 101 if err != nil { 102 fmt.Println(err) 103 res.WriteHeader(http.StatusInternalServerError) 104 res.Write(nil) 105 } 106 107 if string(body) == regenAllExpected && !f.regenBodyAll { 108 f.regenBodyAll = true 109 res.Write(nil) 110 return 111 } else if string(body) == regenUserExpected && !f.regenBodyUsername { 112 f.regenBodyUsername = true 113 res.Write([]byte(`{"token":"123"}`)) 114 return 115 } else if string(body) == "" && !f.regenBodyEmpty { 116 f.regenBodyEmpty = true 117 res.Write([]byte(`{"token":"abc"}`)) 118 return 119 } 120 121 fmt.Printf("%s is not a valid body.", body) 122 res.WriteHeader(http.StatusInternalServerError) 123 res.Write(nil) 124 return 125 } 126 127 if req.URL.Path == "/v1/auth/cancel/" && req.Method == "DELETE" { 128 body, err := ioutil.ReadAll(req.Body) 129 130 if err != nil { 131 fmt.Println(err) 132 res.WriteHeader(http.StatusInternalServerError) 133 res.Write(nil) 134 } 135 136 if string(body) == cancelAdminExpected && !f.cancelUsername { 137 f.cancelUsername = true 138 res.WriteHeader(http.StatusConflict) 139 res.Write(nil) 140 return 141 } else if string(body) == cancelUserExpected && !f.cancelUsername { 142 f.cancelUsername = true 143 res.WriteHeader(http.StatusNoContent) 144 res.Write(nil) 145 return 146 } else if string(body) == "" && !f.cancelEmpty { 147 f.cancelEmpty = true 148 res.WriteHeader(http.StatusNoContent) 149 res.Write(nil) 150 return 151 } 152 153 fmt.Printf("%s is not a valid body.", body) 154 res.WriteHeader(http.StatusInternalServerError) 155 res.Write(nil) 156 return 157 } 158 159 fmt.Printf("Unrecognized URL %s\n", req.URL) 160 res.WriteHeader(http.StatusNotFound) 161 res.Write(nil) 162 } 163 164 func TestRegister(t *testing.T) { 165 t.Parallel() 166 167 handler := fakeHTTPServer{} 168 server := httptest.NewServer(&handler) 169 defer server.Close() 170 171 u, err := url.Parse(server.URL) 172 173 if err != nil { 174 t.Fatal(err) 175 } 176 177 httpClient := client.CreateHTTPClient(false) 178 179 client := client.Client{HTTPClient: httpClient, ControllerURL: *u} 180 181 if err = Register(&client, "test", "opensesame", "test@example.com"); err != nil { 182 t.Error(err) 183 } 184 } 185 186 func TestLogin(t *testing.T) { 187 t.Parallel() 188 189 handler := fakeHTTPServer{} 190 server := httptest.NewServer(&handler) 191 defer server.Close() 192 193 u, err := url.Parse(server.URL) 194 195 if err != nil { 196 t.Fatal(err) 197 } 198 199 httpClient := client.CreateHTTPClient(false) 200 client := client.Client{HTTPClient: httpClient, ControllerURL: *u} 201 202 actual, err := Login(&client, "test", "opensesame") 203 204 if err != nil { 205 t.Error(err) 206 } 207 208 expected := "abc" 209 210 if actual != expected { 211 t.Errorf("Expected %s, Got %s", expected, actual) 212 } 213 } 214 215 func TestPasswd(t *testing.T) { 216 t.Parallel() 217 218 handler := fakeHTTPServer{} 219 server := httptest.NewServer(&handler) 220 defer server.Close() 221 222 u, err := url.Parse(server.URL) 223 224 if err != nil { 225 t.Fatal(err) 226 } 227 228 httpClient := client.CreateHTTPClient(false) 229 client := client.Client{HTTPClient: httpClient, ControllerURL: *u} 230 231 if err := Passwd(&client, "test", "old", "new"); err != nil { 232 t.Error(err) 233 } 234 } 235 236 func TestDelete(t *testing.T) { 237 t.Parallel() 238 239 handler := fakeHTTPServer{cancelUsername: false, cancelEmpty: false} 240 server := httptest.NewServer(&handler) 241 defer server.Close() 242 243 u, err := url.Parse(server.URL) 244 245 if err != nil { 246 t.Fatal(err) 247 } 248 249 httpClient := client.CreateHTTPClient(false) 250 client := client.Client{HTTPClient: httpClient, ControllerURL: *u} 251 252 if err := Delete(&client, "foo"); err != nil { 253 t.Error(err) 254 } 255 256 if err := Delete(&client, ""); err != nil { 257 t.Error(err) 258 } 259 } 260 261 func TestDeleteUserApp(t *testing.T) { 262 t.Parallel() 263 264 handler := fakeHTTPServer{cancelUsername: false, cancelEmpty: false} 265 server := httptest.NewServer(&handler) 266 defer server.Close() 267 268 u, err := url.Parse(server.URL) 269 270 if err != nil { 271 t.Fatal(err) 272 } 273 274 httpClient := client.CreateHTTPClient(false) 275 client := client.Client{HTTPClient: httpClient, ControllerURL: *u} 276 277 err = Delete(&client, "admin") 278 // should be a 409 Conflict 279 280 expected := fmt.Errorf("\n%s %s\n\n", "409", "Conflict") 281 if reflect.DeepEqual(err, expected) == false { 282 t.Errorf("got '%s' but expected '%s'", err, expected) 283 } 284 } 285 286 func TestRegenerate(t *testing.T) { 287 t.Parallel() 288 289 handler := fakeHTTPServer{} 290 server := httptest.NewServer(&handler) 291 defer server.Close() 292 293 u, err := url.Parse(server.URL) 294 295 if err != nil { 296 t.Fatal(err) 297 } 298 299 httpClient := client.CreateHTTPClient(false) 300 client := client.Client{HTTPClient: httpClient, ControllerURL: *u} 301 302 token, err := Regenerate(&client, "", true) 303 304 if err != nil { 305 t.Error(err) 306 } 307 308 if token != "" { 309 t.Errorf("Expected token be empty, Got %s", token) 310 } 311 312 token, err = Regenerate(&client, "test", false) 313 314 if err != nil { 315 t.Error(err) 316 } 317 318 expected := "123" 319 if token != expected { 320 t.Errorf("Expected %s, Got %s", expected, token) 321 } 322 323 token, err = Regenerate(&client, "", false) 324 325 if err != nil { 326 t.Error(err) 327 } 328 329 expected = "abc" 330 if token != expected { 331 t.Errorf("Expected %s, Got %s", expected, token) 332 } 333 }