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  }